[{"data":1,"prerenderedAt":21206},["ShallowReactive",2],{"search-sections":3,"posts-list":5818},[4,10,16,21,26,31,36,41,46,51,57,62,67,72,77,82,87,92,96,99,102,105,110,114,118,123,128,133,138,142,147,152,157,162,166,171,176,181,185,189,194,199,204,209,214,219,224,229,234,239,244,249,254,259,264,269,274,279,284,288,293,298,303,308,313,318,323,328,333,338,343,348,353,358,363,368,373,378,383,388,392,397,401,406,410,414,419,424,429,433,437,441,446,450,455,459,464,468,472,476,480,484,488,492,497,501,506,510,514,518,523,527,531,535,539,543,547,551,555,559,563,567,571,575,579,583,587,591,595,599,603,607,611,615,619,623,627,631,635,639,643,647,651,655,659,663,667,671,675,679,683,687,691,695,699,703,707,711,715,719,723,727,731,735,739,743,747,751,755,759,763,767,771,775,778,783,787,791,795,799,804,809,814,818,823,828,833,838,843,848,853,858,863,868,873,878,883,888,892,897,902,906,911,915,920,924,929,934,939,944,949,954,959,964,969,974,979,984,988,992,996,1000,1004,1009,1014,1019,1023,1028,1032,1037,1042,1047,1052,1056,1060,1065,1070,1075,1080,1085,1090,1095,1100,1105,1109,1114,1118,1121,1126,1131,1136,1141,1146,1151,1156,1161,1166,1171,1176,1181,1186,1191,1196,1201,1206,1211,1215,1220,1225,1230,1235,1240,1245,1249,1254,1259,1263,1267,1272,1277,1282,1286,1290,1295,1300,1305,1310,1315,1320,1325,1330,1335,1340,1345,1350,1355,1360,1364,1369,1374,1379,1384,1389,1393,1398,1402,1407,1411,1415,1419,1424,1429,1434,1439,1444,1449,1453,1458,1463,1468,1473,1478,1483,1487,1492,1497,1502,1507,1511,1516,1521,1526,1531,1535,1540,1545,1550,1555,1560,1565,1570,1575,1580,1585,1590,1595,1600,1603,1607,1612,1617,1622,1627,1632,1637,1642,1647,1652,1657,1660,1663,1666,1669,1672,1675,1679,1684,1688,1693,1698,1702,1707,1712,1717,1722,1727,1731,1736,1741,1746,1751,1756,1761,1766,1771,1776,1781,1786,1791,1796,1801,1806,1810,1815,1820,1825,1830,1835,1838,1841,1844,1847,1850,1854,1859,1864,1869,1874,1879,1884,1889,1894,1899,1904,1909,1914,1919,1924,1929,1934,1939,1944,1948,1953,1957,1962,1966,1970,1974,1979,1983,1988,1993,1998,2003,2008,2013,2018,2022,2027,2032,2037,2042,2047,2052,2056,2060,2063,2068,2073,2078,2083,2088,2093,2098,2103,2108,2113,2118,2123,2128,2133,2138,2143,2147,2152,2157,2162,2167,2172,2177,2181,2186,2191,2196,2201,2205,2210,2215,2220,2225,2230,2235,2239,2244,2249,2254,2259,2264,2269,2274,2278,2283,2288,2293,2298,2303,2308,2313,2318,2322,2327,2331,2335,2340,2345,2349,2354,2358,2363,2367,2371,2375,2380,2384,2389,2394,2399,2404,2409,2414,2419,2424,2429,2434,2438,2443,2448,2453,2458,2463,2468,2473,2478,2482,2487,2492,2496,2501,2505,2510,2514,2519,2524,2529,2534,2539,2544,2549,2554,2558,2563,2567,2571,2576,2581,2584,2588,2593,2597,2602,2607,2612,2616,2621,2626,2630,2634,2638,2641,2645,2649,2653,2656,2661,2665,2670,2675,2680,2685,2690,2695,2700,2705,2710,2715,2720,2724,2729,2734,2739,2744,2749,2753,2758,2763,2768,2773,2778,2783,2788,2793,2798,2803,2808,2813,2818,2823,2827,2832,2837,2842,2847,2852,2857,2862,2867,2872,2877,2882,2887,2892,2897,2902,2907,2912,2917,2922,2927,2932,2936,2941,2945,2949,2953,2958,2963,2968,2973,2978,2983,2987,2992,2997,3001,3006,3011,3015,3019,3024,3029,3033,3037,3041,3046,3050,3055,3060,3065,3070,3075,3079,3084,3089,3094,3099,3104,3109,3113,3116,3121,3126,3131,3136,3141,3146,3151,3156,3160,3165,3170,3175,3180,3185,3190,3195,3200,3205,3210,3215,3220,3225,3230,3235,3240,3245,3250,3255,3260,3265,3270,3275,3280,3285,3290,3295,3300,3305,3310,3315,3320,3325,3330,3335,3340,3345,3350,3355,3360,3365,3370,3375,3380,3385,3390,3395,3400,3405,3410,3415,3420,3425,3430,3435,3440,3445,3450,3455,3460,3465,3470,3475,3480,3485,3490,3495,3500,3505,3510,3515,3520,3524,3529,3534,3539,3544,3549,3554,3559,3564,3569,3574,3579,3584,3589,3594,3599,3604,3609,3614,3619,3624,3629,3634,3639,3644,3649,3654,3659,3664,3669,3674,3679,3684,3689,3694,3699,3704,3709,3714,3719,3724,3729,3734,3739,3744,3749,3754,3759,3764,3769,3774,3779,3784,3789,3794,3799,3804,3809,3814,3819,3824,3829,3834,3839,3844,3849,3854,3859,3864,3869,3874,3879,3884,3889,3894,3899,3904,3909,3914,3919,3924,3929,3934,3939,3944,3949,3954,3959,3964,3969,3974,3979,3984,3989,3994,3999,4004,4009,4014,4019,4024,4029,4034,4039,4044,4049,4054,4059,4064,4069,4074,4079,4084,4089,4094,4099,4104,4109,4114,4119,4124,4129,4134,4139,4144,4149,4154,4159,4164,4169,4174,4179,4184,4189,4194,4199,4204,4209,4214,4219,4224,4229,4234,4239,4244,4249,4254,4259,4264,4269,4274,4279,4284,4289,4294,4299,4304,4309,4314,4319,4324,4329,4334,4339,4344,4349,4354,4359,4364,4369,4374,4379,4384,4389,4394,4399,4404,4409,4414,4418,4423,4428,4433,4438,4443,4448,4453,4458,4463,4468,4473,4477,4482,4487,4492,4497,4502,4507,4512,4517,4522,4527,4532,4537,4542,4547,4552,4557,4562,4567,4572,4577,4582,4587,4592,4597,4602,4607,4612,4617,4622,4627,4632,4637,4642,4647,4652,4657,4662,4666,4671,4676,4681,4686,4691,4696,4701,4706,4710,4714,4719,4724,4729,4734,4739,4744,4749,4754,4759,4764,4769,4773,4778,4783,4788,4793,4798,4803,4808,4813,4818,4823,4828,4833,4838,4843,4848,4853,4858,4863,4868,4873,4878,4883,4888,4893,4898,4903,4908,4913,4918,4923,4928,4933,4938,4943,4948,4953,4956,4961,4966,4971,4976,4981,4986,4991,4996,5001,5006,5011,5016,5021,5026,5031,5036,5041,5045,5050,5055,5060,5065,5070,5075,5080,5085,5090,5095,5100,5105,5110,5114,5119,5124,5129,5134,5139,5143,5147,5152,5157,5162,5167,5172,5176,5180,5184,5189,5194,5199,5204,5208,5213,5218,5223,5228,5233,5238,5243,5248,5253,5258,5263,5268,5273,5278,5283,5288,5293,5298,5303,5308,5313,5318,5322,5327,5332,5337,5342,5347,5352,5357,5362,5367,5372,5377,5382,5387,5391,5396,5401,5406,5411,5416,5421,5426,5431,5435,5440,5445,5450,5455,5460,5465,5470,5475,5479,5484,5489,5494,5499,5504,5508,5513,5518,5523,5527,5531,5535,5539,5543,5547,5551,5555,5560,5565,5570,5575,5579,5584,5589,5594,5598,5603,5607,5611,5616,5621,5625,5629,5633,5638,5643,5648,5653,5658,5663,5668,5672,5677,5682,5687,5692,5697,5702,5707,5712,5717,5722,5727,5731,5736,5741,5745,5750,5755,5760,5765,5770,5775,5780,5785,5790,5795,5800,5803,5808,5813],{"id":5,"title":6,"titles":7,"content":8,"level":9},"\u002F59-bacon","59_Bacon",[],"This is where Beth and I live in Waltham, MA.",1,{"id":11,"title":12,"titles":13,"content":14,"level":15},"\u002F59-bacon#waltham-websites","Waltham Websites",[6],"http:\u002F\u002Fwww.discoverwaltham.com\u002FLandmark Embassy Cinema - 0.8 Miles awayWaltham area theatres (showtimes)",2,{"id":17,"title":18,"titles":19,"content":20,"level":15},"\u002F59-bacon#aerial-view","Aerial view",[6],"Here is the path from Openratings to my house. Maps are thanks to http:\u002F\u002Fwww.state.ma.us\u002Fmgis\u002Fmapping.htm, the Massachusetts Geographic Information System. Annotations may be added later. http:\u002F\u002Fthelackthereof.org\u002Fdocs\u002Fgimpart\u002Fwaltham\u002FWaltham%20City.jpg\nWaltham City http:\u002F\u002Fthelackthereof.org\u002Fdocs\u002Fgimpart\u002Fwaltham\u002F00%20-%20Openratings%20Building.jpghttp:\u002F\u002FOpenratings.com\u002F Building http:\u002F\u002Fthelackthereof.org\u002Fdocs\u002Fgimpart\u002Fwaltham\u002F01%20-%20Openratings%20Neighborhood.jpg\nZoom out to the http:\u002F\u002Fopenratings.com\u002F neighborhood http:\u002F\u002Fthelackthereof.org\u002Fdocs\u002Fgimpart\u002Fwaltham\u002F02%20-%20Freeway%20exit.jpg\nEast (right) of that, the freeway exit. http:\u002F\u002Fthelackthereof.org\u002Fdocs\u002Fgimpart\u002Fwaltham\u002F03%20-%20Intersection%20of%20Pond%20road%20and%20Lexington.jpg\nEast (right) of that, the intersection of Tatem Pond (east-west) with Lexington (north-south) http:\u002F\u002Fthelackthereof.org\u002Fdocs\u002Fgimpart\u002Fwaltham\u002F04%20-%20Lexington%20and%20Bacon%20(or%20what%20turns%20into%20Bacon).jpg\nSouth (down) of that, Lexington (big road) branches to Bacon (going down the middle) http:\u002F\u002Fthelackthereof.org\u002Fdocs\u002Fgimpart\u002Fwaltham\u002F05%20-%2059Bacon%20Neighborhood.jpg\nSouth (down) of that, more of Bacon http:\u002F\u002Fthelackthereof.org\u002Fdocs\u002Fgimpart\u002Fwaltham\u002F06%20-%20Blocks%20surrounding%2059Bacon,%20and%20distance%20to%20Main%20St.jpg\nSouth (down) of that, our neighborhood. You can also see the 20, which is Main Street http:\u002F\u002Fthelackthereof.org\u002Fdocs\u002Fgimpart\u002Fwaltham\u002F07%20-%20Just%20the%20block%20of%2059Bacon.jpg\nZoomed in on our block more. Our house is one block north of Main street, on Bacon. http:\u002F\u002Fthelackthereof.org\u002Fdocs\u002Fgimpart\u002Fwaltham\u002F08%20-%2059Bacon%20(on%20the%20main%20intersection,%20south-east%20corner).jpg\nThe final zoom of our house. It is on the south-east corner of that main intersection.",{"id":22,"title":23,"titles":24,"content":25,"level":9},"\u002Fa-few-of-my-favorite-things","A_Few_of_my_Favorite_Things",[],"In no particular order, these are a few of my favorite things! BethPerlProgrammingOCamlCSSIon Window ManagerLinuxCoconut The RabbitArcanejillGenetic ProgrammingComputer SciencePlaying the HarmonicaGoWikisWikipediaGoogle SearchPhilosophyMathematicsLogicDeviant LogicReadingSherlock HolmesCoffee ShopsThe InternetDaniel C. DennettClever HacksMagic TricksMathematical PuzzlesLittle KidsConspiracy TheoriesPet ParrotsTalk Like a Pirate DayPi DayPhilosophical TaoismPhiScienceScience FictionContinuationsAbstractionMaking FriendsLearning new ConceptsWhiteboards and ChalkboardsNerd ClubsDancingRegexes",{"id":27,"title":28,"titles":29,"content":30,"level":9},"\u002Facm-turing-award-and-the-lag-of-innovation","ACM_Turing_Award_and_the_Lag_of_Innovation",[],"2005  Naur, Peter 2004 Cerf, Vinton G.\n2004 Kahn, Robert E. 2003 Kay, Alan 2002 Adleman, Leonard M.\n2002 Rivest, Ronald L.\n2002 Shamir, Adi 2001 Dahl, Ole-Johan\n2001 Nygaard, Kristen 2000 Yao, Andrew Chi-Chih 1999 Brooks, Frederick P. 1998 Gray, James 1997 Engelbart, Douglas 1996 Pnueli, Amir 1995 Blum, Manuel 1994 Feigenbaum, Edward\n1994 Reddy, Raj 1993 Hartmanis, Juris\n1993 Stearns, Richard E. 1992 Lampson, Butler W. 1991 Milner, Robin 1990 Corbato, Fernando J. 1989 Kahan, William (Velvel) 1988 Sutherland, Ivan 1987 Cocke, John 1986 Hopcroft, John\n1986 Tarjan, Robert 1985 Karp, Richard M. 1984 Wirth, Niklaus 1983 Ritchie, Dennis M.\n1983 Thompson, Ken 1982 Cook, Stephen A. 1981 Codd, Edgar F. 1980 Hoare, C. Antony R. 1979 Iverson, Kenneth E. 1978 Floyd, Robert W. 1977 Backus, John 1976 Rabin, Michael O.\n1976 Scott, Dana S. 1975 Newell, Allen\n1975 Simon, Herbert A. 1974 Knuth, Donald E. 1973 Bachman, Charles W. 1972 Dijkstra, E. W. 1971 McCarthy, John 1970 Wilkinson, J. H. 1969 Minsky, Marvin 1968 Hamming, Richard 1967 Wilkes, Maurice V (1949) 1966 Perlis, A. J. (1960)",{"id":32,"title":33,"titles":34,"content":35,"level":9},"\u002Fabout","About",[],"This is the website and wiki of me, Brock Wilcox a.k.a. awwaiid. Please see the Home page if you would like a less philosophical introduction to this site. Otherwise, read on! I love living in the future -- we have so many neat things. One of my favorites is the internet. For me the internet is a powerful communication tool, and this website is one of the ways I utilize the internet to communicate. By placing my thoughts, papers, and projects on this site for the world to view I hope to communicate a little about myself to whomever is interested in knowing me. Two-way communication is very important. One reason I do not like television is its one-way-ness. Part of this certainly comes down to choice. Even with a thousand channels I still am limited to what they happen to be playing at the moment (for the most part). I can't imagine going to a library and being told that there are 1000 books to choose from and that I must read them right then and that they may not be there again if I were to return. Choice of what communications I receive is not the only issue with simplex (one-way) channels, however. I also want to have a voice of my own, even if it is only one among many.",{"id":37,"title":38,"titles":39,"content":40,"level":9},"\u002Fabstract-algebra-notes","Abstract_Algebra_Notes",[],"MAT412 - 2004.04.03",{"id":42,"title":43,"titles":44,"content":45,"level":9},"\u002Fan-introduction-to-programming-via-perl","An_Introduction_to_Programming_via_Perl",[],"",{"id":47,"title":48,"titles":49,"content":50,"level":15},"\u002Fan-introduction-to-programming-via-perl#introduction","Introduction",[43],"The first programming language I ever learned was 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. 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.",{"id":52,"title":53,"titles":54,"content":55,"level":56},"\u002Fan-introduction-to-programming-via-perl#some-issues-confronting-beginners","Some Issues Confronting Beginners",[43,48],"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. 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. There are solutions, however. Pre-packaged, easy-to-install languages. Web-based interfaces so that there is not even an installation step. Perhaps a knoppix-like CD which boots right into a programming prompt. Or all three! ... to be continued! ...",3,{"id":58,"title":59,"titles":60,"content":61,"level":15},"\u002Fan-introduction-to-programming-via-perl#getting-set-up","Getting Set Up",[43],"Things you'll need: A text editor (wordpad for example)Perl",{"id":63,"title":64,"titles":65,"content":66,"level":15},"\u002Fan-introduction-to-programming-via-perl#lessons","Lessons",[43],"Lesson 00 - PhilosophyLesson 01 - PrintingLesson 02 - VariablesLesson 03 - InputLesson 04 - MathLesson 05 - IF THEN ELSElists of thingswhile loop... lesson N - Genie in a bottle",{"id":68,"title":69,"titles":70,"content":71,"level":9},"\u002Fanyevent","AnyEvent",[],"These are some notes on AnyEvent, hopefully handy for putting together conference presentations or other articles. \"the DBI of event loop programming\" \"EV, Event, Glib, Tk, Perl, Event::Lib, Irssi, rxvt-unicode, IO::Async, Qt and POE are various supported event loops\u002Fenvironments.\" CPAN: cpan:AnyEvent",{"id":73,"title":74,"titles":75,"content":76,"level":15},"\u002Fanyevent#history","History",[69],"How did AE come about?",{"id":78,"title":79,"titles":80,"content":81,"level":15},"\u002Fanyevent#technology","Technology",[69],"The killer combo -- libev + Coro + AnyEvent. But with AE there are many backends",{"id":83,"title":84,"titles":85,"content":86,"level":15},"\u002Fanyevent#speed","Speed",[69],"http:\u002F\u002Flists.schmorp.de\u002Fpipermail\u002Fanyevent\u002F2010q4\u002F000068.html",{"id":88,"title":89,"titles":90,"content":91,"level":9},"\u002Fanyevent-coro-ev","AnyEvent,_Coro,_EV",[],"These are some notes on AnyEvent, hopefully handy for putting together conference presentations or other articles.",{"id":93,"title":69,"titles":94,"content":95,"level":15},"\u002Fanyevent-coro-ev#anyevent",[89],"\"the DBI of event loop programming\" \"EV, Event, Glib, Tk, Perl, Event::Lib, Irssi, rxvt-unicode, IO::Async, Qt and POE are various supported event loops\u002Fenvironments.\" CPAN: cpan:AnyEvent",{"id":97,"title":74,"titles":98,"content":76,"level":56},"\u002Fanyevent-coro-ev#history",[89,69],{"id":100,"title":79,"titles":101,"content":81,"level":56},"\u002Fanyevent-coro-ev#technology",[89,69],{"id":103,"title":84,"titles":104,"content":86,"level":56},"\u002Fanyevent-coro-ev#speed",[89,69],{"id":106,"title":107,"titles":108,"content":109,"level":15},"\u002Fanyevent-coro-ev#coro","Coro",[89],"Cooperative Multitasking for Perl",{"id":111,"title":112,"titles":113,"content":45,"level":15},"\u002Fanyevent-coro-ev#libev-ev","libev (EV)",[89],{"id":115,"title":74,"titles":116,"content":117,"level":56},"\u002Fanyevent-coro-ev#history-1",[89,112],"Created in 2007Meant to replace libeventVery fastVery cross-platformVery non-blocking",{"id":119,"title":120,"titles":121,"content":122,"level":56},"\u002Fanyevent-coro-ev#users","Users",[89,112],"Things that depend\u002Fmake use of libev: Awesome (window manager)i3 (window manager)nodejscoffeescript (depends on nodejs)unbound (caching dns server)multiwatch (multi-proc spawn and watchdog)lighttpd (optional)rxvt-unicodelibevhdns (async dns resolver)",{"id":124,"title":125,"titles":126,"content":127,"level":56},"\u002Fanyevent-coro-ev#language-bindings","Language bindings",[89,112],"PerlPythonRubyC#C \u002F C++Lua",{"id":129,"title":130,"titles":131,"content":132,"level":15},"\u002Fanyevent-coro-ev#the-killer-combo","The Killer Combo?",[89],"http:\u002F\u002Fleonerds-code.blogspot.com\u002F2011\u002F06\u002Fsleep-sorting-with-ioasync-and-cps.html",{"id":134,"title":135,"titles":136,"content":137,"level":9},"\u002Farcanejill","ArcaneJill",[],"Arcanejill (or Archanejill) is the Sony Z505JSK which was kindly donated to my by Adam. She has been the most wonderful computer, let alone laptop, which I have had the pleasure to own. I haven't given her enough credit, or even utilized her quite as much as I could perhaps... but damn I'd miss her if she was gone! Jill runs debian unstable, and has had continuous upgrades since the initial install by Mid. Which means that he dealt with the initial installation and I haven't had to. Now my job is to simply keep Jill going for as long as possible. Last year ChrisGeanious purchased a new battery for me, and since then I get upwards of 2.5 hours of battery life (it is a 1.5 capacity, so it bulges out a bit on the bottom and is slightly heavier). It was worth every dime and if I had any idea what I was missing I would have purchased it myself. Recently the sound died. First the speakers and recently the headphone jack too. Just a bit of research and I discovered that this is a mere loose connector which sits to the left of the touchpad. I can even press down in the spot and all sound functionality returns! So soon I will take jill apart (for the second time) to tighten that up and clean out any dust that may have crept in.",{"id":139,"title":140,"titles":141,"content":45,"level":9},"\u002Fardour","Ardour",[],{"id":143,"title":144,"titles":145,"content":146,"level":15},"\u002Fardour#building-in-debian","Building in Debian",[140],"While I do like the idea of supporting Ardour development through donations, I don't quite care for the way it is pushed on the website. So I decided to follow their path of OK-ness for not immediately paying: build from source. That and I already had a bunch of stuff installed. Here is what I had to additionally install\u002Fupgrade (debian Unstable 2013-04-14). I basically ran \".\u002Fwaf configure\" over and over and over, getting a little further and installing another package each time. libboost-all-dev\nlibglibmm-2.4-dev\nuuid-dev\nlibfftw3-dev\nlibaubio-dev\nlibsamplerate0-dev\nlv2-dev Right about then I remembered that Debian already has ardour2, and I figure there are probably a bunch of the same dependencies. So I did: apt-get build-dep ardour ... and then the configure found everything it needed. Compile then worked perfectly, and it seems to run. Haven't done much testing though. Once I test a bit I might look into requesting debian to track ardour3 as a real package.",{"id":148,"title":149,"titles":150,"content":151,"level":9},"\u002Fasus-zenbook-prime-ux32vd","Asus_Zenbook_Prime_UX32VD",[],"I upgraded from my trusty Fujitsu Lifebook T730 in early 2013. Base specs: 13.3\" (1920x1080)Intel i7-3517U (1.9Ghz)4GB DDR3 (2 onboard, 2 modular)Intel HD4000 onboardNvidia 620M 1GB bonus video500GB (W\u002F 24GB flash cache)3 x USB 3.0 portsMicro-VGA port, dongle converts to full VGAHDMI port Upgrades: 8gb stick, plus the 2gb onboard, for 10gb RAM total250gb Samsung SSD to replace the 500gb spinning disk Install: Debian Sidgnome-session base with xmonad window manager Fun stuff: Just about everything works out of the boxAt first it didn't work, but after a kernel upgrade I can use the HDMI and the VGA and the built in screen all at the same time. Triple screens!bumblebee provides 'optirun', which lets me run an individual program with the accelerated nvidia card. Fancy!",{"id":153,"title":154,"titles":155,"content":156,"level":9},"\u002Fautobiography","Autobiography",[],"I think it would be nice to write an autobiography. Actually I think it would be neat to write 5 autobiographies, one every 20 years. I've missed the 20-year mark already, so I figure I can start on the first one now. I also want to get started on such a project sooner than later since I will surely forget things, more than I have already forgotten that is. I'm also happy for this to be a semi-autobiography, so if there is anyone out there who has some good contributions... add them here! I'd be happy to do the same for you. Whoever you are. So here is the plan: First I will record a timeline of events, a pretty factual account. Then (randomly) I will elaborate on some of these.",{"id":158,"title":159,"titles":160,"content":161,"level":15},"\u002Fautobiography#timeline","Timeline",[154],"1980-07-18 : Parents married1980-12-14 : Born1987 : Family got first computer (Apple ][e)1995 : Switch from Dysart to Peoria school district1998 : Began using GNU\u002FLinux all the time1999-01 : Family moved to Idaho, he remained in Surprise1999-05 : Graduated from Centennial HS1999-09 : Began attending NAU as a CSE Major1999-09 : Met Beth2000 Summer : Went to LLNL, worked for Jean S2001-01 : Officially switched to a Philosophy major2001 Summer : Worked at LLNL again2002 Summer : Worked at AzSites \u002F 944 Magazine2002-09 : Began working at IHD2003-05-17 : Married!2004-05-08 : Graduated from NAU2004-05-09 : Moved to Boston for a month, deal on job fell through2004-06 : Moved to Phoenix2004-09 : Moved to Flagstaff, began working for Norchem2005-05 : Moved to Phoenix, began working for SWCA2005-05 : Became leader of Phoenix Perl Mongers2007-05 : Moved to DC, began to work at Liquidity Services2007 : Revive DC Perl Mongers2013 : Began working for Optoro2017 : Began working for Framebridge",{"id":163,"title":164,"titles":165,"content":45,"level":15},"\u002Fautobiography#family-tree","Family Tree",[154],{"id":167,"title":168,"titles":169,"content":170,"level":9},"\u002Fbasic","BASIC",[],"Beginner's All-purpose Symbolic Instruction Code",{"id":172,"title":173,"titles":174,"content":175,"level":9},"\u002Fbtctradingco","BTCTradingCo",[],"Initial total balance: 1.2997BTC and  $4.21696",{"id":177,"title":178,"titles":179,"content":180,"level":9},"\u002Fbeth-birthday-2008","Beth_Birthday_2008",[],"yay! Beth said:\nI was thinking of doing a boat ride on the potomac (like the one Liz did\nwith her work) to King's Street in Virginia and then having a nice\nlunch\u002Fdinner there.  But, I'm totally up for anything.  I told Brock \"maybe\nwe should make paddle boats and kite flying my birthday present\" and he said\nthat those things should be considered separate events because \"there's no\nneed to have a holiday for kite flying!\"  Haha, but that's also on the\ntable.  You ladies have any ideas?  I am open like a 7-11.",{"id":182,"title":183,"titles":184,"content":45,"level":9},"\u002Fbot-quotes","Bot_Quotes",[],{"id":186,"title":187,"titles":188,"content":45,"level":15},"\u002Fbot-quotes#robots-say-the-darndest-things","Robots say the darndest things",[183],{"id":190,"title":191,"titles":192,"content":193,"level":9},"\u002Fbrocks-journal","Brock's_Journal",[],"This is the last 10 entries into the more chronological section of this wiki. I don't expect that it will be kept up very often or consistently! See TLT (All) for the Big List. \u003Cjournal 10 \"^Brock's_Journal_-_\">",{"id":195,"title":196,"titles":197,"content":198,"level":9},"\u002Fbrocks-journal-(all)","Brock's_Journal_(All)",[],"Here is a FULL listing of my journal entries. Maybe one day I can make it just to the titles. Until then... here you go! For just the last 10 see TLT. \u003Cjournal 999 \"^Brock's_Journal_-_\">",{"id":200,"title":201,"titles":202,"content":203,"level":9},"\u002Fbrocks-journal-2003.11.15.23.52","Brock's_Journal_-_2003.11.15.23.52",[],"Just finished watching Movie Review - Star Trek II The Wrath of Khan, which I'd never seen before. Well... at least I don't remember seeing it before. I've certainly seen bits and pieces, and have definitely seen the last bit with Spock. It was pretty good. Yesterday was Beth and my fourth dating anniversary and around now is our 6 months of marriage day. We've mostly spent the weekend watching movies and hanging out together.",{"id":205,"title":206,"titles":207,"content":208,"level":9},"\u002Fbrocks-journal-2003.12.23.01.46","Brock's_Journal_-_2003.12.23.01.46",[],"Back in flagstaff today. We will leave for phoenix tomorrow in Beth's mom's car with lots of clothes to be washed and a rabbit.",{"id":210,"title":211,"titles":212,"content":213,"level":9},"\u002Fbrocks-journal-2004.01.16","Brock's_Journal_-_2004.01.16",[],"I was reading some random news article and noticed an advertisement with a cool logo from http:\u002F\u002Fwww.rackspace.co.uk\u002F and so I went to the site to get a better look. Pretty good looking, I thought, so I left it open so I could show Chelseya sometime. About 5 minutes later a Java Applet popup appeared -- a live chat system with a real person telling me that they were a website guide and asking if I wanted any extra information. I told them to go away, of course, but it was interesting nonetheless (I also disabled java). I wonder how widespread this practice is... whether there are a lot of other folks doing the same thing. If I was actually looking at them for business I certainly would have felt special to get a live person. Yet there is a feeling of intrusiveness... It's like when you go to a store and a salesman meets you at the door and hovers. And you tell them you are just browsing, so they go away... but only a few steps away and you can sort of feel them breathing down your neck the whole time you are there. Do they watch which pages I go to and how long I stay there? Creepy.",{"id":215,"title":216,"titles":217,"content":218,"level":9},"\u002Fbrocks-journal-2004.01.29","Brock's_Journal_-_2004.01.29",[],"I am playing with the evil Epiphany webbrowser since my wonderful galeon is borked since I accidentally upgraded mozilla. Ick. Anyway, the interesting thing is I actually figured out how to work the bookmark toolbar thingie and added TheLackThereof as a textbox entry so I could just type in a topic name and it would jump to that topic. Maybe I should make it search for that topic... hmm. In any case I tested it by typing in ''this'' topic. Thus here I am. I've watched some movies lately, and have just been too lazy to do my little movie review thing that I did before. I do enjoy doing it though, so maybe I'll catch up. This has been the first week for Aaron at work. It's quite nice and even exciting to have someone else to do my job with me. He is busily re-learning Visual Basic so that he can fix up Jill's database. Fun stuff. Okay. Time to go.",{"id":220,"title":221,"titles":222,"content":223,"level":9},"\u002Fbrocks-journal-2004.02.02","Brock's_Journal_-_2004.02.02",[],"Well I've been spending lots of time on my Resume and am pleased with the current results. Now the next trick is to get a good cover letter or three going. Unfortunately I understand the formula behind resume writing, but I don't have a clue when it comes to writing cover letters. I may have a lead working for Ximian, which would be fantastic. I figure that they must have a use for me somewhere. The trick is to (a) find out where they need me, and then (b) convince them that they need me there. Tomorrow is the NAU Engineering Job Fair, so I'll go to that and practice a bit, maybe make some contacts. Oh, and it is going to snow a bunch too. Great fun!",{"id":225,"title":226,"titles":227,"content":228,"level":9},"\u002Fbrocks-journal-2004.02.04","Brock's_Journal_-_2004.02.04",[],"No school today! So instead I'm going to work on random things. This site, maybe http:\u002F\u002Fepfarms.net\u002F, and probably SetDB.",{"id":230,"title":231,"titles":232,"content":233,"level":9},"\u002Fbrocks-journal-2004.02.14","Brock's_Journal_-_2004.02.14",[],"Happy Valentine's Day! I'm very excited because I got a big chunk of SetDB to work. Though the code on the inside isn't the prettiest or most simple thing ever, the interface is shaping up quite nicely. There are still some things to work out of course, but so far so good. At this point I might show it to some people, but just a bit more and I might post it on http:\u002F\u002Fwww.perlmonks.org\u002F so that they can put in their thoughts. Earlier this week I started an Autobiography. I think it could be fun, and goes along with the idea of this site being a map to a better understanding of myself.",{"id":235,"title":236,"titles":237,"content":238,"level":9},"\u002Fbrocks-journal-2004.02.18","Brock's_Journal_-_2004.02.18",[],"Well I'm having great fun working on this website. OddMuse is so fun :)",{"id":240,"title":241,"titles":242,"content":243,"level":9},"\u002Fbuild-deb-from-source","Build_Deb_From_Source",[],"Had to fix some malloc bug in xbindkeys. Didn't want to wait for the next version, so did:",{"id":245,"title":246,"titles":247,"content":248,"level":9},"\u002Fburning-bits","Burning_Bits",[],"This is an experiment at Collaborative Music!",{"id":250,"title":251,"titles":252,"content":253,"level":9},"\u002Fcdoltm","CDOLTM",[],"(Cats Dominate Our Lives Too Much) (download) Wake up\nFeed me\nDon't wait\nI need\nYou've got your own world\nBut you brought me here\nSuck it up you worthless whore\nI feel like you\nDon't care\nBe kind\nShut up\nLeave me\nI know that you think\nI am here to entertain\nMy attention is not free\nSometimes you can be\nSo vain\nTease me\nBe touched\nGive me\nWake up\nFeed me\nDon't wait\nI need\nYou",{"id":255,"title":256,"titles":257,"content":258,"level":9},"\u002Fcgi-inspect","CGI_Inspect",[],"CGI::Inspect info goes here. This, along with Continuity::Monitor::CGI, allows you to inspect a running web application.",{"id":260,"title":261,"titles":262,"content":263,"level":15},"\u002Fcgi-inspect#code","Code",[256],"The easiest way is to get it from CPAN. But if you want something a little more raw:",{"id":265,"title":266,"titles":267,"content":268,"level":9},"\u002Fcgi-inspect#real-darcs-repo","Real Darcs Repo",[],"darcs get http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002FCGI-Inspect",{"id":270,"title":271,"titles":272,"content":273,"level":9},"\u002Fcgi-inspect#github-mirror","Github mirror",[],"git clone git:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fcgi-inspect.git",{"id":275,"title":276,"titles":277,"content":278,"level":15},"\u002Fcgi-inspect#yapcna-2009-presentation","YAPC::NA 2009 Presentation",[271],"You can get the slides at http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fyapcna-2009\u002Fcgi-inspect\u002F Abstract: One 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\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\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.\nPPW 2008 PresentationI 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 PPW 2008 Continuity-Monitor Slides. Here is the abstract:\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\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\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 :)",{"id":280,"title":281,"titles":282,"content":283,"level":9},"\u002Fcs421-fall-2003","CS421_-_Fall_2003",[],"What are algorithms? Q: What is an algorithm (give an informal definition)? Q: What is an instance of a problem? Q: What is the benefit of data structures? Q: What are hard problems? Q: What does efficient algorithm mean? Q: Are NP-complete algorithms hard problems? Q: What is the interesting thing about NP-complete problems? Q: What is the usual criterion for efficiency of an algorithm? Q: Why is efficiency of algorithms so important? Correctness of insertion sort Q: What is a loop invariant? Q: What has to be shown about loop invariants? Name the three keywords! Q: What is the similarity to mathematical induction? Analysis of insertion sort Q: When analysing algorithms we try to predict the consumption of resources. What resources? Name at least two! Q: What is a worst case analysis, e.g. for the runtime of an algorithm? Q: What do we have to assume especially for a sorting algorithm, to get the worst possible runtime? Q: When do we get the worst case runtime when we search a database? Q: Why are we doing mostly a worst case analysis? Give at least two reasons! Divide&conquer approach Q: What are the three parts of divide&conquer algorithms? Name all of them! Q: When do divide&conquer algorithms \"back out\"? Q: Which of the three steps is the merging of two sorted subsequences in Merge Sort? Analyzing divide&conquer algorithms Q: What does it mean when we say that an algorithm is recursive? Q:  What kind of algorithms are divide&conquer algorithms by nature - linear or recursive? Q: Does the runtime equation of a recursive algorithm result in a recursive equation?",{"id":285,"title":286,"titles":287,"content":45,"level":9},"\u002Fcs421-final-exam-study-guide","CS421_-_Final_Exam_Study_Guide",[],{"id":289,"title":290,"titles":291,"content":292,"level":15},"\u002Fcs421-final-exam-study-guide#topics","Topics",[286],"Regular Expressions and DFAs\nBe able to tell when a string is in the language of a regular expresion or DFABe able to construct simple DFAs\u002FRegular Expression given a description of the strings they should accept.Context-Free Grammars and Parsing\nGiven a description of the language, be able to construct a context-free grammar for the languageGiven a context-free grammar and an input string, illustrate left-most and right-most (canonical) derivationsGiven a context-free grammar and an input string, show a parse tree, possibly constrained by a certain derivation orderBe able to say whether a given grammar is ambiguous, including showing multiple parse trees to illustrate the ambiguityConstruct a shift-reduce parse for a sentence of a grammarWrite parse rules in ocamlyacc syntaxCompiler Structure and Code Generation\nIdentify the major components of the compiler, and their relationshipAnalyze or write IR code generators for statements and expressions, including contextual and short-circuit evaluationRuntime systems and garbage collection\nMemory organization (stack, heap, ...)Garbage collectorsProgramming language history, APL\nName or identify some well-known imperative, functional and O-O languagesKnow the common operators, such as those used in the MP.Be able to read and understand APL code (in OCaml)Be able to write simple APL functions without recursionHigher-order functions\nKnow the commonly-used map, fold_right and fold_left functions.Be able to write code using h-o functions, without explicit recursion.Represent data structures and operations on them as h-o functions.Function objects -- use functional programming in imperative languages like Java.Inference (proof) systems\nBe able to read and understand proof trees.Understand and apply axioms, judgments, and rules of inference.(Note: no need to memorize specific rules; they will be provided if needed.)Write proofs for judgments expressed in this manner.Type systems\nUnderstand the Tocaml type systemBe able to type check (prove the type of) OCaml expressions.Operational semantics\nUnderstand the differences between OSsubst, OSclo, OSstateBe able to write derivations for expression evaluationHoare logic\nKnow the rules of inference (especially rule of consequence, while, and assignment)Be able to determine the invariant for a while loopProve partial correctness of simple programsProve termination by specifying a phi function for loopsAdvanced topics\nLazy evaluation: be able to evaluate expressions using this method, including infinite expressionsLambda-calculus: using Church numerals, applying beta-reduction, representing operationsParallel programming: fundamentals, MapReduce, async workflows digraph {\n  E1 -> T1;\n  E1 -> '+';\n  E1 -> E1;\n}",{"id":294,"title":295,"titles":296,"content":297,"level":9},"\u002Fcall-on-borbyu","Call_On_Borbyu",[],"Listen:  (download) Artists: Elizabeth Woys and Brock Wilcox\nCopy and Share: under the terms of Creative Commons Attribution-NonCommercial license! We wrote this song for Jason's birthday!",{"id":299,"title":300,"titles":301,"content":302,"level":15},"\u002Fcall-on-borbyu#lyrics","Lyrics",[295],"There once was a man\nMade of fire and ice\nHe traveled the land\nSought heads for a price He’d come from afar\nAnd soon slay the beast\nA poor tortured town\nThen threw him a feast Chorus:\nFrom realm to realm\nThey knew what to do\nIn times of need\nCall on Borbyu! A secluded isle\nFar out on the sea\nWas stricken with hunger,\nDisease, poverty But worse than all this\nTheir mightiest foe\nA dragon, my friends,\nSuch strength unknown chorus The wings of a demon\nAnd scales made of steel\nThe chill of his screams\nIn the bones you could feel In all of this world\nNone were his best\nThe perfect end\nTo a perfect quest chorus When Borbyu arrived\nThe townspeople cheered\nThen suddenly the dragon\nFrom nowhere appeared He swooped down and fire\nRained over the town\nHis first blow fell strong\nThe slayer was down chorus Slowly he rose\nThe man and his sword\nRetreat - not an option\nHe bravely pushed forward Just as the beast\nRetired to his den\nBorbyu destroyed the entrance\nLocking dragon within! chorus x 3",{"id":304,"title":305,"titles":306,"content":307,"level":9},"\u002Fcaravan","Caravan",[],"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! Planned algorithms: PrefixPan - Base algorithm, uses a prefix tree to hold sequential patternsCloSpan - Builds off of PrefixPan, but does Closed Sequential PatternsCISpan - Builds off of CloSpan, but allows a single 'diff' on top of the base dataFloSpan - Builds off of CISpan, but uses ideas from IncSpan to allow continuous updates See Introduction to Frequent Sequential Pattern Mining for some background information on what this is all about, and what it is good for.",{"id":309,"title":310,"titles":311,"content":312,"level":15},"\u002Fcaravan#the-paper","The Paper",[305],"Since this is an assignment, I'm going to be writing a paper. Someday I'll link to it.",{"id":314,"title":315,"titles":316,"content":317,"level":15},"\u002Fcaravan#get-the-code","Get The Code",[305],"As usual, my code is in darcs, grab it with:",{"id":319,"title":320,"titles":321,"content":322,"level":9},"\u002Fcaravan#original-modular-version","Original, modular version",[],"darcs get http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Focaml\u002Fcaravan",{"id":324,"title":325,"titles":326,"content":327,"level":9},"\u002Fcaravan#new-fancy-object-oriented-version","New fancy object-oriented version",[],"darcs get http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Focaml\u002Fcaravan2 or from my github mirror. See Contributing for general hacking info.",{"id":329,"title":330,"titles":331,"content":332,"level":15},"\u002Fcaravan#use-the-code","Use The Code",[325],"I should put together an example usage :) Plan\u002FTodo: Command line interface\nSwitch to control which algorithmInput in the standard binary and ascii formatsOutput in a human readable formatOutput in a machine readable formatOCaml library interfaceC-library interface? Others?Validate CloSpan against the Illimine (C++) implementationBenchmark CloSpan against the Illimine implementation",{"id":334,"title":335,"titles":336,"content":337,"level":9},"\u002Fcensus-data-extraction","Census_Data_Extraction",[],"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.",{"id":339,"title":340,"titles":341,"content":342,"level":15},"\u002Fcensus-data-extraction#input-data","Input Data",[335],"Here I'll describe what I have",{"id":344,"title":345,"titles":346,"content":347,"level":15},"\u002Fcensus-data-extraction#_2000-census-data","2000 Census Data",[335],"ftp:\u002F\u002Fftp2.census.gov\u002Fcensus_2000\u002Fdatasets\u002FSummary_File_1 FTP Root for 2000 dataftp:\u002F\u002Fftp2.census.gov\u002Fcensus_2000\u002Fdatasets\u002FSummary_File_1\u002FArizona Arizona dataData documentation PDF, see chapter 7",{"id":349,"title":350,"titles":351,"content":352,"level":15},"\u002Fcensus-data-extraction#_1990-census-data","1990 Census Data",[335],"ftp:\u002F\u002Fftp2.census.gov\u002Fcensus_1990\u002F FTP Root for 1990 dataftp:\u002F\u002Fftp2.census.gov\u002Fcensus_1990\u002FCD90_1A_8\u002F Arizona data (1A)ftp:\u002F\u002Fftp2.census.gov\u002Fcensus_1990\u002FCD90_3A_03\u002F Arizona data (3A)ftp:\u002F\u002Fftp2.census.gov\u002Fcensus_1990\u002FCD90_1A_8\u002Fdocument\u002Fhowtouse.asc General usage documentationftp:\u002F\u002Fftp2.census.gov\u002Fcensus_1990\u002FCD90_1A_8\u002Fdocument\u002Flist_tbl.asc Summarized field descriptionsftp:\u002F\u002Fftp2.census.gov\u002Fcensus_1990\u002FCD90_1A_8\u002Fdocument\u002Ftbl_mtx.asc Detailed field descriptions",{"id":354,"title":355,"titles":356,"content":357,"level":9},"\u002Fchelseyas-new-page","Chelseya's_new_page",[],"I like the page! blah blah blah",{"id":359,"title":360,"titles":361,"content":362,"level":9},"\u002Fchompie","Chompie",[],"I saw this really cool presentation at CodeCon one time... and stole their idea. I'll have to find a link. 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. 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. darcs get http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fchompie\u002F",{"id":364,"title":365,"titles":366,"content":367,"level":9},"\u002Fchristmas-2008-schedule","Christmas_2008_Schedule",[],"Wishlist TeraysaMandieChrisScottPapa et alGrandma Kay et alRenaBeth's Grandma",{"id":369,"title":370,"titles":371,"content":372,"level":9},"\u002Fclassdbi-aware-templates","ClassDBI-Aware_Templates",[],"So this is along the lines of delphi (and other system's) data-aware controls. The idea is to intwine cpan:Class::DBI objects with a template.",{"id":374,"title":375,"titles":376,"content":377,"level":9},"\u002Fcode-on-my-mind","Code_On_My_Mind",[],"Written and performed by Brock Wilcox and Jason Woys Please share, copy, and modify, under the terms of Creative Commons Attribution-ShareAlike (CC BY-SA)! (download) Walkin' down the road,\nThinkin' bout my code all the time,\nThe way that I'm walkin'\nPeople might think I was blind,\nWhen I get stuck,\nI just keep a walkin' down the line,\n'Cause nothing gets me down,\nWhen I got code on my mind. Pound Bang\n\u002Fusr\u002Fbin\u002Fperl\nuse strict;\nprint \"Hello World\\n\";\nGimme Perl and a Unix shell,\nI'll code right through that dinner bell Everywhere I go,\nThinkin' bout my code all the time,\nEven at church,\nVim can seem so divine,\nAnd when I'm makin' love,\nI keep thinking of my next line,\n'Cause nothing gets me down,\nwhen I got code on my mind. I think about it,\nwhen I get up,\nThe time awake just ain't enough,\nSo I turn to sweet caffeine,\nJust a little more is all I need, Walkin' down the road,\nThinkin' bout my code all the time,\nThe way that I'm walkin'\nPeople might think I was blind\nWhen I get stuck,\nI just keep a walkin' down the line,\n'Cause nothing gets me down,\nWhen I got code on my mind, Pound Bang\n\u002Fusr\u002Fbin\u002Fperl\nuse strict;\nprint \"Hello World\\n\";\nGimme Perl and a Unix shell\nI'll code right through that dinner bell Nothing gets me down\nWhen I got code on my mind",{"id":379,"title":380,"titles":381,"content":382,"level":9},"\u002Fcode-selectors","Code_Selectors",[],"Let's contemplate the relationship between HTML and CSS. Imagine that each HTML tag is an object, in the OOP sense of the word. It has a set of attributes, things like align, border, color. It also has one method, render(). When render() is called the object looks at its attributes and decides on how to render itself. Now add CSS into the mix. When the render method is invoked on our tag object it doesn't just look at its own fixed attributes, it additionally queries the CSS to discover other attribute settings it has, given its current relation to neighboring and parent tag-objects. Let's imagine that the CSS is itself a single object, and the tag-object only has to ask for specific attributes from the CSS-object. It is the CSS-object's job to figure out what attribute values to give in the current context of the tag-object. In the HTML\u002FCSS world we (theoretically) don't really have to use a variety of HTML tags. We could just use DIV for everything, altering the rendered result to look like any other tag through CSS attributes. Standard HTML tags are merely a set of default attribute values. This is because our conceptual tag-objects have only the one method, render(), which works the same way for every tag to apply all the attributes creating a visual result. This is a technique to provide bits of your program with context-based implicit static parameters. You might find it as a strange sort of configuration system, analogous to how css 'configures' the presentation of HTML elements. If you find yourself passing constant parameters to a procedure so that it will know how to behave in the current context, then this method may be useful. You may also have created wrappers to effectively do the same thing, or you may have even two nearly identical copies of the same procedure. Example: becomes: In this example the resulting code is longer than the original. But imagine that instead of just 'a' and 'b' calling 'x', there were instead like 20 things that call 'x', but you only want to pass false when 'b' calls 'x'. Or perhaps you only send false when 'a' calls 'b' calls 'c' calls 'x'. Now we're starting to encode some more serious logic here. This example is clearly contrived, but see below for the real-world problem which inspired this technique. I'll try to think up a less symbolic example while keeping the simplicity. Suggestions welcome. Here's an idea: Working on GUI components, I want each component to worry about its own model\u002Fview. So working in the web-app world, I want my Person object to know how to render itself in a variety of contexts. So if I am displaying it in an editor it will get editable widgets, and if I'm displaying it in a viewer it gets just the static text, etc. Its kinda like I want to 'skin' my object, and display a different theme depending on the context. And that reminds me of CSS. So what I need is some sort of CSS-selector-like-thingie except for code (since we are not only activating how the object looks, but how it reacts too). CSS-style selectors is one approach, another (more straightforward?) way is to tell the object its context directly. hm. All CSS selectors are is an order-of-evaluation and precedence of the attributes for tags. Things are described generally and then overridden again and again as it gets more specific. This reminds me of an object hierarchy... but is less tied to actually objects. We are more worried about the context of the display of our objects, not what the objects themselves are derived from. So let's see. Let's have a $context var that gets passed to these objects when they are rendered. They add to and override things in the context, and themselves automatically get added or something. Then when they render sub-components they pass along the $context as well. I'm working on a timesheet application. Each timesheet has rows (for each project worked on during the timesheet's time period), each row has cells, one for each day of the time period, containing the number of hours they worked on that day on that project. Additionally, in some contexts the rows are grouped by the type of project. I'm not actually suggesting we use selectors like this, it is a mere abstraction. Using actual selectors would be like using XML configuration files, and I am very against that. Instead I'd implement it in code at the very least. Like this: or somethin'. maybe a function call would be better, like that way it could assign things in reverse-order... cause we are really going to want to know, as a 'row', what attributes we currently have given the context of \"view -> timesheet\". Plus the above selectors are just the \"contained in\" selectors, we might also want class, id, immediate-child, sibling, etc (just think of all the css2 selectors).",{"id":384,"title":385,"titles":386,"content":387,"level":9},"\u002Fcode-undone","Code_Undone",[],"(2011.07.05) I dream of code written\nAnd of code yet done\nI dream of recursion\nOf loops and jumps and fun The twisty tricks and all my wits\nFell just within my grasp\nBeyond my mortal limit\nMoving oh so fast Soon I will awaken\nThe structure starts to blur\nDaylight physics much more strict\nStill I happily endure",{"id":389,"title":390,"titles":391,"content":45,"level":9},"\u002Fcomments-on-fujitsu-lifebook-t730","Comments_on_Fujitsu_Lifebook_T730",[],{"id":393,"title":394,"titles":395,"content":396,"level":56},"\u002Fcomments-on-fujitsu-lifebook-t730#_9-comments","9 Comments.",[390],"Hi!\nI got myself a T730 too (a cheaper configuration, though) and found it works pretty well with Ubuntu 10.10 RC. However I cannot get pen input and the touch screen working at the same time. The pen works out-of-the-box but stops working as soon as I create a xorg.conf like yours. Touch works perfectly with a xorg.conf. I also tried removing the definitions for the pen but it's still not responding until I delete xorg.conf completely.\nWhat which versions of the wacom drivers and X11 are you using in your working configuration? Do you have any other tips for me? Thanks in advance,\nLukas -- geloescht 2010-10-01 20:31 UTC Hmm... no, I don't think I ever had quite that problem while I went through all of my experiments. For versions, dpkg says: ... I suggest you try 10.04 (even just the boot CD) with the xorg I provided and see if that works. It might indicate that I'll have an issue once I upgrade if it does :) It's also possible that I did something that I've forgotten! Let me know if the above helps, and feel free to email me. -- awwaiid 2010-10-03 04:33 UTC Hi there again, Just wanted to say I built and installed the input driver from git and now it works perfectly without any xorg.conf! -- geloescht 2010-10-08 09:12 UTC Hi! Thank you for posting this great info about the Fujitsu T730 linux setup.  I also got one recently and the tablet\u002Fpen features \"just worked\" with Debian\u002Ftesting.  However, My eraser seems a little quirky and I haven't tested the multitouch as yet. HDMI video just worked.  For HDMI audio, see the alsa page; their instructions worked for me:  https:\u002F\u002Fwiki.archlinux.org\u002Findex.php\u002FAdvanced_Linux_Sound_Architecture#HDMI_Output_Does_Not_Work You say that your webcam and audio worked perfectly out of the box.  Video and audio output works for me too, but I have not been able to get the internal mic working.  Can you post your alsa version, kernel version and maybe your \u002Fetc\u002Fmodprobe.d\u002Falsa-base.conf file? Thanks, Shandilya -- Anonymous 2011-10-14 17:53 UTC My mic also doesn't work, and I never came back to update the page, sorry. I too am interested in getting the mic to work -- I don't really understand why it doesn't. I also switched from ubuntu to debian (sid!) recently, and the touch\u002Fpen worked out of the box. I should try the eraser. One other thing -- the camera is upside-down. I've got a work-around and reported it to the kernel module maintainer. -- awwaiid 2011-10-16 12:57 UTC My mic suddenly started working last week! Must have been an update of something... I'm now up to kernel 3.2.0 and alsa-base 1.0.23. -- awwaiid 2012-06-02 01:59 UTC Do all t730s have dual digitizers?  I'd like to get mine going if so - do you have a iso or installer with all of your configurations that I could download and try? I'm not super techie but certainly bang away for a while.  Mostly interested in the touch feature . -- Anonymous 2016-05-27 23:34 UTC My dual digitizer worked perfectly on recent linux distros. I have moved on to a new laptop since then though. -- awwaiid 2016-05-29 03:53 UTC",{"id":398,"title":399,"titles":400,"content":45,"level":9},"\u002Fcomments-on-i-love-vim","Comments_on_I_love_Vim",[],{"id":402,"title":403,"titles":404,"content":405,"level":56},"\u002Fcomments-on-i-love-vim#_1-comment","1 Comment.",[399],"Sorry to add to this post so long after you wrote it, but I wanted to\nthank you for your ecumenical comments about Vim. You managed a minor\nmiracle: you praised your favorite editor without starting a flame\nwar! I'm one of the strange folks who happens to love both Vim and Emacs.\nVim is lean, mean, and beautiful in its simplicity. Emacs is\nmonumental, endlessly extensible, and mind-bendingly self-referential!\nI've learned a lot about the power of good software from both editors. -- Matt 2008-09-29 03:13 UTC",{"id":407,"title":408,"titles":409,"content":45,"level":9},"\u002Fcomments-on-perl6-colons","Comments_on_Perl6_Colons",[],{"id":411,"title":394,"titles":412,"content":413,"level":56},"\u002Fcomments-on-perl6-colons#_9-comments",[408],"Some uses I know of which do not appear to be in your list: say :: # Pseudopackage representing null namespace? say X::.keys # The package X treated as a hash 42.Int::Int # Call Int method of Int class -> Numeric ::T \\x { say T }(42) # T takes value's type my regex foo {  $var; } # declare vars in regex scope my regex bar { a: b:? c:! :: ::> } # http:\u002F\u002Fdesign.perl6.org\u002FS05.html#Backtracking_control (some of these implemented already, Larry says he plans to do more this year) Fwiw you're missing a lot of colon-pair syntax variations too, eg:\nsay (:1day) # day => 1\nsay (:!foo) # foo => False\nmy @foo=1,2; say (:@foo) # foo => 1,2\nmy @foo=1,2; say (:@foo) # foo => 1,2\nsay :16(\"dead\") # 57005 :) -- raiph 2016-01-21 05:03 UTC A quick scan of some docs reminds me of: class :: is Int {...}   # :: stands for an anonymous class",{"id":415,"title":416,"titles":417,"content":418,"level":9},"\u002Fcomments-on-perl6-colons#alternative-to-foo-passed-on-command-line","alternative to --foo passed on command line:",[],"perl6 -e 'sub MAIN (:$foo) { say $foo }' And here's something I didn't already know:",{"id":420,"title":421,"titles":422,"content":423,"level":9},"\u002Fcomments-on-perl6-colons#binding-pair-in-sig","binding pair in sig:",[],"my $a;\nsub b (($a)! is rw) { $a = 42};\nb(($a));\nsay $a # 42",{"id":425,"title":426,"titles":427,"content":428,"level":9},"\u002Fcomments-on-perl6-colons#and-then-theres-all-the-specific-uses-of-longnames-like","And then there's all the specific uses of longnames like:",[],"use Foo:from; -- raiph 2016-01-21 05:50 UTC Another one: say so \"a\" ~~ \u002F\u003C>\u002F # Unicode character classes -- raiph 2016-01-21 08:27 UTC How about the alternative method calling syntax;\n@measurements.map:  { check_accuracy($);  fail if $ \u003C 0 } -- Marty 2016-03-01 10:44 UTC Greetings Marty -- that last bit is covered as \"Precedence dropper\" in the misc section. -- awwaiid 2016-03-06 03:43 UTC The compile-time variable ::?CLASS. E.g. the following are equivalent: -- smls 2016-08-26 08:30 UTC That is a bizzaro variable. -- awwaiid 2016-09-05 00:45 UTC Considering you can create your own slangs that mutate the language grammar... I'd say the number of colon uses is infinite. -- Zoffix 2017-07-22 14:39 UTC Zoffix -- I think that is cheating a bit. I guess I'm looking more at the \"core\" language, assuming there is such a thing :) -- awwaiid 2017-07-22 15:37 UTC",{"id":430,"title":431,"titles":432,"content":45,"level":9},"\u002Fcomments-on-science-vs-mathematics","Comments_on_Science_vs_Mathematics",[],{"id":434,"title":403,"titles":435,"content":436,"level":56},"\u002Fcomments-on-science-vs-mathematics#_1-comment",[431],"\"In other words, there are true statements of mathematics which cannot be proved.\" depends on what you mean by \"true\": you are outside the system of mathematics and I wouldn't dare to say that something that cannot be proved is \"true\". Such truth can only be thought of a philosophical problem outside mathematics. Moreover, there have been some statements unprovable in axiomatic systems (for example the continuum hypothesis in ZFC set theory). Mathematicians, instead of trying to philosophically argue whether such statements are true or false, try to prove independence of some unprovable results from others.  For example \"every Parovicenko space is homeomorphic to $\\beta\\omega$\" is equivalent to the continuum hypothesis. Set theoretic topology is full of such results that prove consistency instead of logical implication. -- Rodrigo Hernandez Gutierrez 2012-10-15 00:14 UTC",{"id":438,"title":439,"titles":440,"content":45,"level":9},"\u002Fcomments-on-state-scope","Comments_on_State_Scope",[],{"id":442,"title":443,"titles":444,"content":445,"level":56},"\u002Fcomments-on-state-scope#_3-comments","3 Comments.",[439],"What did you make that diagram in? -- beppu 2008-05-12 06:21 UTC PS:  It would be nice if the Comments_on_State_Scope page linked back to the State_Scope page. -- beppu 2008-05-12 06:23 UTC The diagram was made using graphviz, I wrote a plugin to generate it directly from wiki pages here. So go back and edit-this-page to see the source. At the very bottom of the page the \"Comments on State Scope\" link turns into the \"State Scope\" link when viewing comments. But you're right that it should be up at the top more. -- awwaiid 2008-05-12 13:15 UTC",{"id":447,"title":448,"titles":449,"content":45,"level":9},"\u002Fcomments-on-tlt-2004.03.16","Comments_on_TLT_-_2004.03.16",[],{"id":451,"title":452,"titles":453,"content":454,"level":56},"\u002Fcomments-on-tlt-2004.03.16#_1-comments","1 Comments.",[448],"Chris didn't think to see if it was turned on? (Though I suppose it would make sense to assume such things.) How smrt. I heart him.  Miss you guys. -- mandies the great 2004-03-19 04:09 UTC",{"id":456,"title":457,"titles":458,"content":45,"level":9},"\u002Fcomments-on-tlt-2004.06.10","Comments_on_TLT_-_2004.06.10",[],{"id":460,"title":461,"titles":462,"content":463,"level":56},"\u002Fcomments-on-tlt-2004.06.10#_2-comments","2 Comments.",[457],"Rawr. Mad love, Rosebud. If I need to kick ass, I certainly will. :) I miss you, friend. If you need anything at all, particularly regarding the destruction of the universe, let me know. -- mousetrout 2004-06-10 21:57 UTC My god... someone used my comment system! I'm a happy duck! Of course it was just mandie... and she is the only one who had every used it before (that I can remember). Thanks mandie, I'll keep your offer in mind! -- awwaiid 2004-06-11 03:19 UTC",{"id":465,"title":466,"titles":467,"content":45,"level":9},"\u002Fcomments-on-tlt-2004.06.22","Comments_on_TLT_-_2004.06.22",[],{"id":469,"title":452,"titles":470,"content":471,"level":56},"\u002Fcomments-on-tlt-2004.06.22#_1-comments",[466],"Brock, if you're serious about coming back to California...I'm sure Jean would bend over backwards to help find you a job at LLNL.  In case you have not been in contact with her lately, you should drop her a line...just to check in. -Chris G. -- Anonymous 2004-07-09 19:56 UTC",{"id":473,"title":474,"titles":475,"content":45,"level":9},"\u002Fcomments-on-tlt-2004.07.01","Comments_on_TLT_-_2004.07.01",[],{"id":477,"title":443,"titles":478,"content":479,"level":56},"\u002Fcomments-on-tlt-2004.07.01#_3-comments",[474],"I believe the word you are looking for is ''refactoring''. Also may I point out that good code probably does ''not'' read as a good book, although it probably is ''readable''. Take the example of Knuth's Literate programming. He thought that there are two sides to every code: the ''story of the program'' and the ''program itself''. This is why he made a meta-language to describe both at the same time, and two programs to extract either one from the meta-description. The ''story of the program'' reads like a book. The ''program itself'' reads like a program. As they are obviously different, the ''program itself'' does not read ''like a book''. Good code is readable but in a different way. -- filmil 2004-07-14 22:08 UTC Yes... you have a good point. Though I was replying to something (which I can't recall now) I think that I did draw the similarity between a book and code a little too closely. Maybe I could say that code should read like a good outline? -- awwaiid 2004-07-15 01:08 UTC I guess good code reads as — ah, well — ''good code'', so think about a new readability type. Btw, a recent good read is Celestia. It's amazing to see how such a convoluted thing can be read so easily. Thumbs up for the authors. -- filmil 2004-07-15 19:14 UTC",{"id":481,"title":482,"titles":483,"content":45,"level":9},"\u002Fcomments-on-tlt-2004.07.06","Comments_on_TLT_-_2004.07.06",[],{"id":485,"title":443,"titles":486,"content":487,"level":56},"\u002Fcomments-on-tlt-2004.07.06#_3-comments",[482],"But I looovveeee TLT. Just get a more \"professional\" domain, go gmail, or something for those purposes. Sniffle. I'll cry for TLT and you change domains too damn often! :) -- mousetrout 2004-07-07 04:39 UTC Ohmygod someone left a comment! Of course it was mandie, who has done so before. eh. I won't change domains, thelackthereof.org will still be the domain and tlt42.org will be a re-direct and short mail address, just like sf.net. I'm looking for an alias for thelackthereof.org, not a replacement. -- awwaiid 2004-07-07 18:18 UTC Hmmm....I think I like \"tlt42.org\".  At least it sounds cool. -Chris G. -- Anonymous 2004-07-09 20:02 UTC",{"id":489,"title":490,"titles":491,"content":45,"level":9},"\u002Fcomments-on-tlt-2004.08.23","Comments_on_TLT_-_2004.08.23",[],{"id":493,"title":494,"titles":495,"content":496,"level":56},"\u002Fcomments-on-tlt-2004.08.23#_4-comments","4 Comments.",[490],"I am an Elvis Man. Well duh, I coulda told you that. --mid (Beetles Man) -- Anonymous 2004-08-24 01:22 UTC hrmpf. -- awwaiid 2004-08-24 02:20 UTC I'm totally with Adam here, but I told you that long ago. Guess which I am?! -- mandies the great 2004-08-27 18:17 UTC yadda yadda to both of you. -- awwaiid 2004-08-27 19:01 UTC",{"id":498,"title":499,"titles":500,"content":45,"level":9},"\u002Fcomments-on-tlt-2005.05.10","Comments_on_TLT_-_2005.05.10",[],{"id":502,"title":503,"titles":504,"content":505,"level":56},"\u002Fcomments-on-tlt-2005.05.10#_5-comments","5 Comments.",[499],"Some of those vaio stories are pretty funny. Seems like your new job is easier to swallow morally than the last one. I actually had to google to pass your human test.  I am a bad human. -- Anonymous 2005-05-11 08:43 UTC Which test was it? Some of them are a bit independent... but as a secrent hint you can try hiting reload to get another one :) -- awwaiid 2005-05-11 13:31 UTC Why is a raven like a writing desk? I miss you guys. Semester hell is finally over and all is well. How's Beth doing? And are you guys coming down to the valley or are you working there via Flagstaff? Leslie Gurney came into the store a couple of weeks ago. She's a D&D Dork now, which cracked me up. It was great to see her again, though, since I hadn't since before your wedding. Happy Anniversaryishness, by the way. (I know I'll forget over the next few days. -- mandies 2005-05-12 19:10 UTC Aww... its a MANDIES! I will pass the happy-anniversary on to beth. We are coming down the the valley. specifically I am already down in the valley, and beth will be joining me soon. We will stay at beth's parent's house for a bit, and then get our own place before too long. So then you can come and chill with us in tempeland. -- awwaiid 2005-05-13 20:04 UTC Then we need to have a party and attack the world. Tell Beth that the Bookmans in Phoenix is hiring; it's barely-livable wage, but an awesome job. :) Mad hearts and such. -- mandies 2005-05-17 04:02 UTC",{"id":507,"title":508,"titles":509,"content":45,"level":9},"\u002Fcomments-on-tlt-2005.06.06","Comments_on_TLT_-_2005.06.06",[],{"id":511,"title":443,"titles":512,"content":513,"level":56},"\u002Fcomments-on-tlt-2005.06.06#_3-comments",[508],"Intell in Apples doesn't really bug me.  They make reasonably good CPU's and I think Apple \u002Fstill\u002F suffers from \"Not enough MHZ\" symdrom in the consumer market place.  Further, while the Power4 is a really f'ing nice chip, it was never on the radar for my next cpu, even with real vector instructions.  Dual opterion running linux mmmmmm. Too many people know just enough to have been taught by Intell that MHZ is all. -- Anonymous 2005-06-07 12:16 UTC I love you because you said \"downright\". PeeEss: Tell Miss Elizabeth that some customer has made 'recommends' lists for all of her father's books and put them up on display. It's kind of creepy. Hearts! -- mandies 2005-06-08 03:46 UTC I'm a fan of amd as well. I heard that IBM was also giving apple trouble in meeting supply orders on time. (hey -- sign your name so I know who you are) For all those others out there, Mandieshead refers to wikipedia:Michael_McCollum, the science fiction author and my father-in-law. -- awwaiid 2005-06-08 05:52 UTC",{"id":515,"title":516,"titles":517,"content":45,"level":9},"\u002Fcomments-on-tlt-2005.06.07","Comments_on_TLT_-_2005.06.07",[],{"id":519,"title":520,"titles":521,"content":522,"level":56},"\u002Fcomments-on-tlt-2005.06.07#_6-comments","6 Comments.",[516],"The regular employees (not me - I'm a contractor) here at USGS are getting a commercial timecard system. I think their whole system could be made in a couple of days - it looks as if zero usability testing was done and all but the most simple features break. The manager can't figure out how to work with multiple projects. It apparently stores what project she's in in her session. It sounds like a real piece of junk. I would guess that the program was selected only on the basis of features, not design quality. I suspect that if someone complained that they had to use the program every day, the out-of-towners who bought the program would say something to the effect of \"at least you're only using it for a few minutes every day\". It's interesting to see the neat approaches hackers take on even the most mundane problems. On a side note, I'm going to take tomorrow off and devote all my time this weekend to the ICFP '05 contest. I don't know how far I get, especially since I'll be working by myself this time due to lack of planning, but it should be a neat experience. -- Ben 2005-06-23 20:59 UTC Hiya Ben! What programming language are you going to use? -- awwaiid 2005-06-23 23:25 UTC Python and\u002For Ocaml. -- Ben 2005-06-24 14:00 UTC Well I'm doing it in Perl and\u002For OCaml :). Except that I didn't get today off, so I don't know how well I'll fare. Whats your email addr? -- awwaiid 2005-06-24 14:27 UTC Well I'm doing it in Perl and\u002For OCaml :). Except that I didn't get today off, so I don't know how well I'll fare. Whats your email addr? -- awwaiid 2005-06-24 14:41 UTC ben@benatkin.com -- Ben 2005-06-25 03:27 UTC",{"id":524,"title":525,"titles":526,"content":45,"level":9},"\u002Fcomments-on-tlt-2005.06.17","Comments_on_TLT_-_2005.06.17",[],{"id":528,"title":443,"titles":529,"content":530,"level":56},"\u002Fcomments-on-tlt-2005.06.17#_3-comments",[525],"Oh no. This actually made me cry. I haven't seen him in ages, but he was definitely loved. Give Beth and her mom a hug for me. -- mandies 2005-06-18 00:54 UTC I will -- awwaiid 2005-06-20 00:11 UTC Brock and Beth, I was SO sorry to read about the loss of the Dane. I have oftened wondered why it is so painful to lose our animal \"people\" and I have decided that it's one of the ways the Universe keeps us humans REAL when we tend to close ourselves off from that in our objective realities... I feel your sorrow. Carole Seeley -- Anonymous 2005-08-15 21:44 UTC",{"id":532,"title":533,"titles":534,"content":45,"level":9},"\u002Fcomments-on-tlt-2005.07.08","Comments_on_TLT_-_2005.07.08",[],{"id":536,"title":403,"titles":537,"content":538,"level":56},"\u002Fcomments-on-tlt-2005.07.08#_1-comment",[533],"I do believe it is to signify your cursor is over a link (for those pages it's hard to tell)?  =p No idea really. -- Anonymous 2005-07-08 18:45 UTC",{"id":540,"title":541,"titles":542,"content":45,"level":9},"\u002Fcomments-on-tlt-2005.07.22","Comments_on_TLT_-_2005.07.22",[],{"id":544,"title":461,"titles":545,"content":546,"level":56},"\u002Fcomments-on-tlt-2005.07.22#_2-comments",[541],"The idea similiar to dynamic scope, as I understand it.  Dynamic scope is very unpopular in languages these days but I guess Lisp has it.  I've only read about it, but I understand it's very useful for some applications. -- evan from lj 2005-09-11 06:32 UTC Perl has dynamic scope too ('local'). After thinking about it for a moment I understand what you mean. Definately not the same though... like with dynamically scoped variables these would be set based on the call (or composition) chain, but how they are set is much more complicated and at the same time a bit less messy. More complicated because it could be 'somewhere in my call chain, f() was invoked' (doesn't have to be the immediate caller really). Less messy because function f() doesn't have to do anything to set it up, and none of the other functions in the call chain are poluted by this variable. Thanks for the connection though... I hadn't noticed it. -- awwaiid 2005-09-12 02:03 UTC",{"id":548,"title":549,"titles":550,"content":45,"level":9},"\u002Fcomments-on-tlt-2005.08.05","Comments_on_TLT_-_2005.08.05",[],{"id":552,"title":461,"titles":553,"content":554,"level":56},"\u002Fcomments-on-tlt-2005.08.05#_2-comments",[549],"So, where ARE you guys? If I remember correctly, when we ran into you and Beth at Daily Bread before we left, it sounded like Beth was going to take master's classes at ASU... so are you back down in the Valley again, or what? I love reading your journal entries, now that I've found you, and while I don't have a CLUE what you're talking about computer-wise, I enjoy reading about what you're both up to... Life...\nturning...\nturning back...\nre-turning. Carole S. -- Anonymous 2005-08-15 22:26 UTC Thanks Carole! I just sent you an email :) -- awwaiid 2005-08-17 23:48 UTC",{"id":556,"title":557,"titles":558,"content":45,"level":9},"\u002Fcomments-on-tlt-2005.10.06","Comments_on_TLT_-_2005.10.06",[],{"id":560,"title":403,"titles":561,"content":562,"level":56},"\u002Fcomments-on-tlt-2005.10.06#_1-comment",[557],"That would be interesting. My first thought was that people who distribute Java applications are going to find it even harder to convince people to install the JVM. -- Ben 2005-10-08 20:18 UTC",{"id":564,"title":565,"titles":566,"content":45,"level":9},"\u002Fcomments-on-tlt-2005.11.05","Comments_on_TLT_-_2005.11.05",[],{"id":568,"title":461,"titles":569,"content":570,"level":56},"\u002Fcomments-on-tlt-2005.11.05#_2-comments",[565],"But, perl just sucks ^_^. j\u002Fk (sort of). -- ealar 2005-11-06 22:22 UTC YOU'RE EVIL. Seriously, what sucks about Perl? I'm just not seeing it. And in the examples I mention, its not like they are talking about things which Perl isn't good at or something... gar I say! -- awwaiid 2005-11-07 00:06 UTC",{"id":572,"title":573,"titles":574,"content":45,"level":9},"\u002Fcomments-on-tlt-2005.12.30","Comments_on_TLT_-_2005.12.30",[],{"id":576,"title":461,"titles":577,"content":578,"level":56},"\u002Fcomments-on-tlt-2005.12.30#_2-comments",[573],"Since that article is not in the top section, it was probably up for a short amount of time. I wonder how many Reddit users go there every day (I do). It may have only linked a handful of people to that essay. I like Reddit a lot. Since finding the site, I've got over my Slashdot habit. I find that the entries are of much higher quality than Slashdot. -- ben_atkin 2006-01-11 08:59 UTC One obvious thing about reddit that I've realized since then is that it has a much more volitile pulse. That is -- right now there are cool articles because most readers and voters are fans of interesting things (especially LISP). I'm not sure the site will be able to sustain its overal interesting nature if the audience grows or changes. -- awwaiid 2006-01-11 14:41 UTC",{"id":580,"title":581,"titles":582,"content":45,"level":9},"\u002Fcomments-on-tlt-2006.01.12","Comments_on_TLT_-_2006.01.12",[],{"id":584,"title":443,"titles":585,"content":586,"level":56},"\u002Fcomments-on-tlt-2006.01.12#_3-comments",[581],"I really enjoyed this post. I think it's good to look at what developers should have to worry about and what they should be able to leave to the framework. I think programming for the back button every time is a pretty good idea. A lot of usability problems are caused by people going back to a page that was generated from an old state. I have this problem on Reddit. As you may or may not have noticed yet, whether or not a page has been viewed by a logged-in user is stored on the server, and regardless of what computer you're on, the links you've already seen are the visted (purple) color. The CSS, though, says to show the link the color the server tells it to, regardless of whether the browser says it's visited. Apparently, they either left out this detail, or they decided that since multiple users could be using a computer, they didn't want the chance that something would come up as read if someone else read it. This presents a problem when the back button is pressed - since the page is what it was before you clicked it, and was not reloaded, it displays the just-visited link in blue. This whole problem could be avoided, if the web developer saw the back button as a \"command\", GO BACK TO PAGE X, given to his\u002Fher application. I'm wondering what the usable implementation of this is. If a user sees a page already come up, he will make judgements on it and start trying to click before it even updates itself. I don't think anything could be done to have the browser detect \"back\" and clear the page before the user sees the old page. I thought about this, and it seems the hack for the browser might be to send all of the initial pages visibly empty with JavaScript to get and render the page. Then when they click back, they'll be presented with an empty page, until it goes back to the server, and the server tells the client what to display. This has both pros and cons: Pros: Continuations work well (Biggie)Users aren't presented with old data (Biggie)When users are pressing back many successive times, they don't have to wait for the browser to render the page Cons: Back is slowerMore programming Issues: What message do they get when they go to a page that no longer matters, such as a piece of data they just deleted? Do they get sent to the main page? Does it say \"Record not found\"? I'm for the latter. Can you think of any other examples of why the back button is useful, while at the same time presents many usability problems, which could be rectified by the server side handling \"back\"? I think there's a lot to be learned from this, philosophically. When you click back in the browser, you're going back to the previous navigation state. This is not always the same as going back to the previous program state. When you want to go to the previous program state, it's Undo. -- ben_atkin 2006-01-15 22:42 UTC There are two continuation-based Web frameworks I am aware of.  The first is Seaside, written in Smalltalk, and the powere behind Dabble DB.  The other is Wee, written in Ruby.  Both languages have built in continuations. -- james 2006-02-25 00:50 UTC Hi James. There are several more out there -- for ruby (using built-in continuations), for java (using hacked-in continuations), and I'm sure others. And my own Continuity library (not quite a framework) allows continuation web programming in Perl using cpan:Coro. -- awwaiid 2006-02-25 08:44 UTC",{"id":588,"title":589,"titles":590,"content":45,"level":9},"\u002Fcomments-on-tlt-2006.02.24-blogified","Comments_on_TLT_-_2006.02.24_-_Blogified",[],{"id":592,"title":494,"titles":593,"content":594,"level":56},"\u002Fcomments-on-tlt-2006.02.24-blogified#_4-comments",[589],"Excellent timing! I finally started using an RSS reader. For now it's Safari. I tried Google Reader but there is no option to change the default which opens things in new windows. I suppose I could get a Firefox extension that just puts pop up windows in the same window, or even write some GreaseMonkey code to get it to work. But for now it's Safari. The only thing I really use Safari is for the RSS reader (I use Firefox for general web surfing). I still think there's got to be a better way out there for keeping track of news. -- Ben 2006-02-25 05:46 UTC You're teh dork. :) -- mousetrout 2006-02-25 06:05 UTC I know I'm a dork... I just can't help myself! Just wait till you come back to my page someday and see that I now have a gradient background in my header! Ben, I haven't found much of a good rss reader either. Lately I've been using email2rss to keep track of changes on my wiki's (which all have RSS feeds)... but this is only effective because there aren't all that many changes. -- awwaiid 2006-02-25 07:10 UTC Oh... and you'll REALLY know I'm a dork when someday you use Firefox 1.5 and see that I have two-column css turned on for journal entries! I'm not even sure I like it... its so strange... -- awwaiid 2006-02-25 07:14 UTC",{"id":596,"title":597,"titles":598,"content":45,"level":9},"\u002Fcomments-on-tlt-2006.02.25-bad-brock","Comments_on_TLT_-_2006.02.25_-_Bad_Brock",[],{"id":600,"title":443,"titles":601,"content":602,"level":56},"\u002Fcomments-on-tlt-2006.02.25-bad-brock#_3-comments",[597],"I just want to make sure that my comments are still working... -- awwaiid 2006-03-01 02:37 UTC And you did it again! Game for tonight or tomorrow?  I'll give a call after my class. -- mandies 2006-06-22 17:13 UTC Actuall this was stupid LJ's fault... or perhaps mine for not updating quickly enough. They eventually purged their records and then refreshed them, I'm guessing. -- awwaiid 2006-06-23 00:18 UTC",{"id":604,"title":605,"titles":606,"content":45,"level":9},"\u002Fcomments-on-tlt-2006.03.03-funky-function-filters","Comments_on_TLT_-_2006.03.03_-_Funky_Function_Filters",[],{"id":608,"title":494,"titles":609,"content":610,"level":56},"\u002Fcomments-on-tlt-2006.03.03-funky-function-filters#_4-comments",[605],"Perl6 will have a \"prove guido wrong\" operator. -- mid 2006-03-04 01:00 UTC haha. I wonder what unicode character it will be... maybe a circle-bar (anti-) symbol. Or maybe ☠. -- awwaiid 2006-03-04 04:21 UTC Try embedding a Scheme\u002FLisp interpreter. This will allow one\nto try extensions while keeping the core language simple. Neat Wiki, BTW Cheers, Bob -- bobmc.net 2006-03-05 00:03 UTC Thanks for the wiki compliment, Bob! Maybe I should just try programming everything in LISP\u002Fscheme in the first place :) -- awwaiid 2006-03-05 21:13 UTC",{"id":612,"title":613,"titles":614,"content":45,"level":9},"\u002Fcomments-on-tlt-2006.04.18-sinking-into-ocaml-continuations-madness","Comments_on_TLT_-_2006.04.18_-_Sinking_Into_OCaml_Continuations_Madness",[],{"id":616,"title":461,"titles":617,"content":618,"level":56},"\u002Fcomments-on-tlt-2006.04.18-sinking-into-ocaml-continuations-madness#_2-comments",[613],"Hi, I sent you an email about your OGPF project. I just thought I'd leave a comment to notify you here because I've had terrible luck with emailing people about genetic programming issues thus far (you'd be surprised at how terrible researchers are at responding to emails from people who actually bother to carefully read their papers!). Cheers! Warren Henning -- warren 2006-04-30 04:01 UTC I responded to your email but haven't heard back from you :) -- awwaiid 2006-05-02 22:36 UTC",{"id":620,"title":621,"titles":622,"content":45,"level":9},"\u002Fcomments-on-tlt-2006.05.05-dom-template-fantasy","Comments_on_TLT_-_2006.05.05_-_DOM_Template_Fantasy",[],{"id":624,"title":461,"titles":625,"content":626,"level":56},"\u002Fcomments-on-tlt-2006.05.05-dom-template-fantasy#_2-comments",[621],"That's beautiful. -- ab 2006-05-06 05:41 UTC Pretty slick! -- Anonymous 2006-05-06 14:02 UTC",{"id":628,"title":629,"titles":630,"content":45,"level":9},"\u002Fcomments-on-tlt-2006.07.30-cygwin-rocks","Comments_on_TLT_-_2006.07.30_-_Cygwin_Rocks",[],{"id":632,"title":403,"titles":633,"content":634,"level":56},"\u002Fcomments-on-tlt-2006.07.30-cygwin-rocks#_1-comment",[629],"If you like cygwin, you'll love poderosa. Check it out. -- q 2007-06-11 21:16 UTC",{"id":636,"title":637,"titles":638,"content":45,"level":9},"\u002Fcomments-on-tlt-2006.10.21-tempe-alien-landing-base-construction","Comments_on_TLT_-_2006.10.21_-_Tempe_Alien_Landing_Base_Construction",[],{"id":640,"title":443,"titles":641,"content":642,"level":56},"\u002Fcomments-on-tlt-2006.10.21-tempe-alien-landing-base-construction#_3-comments",[637],"You so completely fail. You know the subject of this post is actually \"People of Earth!\". -- mouset  2006-10-21 23:05 UTC Excellent timing, my friend. I just saw that today and wondered what it was. I was so distracted when I got over the bridge on Mill and to a red light, that I started to make a right-on-red turn and had gone one foot when the light turned green and all of the pedestrians darted out into the intersection. I slammed on my brakes immediately, but everyone honked or yelled at me, and probably didn't realize that I had started going before they did. The center for the arts is a really unusual sight. I, like you, am surprised I hadn't heard of it or seen drawings of it beforehand. I also notice a couple of giant cranes I didn't see earlier about halfway between University and Rio Salado. Downtown Tempe sure is growing quickly. -- Ben 2006-10-22 00:33 UTC You're right mandies! I fail, fail, fail... sob Thanks Ben! It freaks me out all the time too. I had put off looking it up for too long. -- awwaiid 2006-10-22 15:57 UTC",{"id":644,"title":645,"titles":646,"content":45,"level":9},"\u002Fcomments-on-tlt-2007.01.14-son-of-suckerfish-and-ie","Comments_on_TLT_-_2007.01.14_-_Son_Of_Suckerfish_and_IE",[],{"id":648,"title":461,"titles":649,"content":650,"level":56},"\u002Fcomments-on-tlt-2007.01.14-son-of-suckerfish-and-ie#_2-comments",[645],"Brilliant. I had the exact same problem and this fixed it. Thanks for posting this! -- Dan 2007-06-19 17:38 UTC You're welcome! -- awwaiid 2007-06-19 20:42 UTC",{"id":652,"title":653,"titles":654,"content":45,"level":9},"\u002Fcomments-on-tlt-2007.03.18-cheap-camera-and-kitties","Comments_on_TLT_-_2007.03.18_-_Cheap_Camera_and_Kitties",[],{"id":656,"title":403,"titles":657,"content":658,"level":56},"\u002Fcomments-on-tlt-2007.03.18-cheap-camera-and-kitties#_1-comment",[653],"Sweet!  That's the same camera I had ($10 little grey thing that takes 1 AAA battery).  I had a lto of fun with it before I lost it.  It'll take short movies, and I've posted a number of mine on http:\u002F\u002Fslowass.net\u002F~scott\u002F and in the photos directory, which I can't remember where I left as everything here is sorta in limbo. Congrats, and yes, more photos!  Oh, and I think it has 16megabits of RAM, or 2 megabytes.  Those EE types are trixie.  They used to do that video game carts. -scott -- scrottie 2007-04-03 20:52 UTC",{"id":660,"title":661,"titles":662,"content":45,"level":9},"\u002Fcomments-on-tlt-2007.04.11-note-to-self...-er...-google-calendar","Comments_on_TLT_-_2007.04.11_-_Note_to_Self..._er..._Google_Calendar",[],{"id":664,"title":494,"titles":665,"content":666,"level":56},"\u002Fcomments-on-tlt-2007.04.11-note-to-self...-er...-google-calendar#_4-comments",[661],"This is a really cool concept Brock! -- AJ 2007-04-12 18:22 UTC Nice captcha. use POSIX 'strftime';\nstrftime(\"%Y%m%d%H%M%S\"); -- theorbtwo 2007-04-23 23:06 UTC Thanks (for both the compliment and the code). I guess that's what happens when things start out as a one line shell script and turn into something slightly bigger... -- awwaiid 2007-04-24 05:13 UTC BTW, that works better as strftime(\"%Y%m%d%H%M%S\",localtime) (it demands the time argument). -- awwaiid 2007-09-07 15:20 UTC",{"id":668,"title":669,"titles":670,"content":45,"level":9},"\u002Fcomments-on-tlt-2007.11.30-mysql-row-level-security","Comments_on_TLT_-_2007.11.30_-_MySQL_Row_Level_Security",[],{"id":672,"title":403,"titles":673,"content":674,"level":56},"\u002Fcomments-on-tlt-2007.11.30-mysql-row-level-security#_1-comment",[669],"This is Grrrrreat! Tony the Tiger -- Anonymous 2008-07-01 15:16 UTC",{"id":676,"title":677,"titles":678,"content":45,"level":9},"\u002Fcomments-on-tlt-2008.06.30-more-photo-goodness","Comments_on_TLT_-_2008.06.30_-_More_Photo_Goodness",[],{"id":680,"title":403,"titles":681,"content":682,"level":56},"\u002Fcomments-on-tlt-2008.06.30-more-photo-goodness#_1-comment",[677],"Nice Potato Plants :-) -- ailanie 2008-07-10 18:49 UTC",{"id":684,"title":685,"titles":686,"content":45,"level":9},"\u002Fcomments-on-tlt-2008.07.08-walkabout","Comments_on_TLT_-_2008.07.08_-_Walkabout",[],{"id":688,"title":403,"titles":689,"content":690,"level":56},"\u002Fcomments-on-tlt-2008.07.08-walkabout#_1-comment",[685],"great walkabout notes! --- btw, if in DC area and want a walking companion any time, don't hesitate to ping me (though I'm mostly into jogging) ... ''(confession: main purpose of this is to test the Comment Count feature)'' — ''' ''^z'' ''' -- Mark Zimmermann 2008-08-11 11:53 UTC",{"id":692,"title":693,"titles":694,"content":45,"level":9},"\u002Fcomments-on-tlt-2008.11.29-dna-memory","Comments_on_TLT_-_2008.11.29_-_DNA_Memory",[],{"id":696,"title":461,"titles":697,"content":698,"level":56},"\u002Fcomments-on-tlt-2008.11.29-dna-memory#_2-comments",[693],"Thanks for adding links! -- awwaiid 2009-06-13 04:00 UTC You're very welcome. I hope that clears it up for future readers. -- Mortal 2009-06-13 22:08 UTC",{"id":700,"title":701,"titles":702,"content":45,"level":9},"\u002Fcomments-on-tlt-2009.11.15-the-internets-make-programming-easy","Comments_on_TLT_-_2009.11.15_-_The_Internets_Make_Programming_Easy",[],{"id":704,"title":461,"titles":705,"content":706,"level":56},"\u002Fcomments-on-tlt-2009.11.15-the-internets-make-programming-easy#_2-comments",[701],"The good ol C++.\nBtw, What's the g++ i see at the starting comment line of yr coding? -- melaleuca malaysia 2010-06-08 13:52 UTC I'm using the gcc toolchain, which is an opensouce compiler suite. g++ is the name of their C++ compiler. So... are you a real person, or just a very context aware advertisement? Your question is specific enough that I think I'll leave your name\u002Flink in any case :) -- awwaiid 2010-06-09 00:52 UTC",{"id":708,"title":709,"titles":710,"content":45,"level":9},"\u002Fcomments-on-tlt-2009.12.06-music-play","Comments_on_TLT_-_2009.12.06_-_Music_Play",[],{"id":712,"title":461,"titles":713,"content":714,"level":56},"\u002Fcomments-on-tlt-2009.12.06-music-play#_2-comments",[709],"But you added a flash mp3 player! -- e2thex 2010-06-04 21:37 UTC Eh? Is that good or bad? I'll add an HTML5 player someday :) -- awwaiid 2010-06-07 12:17 UTC",{"id":716,"title":717,"titles":718,"content":45,"level":9},"\u002Fcomments-on-tlt-2010.06.04-mercurial-bisect","Comments_on_TLT_-_2010.06.04_-_Mercurial_Bisect",[],{"id":720,"title":461,"titles":721,"content":722,"level":56},"\u002Fcomments-on-tlt-2010.06.04-mercurial-bisect#_2-comments",[717],"Hmmm, the documentation on mercurials wiki seems to be out of date. http:\u002F\u002Fmercurial.selenic.com\u002Fwiki\u002FBisectExtension?action=show When you run the test through -c is that using a static script from the initial revision or does that test need to be in all the revisions, possibly altering the script if it was changed in a previous revision?  I would think it uses a static script, in which case it would mean that you don't necessarily have to have the test in the 'good' revision but can create it after the fact. -- lungching 2010-06-09 12:32 UTC In the example I provided, my test case is actually located inside of my repository. Thus each execution is indeed running the version of the test from the currently selected revision. In this case I like that, because the test itself might have broken and I'd like to detect that case. If, however, you need a static test, you can just point to something outside of your repository and it should work the way you describe. -- awwaiid 2010-06-09 16:11 UTC",{"id":724,"title":725,"titles":726,"content":45,"level":9},"\u002Fcomments-on-tlt-2010.11.16-i-knew-a-girl","Comments_on_TLT_-_2010.11.16_-_I_Knew_A_Girl",[],{"id":728,"title":443,"titles":729,"content":730,"level":56},"\u002Fcomments-on-tlt-2010.11.16-i-knew-a-girl#_3-comments",[725],"Wonderful song, Brockers - I love it!! -- ailanie 2010-11-17 16:30 UTC Thanks! -- awwaiid 2010-12-07 03:52 UTC I really like that!  Very nice! -- lungching 2011-02-02 03:25 UTC",{"id":732,"title":733,"titles":734,"content":45,"level":9},"\u002Fcomments-on-tlt-2012.07.10-hi-eliza","Comments_on_TLT_-_2012.07.10_-_Hi_Eliza",[],{"id":736,"title":461,"titles":737,"content":738,"level":56},"\u002Fcomments-on-tlt-2012.07.10-hi-eliza#_2-comments",[733],"Clearly Eliza knows about my secret timemachine experiment! -- awwaiid 2012-07-11 11:33 UTC Funny, I was just reading some stuff about Eliza (and Parry) in an ancient AI book that gave all its example codes in BASIC. Fantastic stuff. -- BatmanAoD 2012-08-22 03:15 UTC",{"id":740,"title":741,"titles":742,"content":45,"level":9},"\u002Fcomments-on-tlt-2018.02.05-oddmuse-wiki-dockerized","Comments_on_TLT_-_2018.02.05_-_OddMuse_Wiki_Dockerized",[],{"id":744,"title":403,"titles":745,"content":746,"level":56},"\u002Fcomments-on-tlt-2018.02.05-oddmuse-wiki-dockerized#_1-comment",[741],"This is perfect timing for me ! I did something close with mine using apache a few months ago but I am not satisfied with it.\nI run it onto my SAN Synology box. See Oddmuse page for details on my recipe and see if we can make it better. -- XavierMaillard 2018-05-10 07:57 UTC",{"id":748,"title":749,"titles":750,"content":45,"level":9},"\u002Fcomments-on-talking-dc-vote-blues","Comments_on_Talking_DC_Vote_Blues",[],{"id":752,"title":403,"titles":753,"content":754,"level":56},"\u002Fcomments-on-talking-dc-vote-blues#_1-comment",[749],"Hey you, I would be happy to help with this! -- ailanie 2011-06-06 20:20 UTC",{"id":756,"title":757,"titles":758,"content":45,"level":9},"\u002Fcomments-on-the-haiku-game","Comments_on_The_Haiku_Game",[],{"id":760,"title":403,"titles":761,"content":762,"level":56},"\u002Fcomments-on-the-haiku-game#_1-comment",[757],"ah-hahaha. Why, that sounds like the greatest game EVAR! -- mandies 2006-06-01 04:54 UTC",{"id":764,"title":765,"titles":766,"content":45,"level":9},"\u002Fcomments-on-web-programming-with-contize","Comments_on_Web_Programming_With_Contize",[],{"id":768,"title":461,"titles":769,"content":770,"level":56},"\u002Fcomments-on-web-programming-with-contize#_2-comments",[765],"Regarding the session issue, my favorite web-based programming tool (cpan:HTML::Mason) has solved this a little better with an extension called cpan:MasonX::Request::WithApacheSession.  It's a lightweight wrapper around cpan:Apache::Session, such that you can store objects using the $m API: The only problem I've seen with this so far is that you can't store cpan:Class::DBI objects directly in the session, but that'll be a problem with any session handler, b\u002Fc of the way Class::DBI overloads various operators, like scalar(). Of course, this assumes you're using mod_perl on the backend, which, if you're using Mason, you probably are anyway.  Though it occurs to me that if you're using mod_perl, there may be a lighterweight way to go about all of this anyway. -- janjan 2004-10-12 23:12 UTC I love getting comments. Have I mentioned that? I tried Apache::Session, but my Contize objects do crazy magic just like cpan:Class::DBI. Integration with Mason would be super cool, it is now officially on my todo list :) As per mod_perl -- mod_perl is great and all, but I've been trying to make it so that it isn't necessary for my magic. The other implementations of continuation web programming, such as Seaside2, actually implement their own web-server. This makes their job of managing various continuations very easy, at the cost of tossing out Apache alltogether. -- awwaiid 2004-10-12 23:34 UTC",{"id":772,"title":773,"titles":774,"content":45,"level":9},"\u002Fcomments-on-wiki-home","Comments_on_Wiki_Home",[],{"id":776,"title":461,"titles":777,"content":45,"level":56},"\u002Fcomments-on-wiki-home#_2-comments",[773],{"id":779,"title":780,"titles":781,"content":782,"level":15},"\u002Fcomments-on-wiki-home#this-is-just-a-spot-to-put-comments-addressing-home","This is just a spot to put comments addressing Home.",[773],"Nice rabbit. -- awwaiid 2004-01-16 20:36 UTC Hey Brock, I am pretty sure this is the right Brock. This is Scott Worthy from High School. Thought I would see how things were going for you now. Looks pretty well. I really would like to catch up with you. Let me know if I have the right Brock Wilcox from Centennial and if you remember me. Looking forward to hear from you. Scott -- Anonymous 2007-07-17 17:07 UTC Oh, Email me back at Scottw1979@gmail.com -- Anonymous 2007-07-17 17:10 UTC",{"id":784,"title":785,"titles":786,"content":45,"level":9},"\u002Fcomments-on-wilcox-waddell-halloween-hayride","Comments_on_Wilcox_Waddell_Halloween_Hayride",[],{"id":788,"title":461,"titles":789,"content":790,"level":56},"\u002Fcomments-on-wilcox-waddell-halloween-hayride#_2-comments",[785],"Kay Rosson (Postmaster of Waddell for 30 years) said she donated to that wonderful hayride! (She is a little prejudiced being Kandy's mom and all).\nJerry Henson remembers the hayride well with fond memories! It would be fun to hear some of the child participants tell us how they remember it. -- Anonymous 2010-11-01 02:46 UTC Those WERE some fun times :) (from Kandy) -- Anonymous 2010-11-01 02:48 UTC",{"id":792,"title":793,"titles":794,"content":45,"level":9},"\u002Fcomments-on-zero-one-infinity","Comments_on_Zero_One_Infinity",[],{"id":796,"title":461,"titles":797,"content":798,"level":56},"\u002Fcomments-on-zero-one-infinity#_2-comments",[793],"See: Zero One Infinity At this point I hadn't written many Haikus. This one is an okay start... but I think it is a bit judgemental. More needs to be left to the reader to figure out. zero = one = infinity\nis one of my \"local equations\" designed to instigate human-class meta logic. Inherently any mathematical system is either too limited to say anything useful, or strong enough to make absurd proofs like \"this statement is false.\" -- thank Kurt Godel for the proof. So then, its up to us to use logic where it is strongest, and embrace human capacity to be nothing and everything. Often, I notice only a section of the equation is relevant... (zero=one) or (infinity=zero). Gives me poetic perspective that rises above the simple contradictions... p.s. good thing I know oddmuse so I could figure out your cats' name. You can either turn off comments, or use a question everyone will know. Also, there is a module to hide the wiki links when you are not logged in as an editor. -- PhillipReay 2009-02-05 22:26 UTC Thanks PhillipReay! I had forgotten that I locked down my wiki... I got mad at some spammers who learned the normal answers. I'll have to loosen it up a bit... -- awwaiid 2009-02-07 23:36 UTC",{"id":800,"title":801,"titles":802,"content":803,"level":9},"\u002Fcommunity-vs-content","Community_vs_Content",[],"Quoting with permission, March 20, 2004: He saw Meatball as document-centric, and I see it as community-centric.\n\n But I'm apparently post-modern and therefore unintelligible.\n\n are those really opposing views?\n\n no\n\n A community-centric viewpoint covers a document-centric one\n\n a community made up of documents\n\n But you have to really understand what it means for things to be socially constructed to know why this theory is more powerful and more applicable.\n\n no, the community \nwrites\n the documents\n\n I understand social construction\n\n The documents don't just appear.\n\n So who ultimately is reading and writing the documents? the community. Therefore, the community is more important than their output.\n\n At least to the survival of both the community and the corpus of the documents.\n\n but can the community be identified without the side-effect of the documents?\n\n The documents don't grow by themselves, in other words, so they cannot be given priority to the community who maintains, upgrades, protects, defends, organizes, and otherwises \ndoes\n stuff to the documents\n\n that's the interesting thing about community online\n\n everything goes through text.\n\n ya\n\n I call it \"LifeInText\"\n\n and that gives the community online properties missing in normal community\n\n and takes some away, I'd say\n\n LifeInText is the same collapse as software (machine and data)\n\n yes\n\n and software is less than machine and material; shucker and conr.\n\n corn\n\n in some ways, i mean\n\n shucker and corn?\n\n just a type of machine\n\n oh. I know what you mean now.\n\n but post-modernism also includes modernism\n\n so my community-centric view will also include a document-centric view\n\n (though i might say software is more than machine + data)\n\n and also a style-centric\n\n chat-centric\n\n ya\n\n software is interesting in that while all information is both bits + encoding, software makes the encoding also bits\n\n though your analogy seems to be becoming inappropriate when comparing post-modern=community, modern=document-centric, etc\n\n software then incorporates time\n\n post-modernism is highly community-oriented.\n\n certainly I see that\n\n that's because it prioritizes social forces rather than external objective realities.\n\n I'm just saying the analogy seems a bit fishy, and not necessary for your viewpoint\n\n yes, I see what you are getting at\n\n well, the document-centric viewpoint presupposes a Truth, or at least a measure of truth.\n\n how so?\n\n Well, it figures what is written down is fact; or valuable as a truth\n\n I don't see why a document-centric view couldnt' itself be twisted into a postmodern stance\n\n but in a wiki things change\n\n whereas I would claim that nothing on the wiki is intelligible without the community to decode it.\n\n which is another reason why copylefting a living wiki is dumb; no one else can read it.\n\n okay\n\n also, modernism looks as the people as a group of individuals.\n\n what restriction that copylefting imposes would stop others from reading it?\n\n so the individuals come to the wiki to read the documents to learn something, and then they go away (think \"software manual\").\n\n individuals also come and may add things to the wiki because all individuals will be motivated to do so (i have no idea why people think this)\nSunir will get to your question in a sec\n k\n\n but a community-centric viewpoint sees the corpus as primarily a conversation and dialectic between people who care about one another with a common sense of identity; a MeatBall:CommonContext and a MeatBall:SuperordinateGoal\n\n -> \nhttp:\u002F\u002Fwww.usemod.com\u002Fcgi-bin\u002Fmb.pl?SuperordinateGoal\n MeatBall:CommonContext\n\n -> \nhttp:\u002F\u002Fwww.usemod.com\u002Fcgi-bin\u002Fmb.pl?CommonContext\n Which is why we have the MeatBall:BarnRaising motto\n\n -> \nhttp:\u002F\u002Fwww.usemod.com\u002Fcgi-bin\u002Fmb.pl?BarnRaising\n the text on the wiki is primarily useful for aiding discussion within the community\n\n it's a vocabulary for them\n\n and since a wiki is so perfect for this (page names are concepts), it works out well for us\n\n ya\n\n social construction of meaning\n\n which is why you need the community to decode the text; it's not very clear to outside observers.\n\n trust me, most people don't understand what we write\n\n ok, onto your question\n\n Copylefting doesn't stop people from accessing the text.\n\n I see. So by the time they understand the wiki they are basically part of the community, sharing the common language\n\n it's just that they can't understand what we write without the MeatBall:CommunityLore that helps decode what we're talking about\n\n -> \nhttp:\u002F\u002Fwww.usemod.com\u002Fcgi-bin\u002Fmb.pl?CommunityLore\n right, except by reading a copy, they lose the ability to communicate with the community.\n\n the text and the community are one\n\n LifeInText\n\n so, this is all disturbingly post-modern, I guess. it just makes sense to me as the plum obvious truth of it all.\n\n but i'm secretly modernist. ;)\n\n ha\n\n \"plum obvious truth\"\n\n \nchuckle\n Well I appreciate you sharing your perspective with me.\n\n i hope it was enlightening\nSee Alsohttp:\u002F\u002Fwww.usemod.com\u002Fcgi-bin\u002Fmb.pl?CommunityOverContenthttp:\u002F\u002Fwww.usemod.com\u002Fcgi-bin\u002Fmb.pl?ContentOverCommunity",{"id":805,"title":806,"titles":807,"content":808,"level":9},"\u002Fcomputer-science-papers","Computer_Science_Papers",[],"http:\u002F\u002Flanl.arxiv.org\u002Fabs\u002Fcs.DS\u002F0603077",{"id":810,"title":811,"titles":812,"content":813,"level":9},"\u002Fcontextual-webapp-language","Contextual_Webapp_Language",[],"I like to think of programming as language-building. You are using standard ways to extend the programming language you are working in, building up something that expresses the algorithms of your domain. Recast MVC into the world of HTML\u002FCSS. The HTML is supposed to describe how things fit together logically, the CSS makes it pretty. In a database frontend app, you could just let people edit the DB directly, perhaps with some updateable views. But we want it pretty, so we wrap layout forms around it. arg. so many thoughts in my brain, so little time to record them let alone implement them!",{"id":815,"title":816,"titles":817,"content":45,"level":9},"\u002Fcontinuation-based-web-programming","Continuation-based_Web_Programming",[],{"id":819,"title":820,"titles":821,"content":822,"level":15},"\u002Fcontinuation-based-web-programming#web-programming-is-dead","Web Programming is Dead!",[816],"Web programming sucks. For those of you who have not done any, lemme tell you... no fun. For those of you who have you may not realize the pain you're putting yourself through. Imagine that you are writing a GUI application... only every time someone pushes a button the whole program must exit and be re-started. On exit you have to save your current state somewhere, and on re-entry you have to reload the state again. It is only then that you get to find out which button someone pressed, and what else changed on the display at that moment (in text boxes and such). It gets worse. The user of your application can also request that you go back in time to a previous state. This is web-programming. Programmers make up for this by automating away most of their lives... they have magical ways to make a variable exist from one invocation of the program to another. They create state machines (aka workflows) which help them manage where in the overall application they are and where they want to go.",{"id":824,"title":825,"titles":826,"content":827,"level":15},"\u002Fcontinuation-based-web-programming#long-live-web-programming","Long Live Web Programming!",[816],"High level programming languages are meant to move beyond such limitations, however. We don't think of a TCP connection as a series of packets... and similarly there is no reason should we think of a http connection as a series of pages\u002Ftransactions. The difficulty in CGI programs is that they are exited and restarted with every transfer of information. So what we need is a way of getting the program back into the exact same spot it was in before it exited, plus the new input. The most elegant way to do attain this is through a programming system which somehow supports Continuations. The language itself might support continuations, which makes the whole thing much easier. In a continuation-like system the programming style is a bit different. Here is an example... we will display a page asking for a number, then a second page asking for another number, and finally a third page displaying their total (perlish-pseudo-code). The flow of this program is obvious. The strange bit is that the calls to getNum actually halt the entire program, waiting for a response. Once a response is attained the program picks up where it left off, processing the result and returning the given number.",{"id":829,"title":830,"titles":831,"content":832,"level":15},"\u002Fcontinuation-based-web-programming#also-see","Also See",[816],"http:\u002F\u002Fbitsko.slc.ut.us\u002Fblog\u002Fprevalent-continuations.htmlhttp:\u002F\u002Fwww.cincomsmalltalk.com\u002Fuserblogs\u002Favi\u002FblogView - HREF Considered Harmful, a log discussing this (mostly Seaside)http:\u002F\u002Fwww.beta4.com\u002Fseaside2\u002F - Seaside, a smalltalk continuation-based web programming thingiehttp:\u002F\u002Fwww.perl.org.il\u002Fpipermail\u002Fperl\u002F2004-March\u002F004562.htmlcpan:Coro::Conthttp:\u002F\u002Flib1.store.vip.sc5.yahoo.com\u002Flib\u002Fpaulgraham\u002Fbbnexcerpts.txthttp:\u002F\u002Fwww.braino.org\u002Fblog\u002Farchives\u002F000738.phphttp:\u002F\u002Flibrary.readscheme.org\u002Fpage6.htmlhttp:\u002F\u002Fwww.manageability.org\u002Fblog\u002Fstuff\u002Fweb-based-continuations\u002Fviewhttp:\u002F\u002Fwww.sidhe.org\u002F~dan\u002Fblog\u002Farchives\u002F000156.htmlhttp:\u002F\u002Fwww.webweavertech.com\u002Fovidiu\u002Fweblog\u002Farchives\u002F000042.htmlhttp:\u002F\u002Fwww.ds9a.nl\u002Fwebcoding.html - A discussion on the same topic, but they are calling it \"Synchronous Web Programming\"http:\u002F\u002Fcsoki.ki.iif.hu\u002F~vitezg\u002Fimpostor\u002F - An implementation of \"Synchronous Web Programming\"",{"id":834,"title":835,"titles":836,"content":837,"level":9},"\u002Fcontinuations-not-harmful","Continuations_Not_Harmful",[],"There has been a debate recently about the harmfulness of continuations, specifically in a web-context. Gilad Bracha Will Continuations continue (Thursday May 18, 2006) \"Summary: In the short term, continuation based web servers are very nice. Seaside is the nicest one I’ve seen. But ultimately they are just a phase, and we can already see how we will outgrow that phase. Since continuation-based servers won’t be all that significant in the long term, and given the huge lead times and costs of adding continuations to the JVM, it makes little sense to support them.\" Ian Griffiths Continuations for User Journeys in Web Applications Considered Harmful (5\u002F21\u002F2006) - IanG gives a short introduction to continuations, showing how it is useful over HTTP. Then he cites several things which make it a bad idea: Abandoned sessions, thread affinity, web farms, back button breaking, and browser-branching breaking. Avi Bryant Ongoing Continuations (May 21st, 2006) \"Ultimately, I think all three models - state via REST, state via continuations or closures, state via Ajax - are important, and the job of a good web developer is to choose, for each user interaction, when to use which one.\" Tim Bray Continuations and GUIs (2006\u002F05\u002F21) \"This notion, that the Web GUI is insufficiently interactive and we need something richer, is widely held among developers and almost never among actual users of computers, and it’s entirely wrong.\" Joe Duffy Continuations down the drain. Stacks to follow? (May 20, 2006) \"... I now realize something important: the stack is evil. It's a horrible representation of state, especially for web applications.\" basically message-passing instead of function-calls? David Megginson  Continuations, cont’d (5\u002F20\u002F2006) \"The REST people are right, at least on this point: there’s no need to drive a continuation bulldozer through your webapp, when a little REST garden spade will work quite nicely (and won’t tear up your lawn in the process).\" Curtis Poe Sapir-Whorf is not a Klingon (May 21, 2006) \"My friend did not understand closures because most of his work was with Java, Prolog and C (static variables don’t count).\" and \"Frankly, my jaw dropped when I read that. He can’t be serious that the main reason for continuations is a particular breed of Web server, can he?\" Simon Brocklehurst Tim Bray Says Web User Interfaces Are Great. I Beg To Differ. (May 21st, 2006) \"However, my argument is that “easy to learn” is only half of what you need to create a great user interface. The other half of the equation is what I call, “easy to use“; and this is where web GUIs often fall down… and fall down big-time.\"",{"id":839,"title":840,"titles":841,"content":842,"level":9},"\u002Fcontinuity","Continuity",[],"I think maybe this is outdated. You should go over to the continuity website now.",{"id":844,"title":845,"titles":846,"content":847,"level":15},"\u002Fcontinuity#continuation-based-web-programming-library-for-perl","Continuation-Based Web-Programming Library for Perl",[840],"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: 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. 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 Contize 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.",{"id":849,"title":850,"titles":851,"content":852,"level":15},"\u002Fcontinuity#tutorial","Tutorial",[840],"Some of you don't want to hear so much discussion... you'd rather see code. So I've started a Continuity Tutorials page so that you can dive right in. Have fun.",{"id":854,"title":855,"titles":856,"content":857,"level":15},"\u002Fcontinuity#development","Development",[840],"Notes \u002F Ideas: Use cpan:Pixie to store stuff, or rip their storage code. Should work better than the way I'm doing it now.ClassDBI-Aware TemplatesDOM Templates and AJAX",{"id":859,"title":860,"titles":861,"content":862,"level":15},"\u002Fcontinuity#comments-contact","Comments \u002F Contact",[840],"For comments there is a link at the bottom of this page, but also feel free to email me questions and thoughts (mailto: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.",{"id":864,"title":865,"titles":866,"content":867,"level":15},"\u002Fcontinuity#related-similar-stuff","Related \u002F Similar Stuff",[840],"http:\u002F\u002Fwww.beta4.com\u002Fseaside2\u002F - Seaside2, a smalltalk continuation-based web programming thingiehttp:\u002F\u002Fborges.rubyforge.org\u002F - Seaside2, ported to Ruby. pretty much.http:\u002F\u002Fcsoki.ki.iif.hu\u002F~vitezg\u002Fimpostor\u002F - A similar framework for Python. They use an Apache module though... cheating I'd say :)http:\u002F\u002Frubyforge.org\u002Fprojects\u002Fwee\u002F - Another Ruby framework... this one doesn't necessarily need continuations, getting by with a nice callback and state serialization system",{"id":869,"title":870,"titles":871,"content":872,"level":15},"\u002Fcontinuity#see-also","See Also",[840],"cpan:Continuity - CPAN entry for this projectContizeWeb Programming With ContizeEPFarms Panelhttp:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002FContinuity\u002F - Current sourcecodehttp:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002FContinuity\u002Feg\u002Fanimals\u002F - Animals example (in progress)http:\u002F\u002Fthelackthereof.org\u002Fdev\u002Fguess\u002F - Guessing Game demohttp:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002FContinuity\u002Feg\u002Fguess\u002F - Guessing game example sourcehttp:\u002F\u002Ffreshmeat.net\u002Fprojects\u002Fcontinuityperl\u002F - Freshmeat entry",{"id":874,"title":875,"titles":876,"content":877,"level":9},"\u002Fcontinuity-monitor","Continuity_Monitor",[],"This, along with Continuity::Monitor::CGI, allows you to inspect a running web application.",{"id":879,"title":880,"titles":881,"content":882,"level":15},"\u002Fcontinuity-monitor#development-code","Development Code",[875],"Get the code: darcs get http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002FContinuity-Monitor",{"id":884,"title":885,"titles":886,"content":887,"level":15},"\u002Fcontinuity-monitor#ppw-2008-presentation","PPW 2008 Presentation",[875],"I presented this module at PPW 2008 to about 30 people. If you missed it you can get the PPW 2008 Continuity-Monitor Slides. Here is the abstract: One 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\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\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 :)",{"id":889,"title":890,"titles":891,"content":45,"level":9},"\u002Fcontinuity-tutorials","Continuity Tutorials",[],{"id":893,"title":894,"titles":895,"content":896,"level":15},"\u002Fcontinuity-tutorials#do-as-i-do","Do As I Do",[890],"Let's try a simple method. I'll show you code, then I'll talk about it. Here is our first example... it isn't exactly a hello world but it'll do. Here we have two modules going, and in fact you may want to split this into two scripts. All this program does is prompt for a first number, then prompt for a second number, and then show the sum. Very boring, but lovely for pointing out some features. Let's go by way of execution-flow. First, besides doing some declaration stuff, let's look at the Main package. Here we create a new Continuity object, and give it some settings. There is only one mandatory parameter, appname. This corresponds to the name of our class, the one which actually holds the application. This one is named Addnums, and you can see its definition above. Addnums doesn't want to worry about printing the standard html header, nor does it want to print out the form tags, so we ask Continuity to take care of these things. Once we have our Continuity object set up, and have named it $c, we tell it to GO! And that it does. html pre.shiki code .s8-w5, html code.shiki .s8-w5{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sz2Vg, html code.shiki .sz2Vg{--shiki-default:#6F42C1;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sq6CD, html code.shiki .sq6CD{--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sTrkL, html code.shiki .sTrkL{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"id":898,"title":899,"titles":900,"content":901,"level":9},"\u002Fcontinuity-psgi","Continuity-PSGI",[],"Then execute with \"plackup blah.pl\". This will work by magically overriding ->loop to return a subref, so when blah.pl is eval'ed it will actually do some magical inversion-of-control.",{"id":903,"title":904,"titles":905,"content":45,"level":9},"\u002Fcontize","Contize",[],{"id":907,"title":908,"titles":909,"content":910,"level":15},"\u002Fcontize#fake-continuations-for-a-perl-object","Fake Continuations for a Perl Object",[904],"NOTE: I'm not doing any active work on this project. This project spawned Continuity and that's where I've followed it :) 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. 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 Continuation-based Web Programming in Perl CGI programs (See Web Programming With Contize. 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! 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). As a much larger example, and also to work out more problems (both conceptual and practical) I am working on EPFarms Panel as a testbed application for this method and this module.",{"id":912,"title":870,"titles":913,"content":914,"level":15},"\u002Fcontize#see-also",[904],"cpan:Contize on CPANWeb Programming With ContizeContinuation-based Web Programming",{"id":916,"title":917,"titles":918,"content":919,"level":9},"\u002Fcontributing","Contributing",[],"I welcome contributions to the projects on this site. That's part of why I make them all opensource -- share and share alike :) . I want to make it easy to do so -- here are some ways: Most of my projects are stored in darcs\ndarcs get http:\u002F\u002Fthelackthereof.org\u002Fproject\u002FprojectnameHack hack hackdarcs recdarcs send \u002F darcs diff \u002F diff + email \u002F ask me to pull I've also been mirroring stuff via github lately. I'll happily accept pull requests, patches, text descriptions of a change, or whatever you've got :) Email to: awwaiid@thelackthereof.org",{"id":921,"title":107,"titles":922,"content":923,"level":9},"\u002Fcoro",[],"Coro is a bad-ass Perl library that adds coroutines to perl5! See it on CPAN at http:\u002F\u002Fsearch.cpan.org\u002Fperldoc?Coro",{"id":925,"title":926,"titles":927,"content":928,"level":9},"\u002Fcorrespondence-college-of-codecraft","Correspondence_College_of_Codecraft",[],"Greetings! Welcome to The Lack Thereof's Correspondence College of Codecraft. This program is a customized self-study system for learning the art and science of computer programming and related technology. We take the unique approach of utilizing traditional \"snail\" mail for delivery of lessons, though we do offer feedback and other elements via electronic means.",{"id":930,"title":931,"titles":932,"content":933,"level":15},"\u002Fcorrespondence-college-of-codecraft#why-snail-mail","Why Snail Mail?",[926],"Good question! Modern internet-based lessons, even many modern books, offer the source code for the lesson in a digital form. While it is convenient for the student to copy-paste or directly save the sample code for the lesson, we feel that the act of manually typing the lesson in allows the pupil's fingers to learn what it feels like to write a program. It isn't possible to enter a program, either one received through correspondence or one of your own design, without mistakes. As the student finds and fixes mistakes they will learn one of the most essential aspects of programming -- debugging. The student will also have the opportunity to take shortcuts and make minor modifications while entering the program, which is the beginning of creative alterations and eventually full on software designing. And of course... because it's fun!",{"id":935,"title":936,"titles":937,"content":938,"level":15},"\u002Fcorrespondence-college-of-codecraft#what-will-students-learn","What will students learn?",[926],"Our hope is to provide a solid foundation for students in their area of interest, ultimately guiding them toward expert level knowledge. The first set of lessons are designed to build this foundation for all students, while later lessons are customized per-student. Students will first learn how to write interactive text-based programs.",{"id":940,"title":941,"titles":942,"content":943,"level":15},"\u002Fcorrespondence-college-of-codecraft#what-about-advanced-lessons","What about advanced lessons?",[926],"Currently the college is only offering beginning lessons. As our student base advances we will continuously consider the most appropriate mechanism to best push their knowledge forward. But for now we are starting with snail mail correspondence of beginner-level lessons only.",{"id":945,"title":946,"titles":947,"content":948,"level":15},"\u002Fcorrespondence-college-of-codecraft#what-language-do-you-teach","What language do you teach?",[926],"Currently we teach Perl, but we are happy to consider other languages and technologies depending on student interest and needs. Perl has been selected both for the forgiving nature of the language and since it is currently being used in various projects by the school's staff.",{"id":950,"title":951,"titles":952,"content":953,"level":15},"\u002Fcorrespondence-college-of-codecraft#how-do-i-apply","How do I apply?",[926],"Please send an email to codecraft@thelackthereof.org describing your interests and current level of knowledge. Provide us with enough information to get a feel for your level of commitment. We will evaluate your application and decide within two weeks if we are an appropriate match for one another. You may, of course, also send your application via post to: Brock Wilcox\nThe Lack Thereof Correspondence College of Codecraft\n2130 P Street NW #509\nWashington, DC 20037",{"id":955,"title":956,"titles":957,"content":958,"level":15},"\u002Fcorrespondence-college-of-codecraft#how-much-does-it-cost","How much does it cost?",[926],"We work on a sliding scale depending on the student. Please indicate in your application what rate you believe fits with your current situation.",{"id":960,"title":961,"titles":962,"content":963,"level":15},"\u002Fcorrespondence-college-of-codecraft#i-have-more-questions","I have more questions!",[926],"Please email awwaiid@thelackthereof.org and we'll do our best to answer!",{"id":965,"title":966,"titles":967,"content":968,"level":9},"\u002Fcovid-can-i-do-it","COVID Can I Do It",[],"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.",{"id":970,"title":971,"titles":972,"content":973,"level":9},"\u002Fcreate-tracker-item","Create_Tracker_Item",[],"Use this form to create a new tracker item. You may also want to look at the Tracker Status page for an overview of tracker items, or the Tracker Search page for advanced tracker searching. td {\n    border: 0;\n  }\n\n  \n    \n      Title\n      Project\n    \n    \n      \u003C!--\nvar date = new Date();\nvar d  = date.getDate();\nvar day = (d \u003C 10) ? '0' + d : d;\nvar m = date.getMonth() + 1;\nvar month = (m \u003C 10) ? '0' + m : m;\nvar yy = date.getYear();\nvar year = (yy \u003C 1000) ? yy + 1900 : yy;\n\ndocument.write(\"\u003Cinput type=text id=titlefield name=title size=50 value='TRACKER - \" + year + \".\" + month + \".\" + day + \" - '>\u003Cbr>\");\ndocument.getElementById('titlefield').focus();\n\u002F\u002F-->\n\n      \n      \n            Other\n            Timesheet\n          \n    \n    \n      Description\n       \n    \n    \n      \n    \n  Project: projectStatus: status (open, closed)description\n\">",{"id":975,"title":976,"titles":977,"content":978,"level":9},"\u002Fcurried-wild-rice-and-squash-soup","Curried_Wild_Rice_and_Squash_Soup",[],"From allrecipes.com, submitted by Connie Dempsey.",{"id":980,"title":981,"titles":982,"content":983,"level":15},"\u002Fcurried-wild-rice-and-squash-soup#ingredients","INGREDIENTS",[976],"1 cup uncooked wild rice3 cups water2 1\u002F2 pounds butternut squash - peeled, seeded, and cubed2 1\u002F2 cups chicken broth1\u002F2 cup orange juice2 tablespoons butter1 medium onion, chopped1 clove garlic, finely chopped1 1\u002F2 teaspoons curry powder1 1\u002F4 teaspoons salt1\u002F2 teaspoon ground black pepper",{"id":985,"title":986,"titles":987,"content":45,"level":15},"\u002Fcurried-wild-rice-and-squash-soup#directions","DIRECTIONS",[976],{"id":989,"title":990,"titles":991,"content":45,"level":9},"\u002Fcurried-wild-rice-and-squash-soup#in-a-pot-bring-the-wild-rice-and-water-to-a-boil-reduce-heat-to-low-cover-and-simmer-45-minutes","In a pot, bring the wild rice and water to a boil. Reduce heat to low, cover, and simmer 45 minutes.",[],{"id":993,"title":994,"titles":995,"content":45,"level":9},"\u002Fcurried-wild-rice-and-squash-soup#place-the-squash-in-a-medium-pot-with-enough-water-to-cover-and-bring-to-a-boil-cook-15-minutes-or-until-tender-drain-return-to-the-pot-and-mash-mix-in-the-chicken-broth-and-orange-juice","Place the squash in a medium pot with enough water to cover, and bring to a boil. Cook 15 minutes, or until tender. Drain, return to the pot, and mash. Mix in the chicken broth and orange juice.",[],{"id":997,"title":998,"titles":999,"content":45,"level":9},"\u002Fcurried-wild-rice-and-squash-soup#melt-the-butter-in-a-skillet-over-medium-heat-and-saute-the-onion-and-garlic-until-tender-season-with-the-curry-powder-reduce-heat-to-low-and-continue-cooking-about-12-minutes-stirring-occasionally","Melt the butter in a skillet over medium heat, and saute the onion and garlic until tender. Season with the curry powder. Reduce heat to low, and continue cooking about 12 minutes, stirring occasionally.",[],{"id":1001,"title":1002,"titles":1003,"content":45,"level":9},"\u002Fcurried-wild-rice-and-squash-soup#in-a-blender-or-food-processor-blend-the-squash-and-broth-with-the-onion-and-garlic-mixture-until-smooth-return-to-the-medium-pot-mix-in-the-cooked-wild-rice-and-cook-until-heated-through-season-with-salt-and-pepper-to-serve","In a blender or food processor, blend the squash and broth with the onion and garlic mixture until smooth. Return to the medium pot, mix in the cooked wild rice, and cook until heated through. Season with salt and pepper to serve.",[],{"id":1005,"title":1006,"titles":1007,"content":1008,"level":9},"\u002Fdhtml-combo","DHTML_Combo",[],"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. This depends on the lovely behaviour.js library. It is a light dependency -- easily removed probably. But I like it and recommend you use it for other stuff anyway! See a demo at http:\u002F\u002Fthelackthereof.org\u002Fdev\u002Fdhtml_combo\u002Fcombo.html Get the code: darcs get http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fjavascript\u002Fdhtml_combo",{"id":1010,"title":1011,"titles":1012,"content":1013,"level":9},"\u002Fdom-templates","DOM_Templates",[],"Here's an idea (and a project) that others have sort-of started doing -- DOM based templates.",{"id":1015,"title":1016,"titles":1017,"content":1018,"level":9},"\u002Fdom-templates-and-ajax","DOM_Templates_and_AJAX",[],"Part of the new Javascript craze is a combination of two things:",{"id":1020,"title":1021,"titles":1022,"content":45,"level":9},"\u002Fdom-templates-and-ajax#xmlhttpget-fetch-xmlhtml-in-the-background","XmlHttpGet - fetch XML\u002FHTML in the background",[],{"id":1024,"title":1025,"titles":1026,"content":1027,"level":9},"\u002Fdom-templates-and-ajax#manipulate-the-dom-using-the-above-xml-get-to-infuse-new-data-onto-the-currently-views-page","Manipulate the DOM, using the above XML get to infuse new data onto the currently views page",[],"The combination means that small parts of the screen can be updated without doing a full refresh, creating a smoother user experience. There are issues using this technique, however. The one which is already coming up is use of the 'back' button, though that is an issue for web application programming in general. Another is having two codebases -- one which uses this technique on new browsers and one which always uses full-page refreshes for older browsers. I've worked out a technique which will allow us to keep this feature and degrade and keep the back button. To do this you need an intelligent templating engine (server-side), which I call the Infusor. The infusor starts with a template as a base, and then infuses DOM changes provided by the rest of your program. The infusor is aware of the context of the request, and whether the browser is expecting a full page or just DOM updates. Correspondingly, there is a bit of javascript running on the client which passes extra parameters to the script letting it know to return just DOM changes, and then accepts and incorporates those DOM changes. The js is installed only on browsers which can handle the whole feature set required. If the client, for example, turns off javascript in the middle of a session with the application there is no issue. The Infusor does not get the extra parameter requesting DOM changes and instead sends the entire content. Like magic we degrade gracefully. The same is true if javascript is off and then suddenly gets turned on again. As to the back button -- we take a page from continuation-based web programming here. Each output gets a unique page ID. If the infusor is asked to output the same page ID a second time, it sends the entire page instead of the DOM update. This method does require that the Infusor manages its state between requests, but that is another problem to be solved and there are other techniques available to solve it. I personally prefer using continuations to invert the control flow of a program, and this Infusor technique works well in that context. digraph {\n  \"Base Template\" -> Infusor;\n  Infusor -> \"Client Web Browser\";\n  \"Client Web Browser\" -> \"Processing Loop\";\n  \"Processing Loop\" -> Infusor;\n}",{"id":1029,"title":1030,"titles":1031,"content":45,"level":9},"\u002Fdarcs","Darcs",[],{"id":1033,"title":1034,"titles":1035,"content":1036,"level":15},"\u002Fdarcs#davids-advanced-revision-control-system","David's Advanced Revision Control System",[1030],"Darcs is a neat CVS replacement with a cleaner philosophy backing its system of patches. I will probably be using Darcs from now on in my projects and perhaps some of my documents. If you find one of my project directories contains a subdir named '_darcs' then you know you can use darcs to join me in development. For example, you can do 'darcs get http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fsetdb' to get a copy of SetDB. After that you can use 'darcs pull http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fsetdb' to get changes. There are ways for you to email me your patches, but I don't know them yet.",{"id":1038,"title":1039,"titles":1040,"content":1041,"level":9},"\u002Fdata-backup-plan","Data_Backup_Plan",[],"Remember this rule: If you do not have a backup, GO MAKE ONE NOW! Increasingly, many of my most precious belongings are digital. I'm a packrat (thanks Mom!) but I live out my packrat-fantasies via the digital realm. So I try to keep all my email, photos, music, documents, and so on... forever.",{"id":1043,"title":1044,"titles":1045,"content":1046,"level":15},"\u002Fdata-backup-plan#classes-of-data","Classes of Data",[1039],"(IS) Important and Small - email, tax forms, this website(IL) Important and Large - The uncompressed version of home-made Music, Photos(RL) Replaceable and Large - MP3s, movies(UL) Unsorted Importance and Large - Full machine backups, both laptop and mobile phone",{"id":1048,"title":1049,"titles":1050,"content":1051,"level":15},"\u002Fdata-backup-plan#plans","Plans",[1039],"Unison for IS\nLaptop -> Margaret (local) and Mirabel (offsite)Unison for UL of laptops\nMy and Beth's laptops -> Margaret (local)Rsync for UL of phones (because I can't get unison (yet))\nMy phone -> Margaret (local)Not automated yet!Mirror drives for IL, UL, and RL on Margaret So the current major hole in my setup is the lack of automation of phone backups, and the lack of offsite storage for all of the \"Large\" classes.",{"id":1053,"title":1054,"titles":1055,"content":45,"level":9},"\u002Fdavid-prolog","David_Prolog",[],{"id":1057,"title":1058,"titles":1059,"content":45,"level":9},"\u002Fdavid-scheme","David_Scheme",[],{"id":1061,"title":1062,"titles":1063,"content":1064,"level":9},"\u002Fdeath-star","Death_Star",[],"The Death Star is interesting and all... but what is even COOLER is the song by The Presidents of the United States of America. It is the coolest song ever! Its the death star\nSomething so incredible!\nDeath star,\nsomething indestructable\ndeath star,\nmassive and meniachal!\n... Goodbye death star.",{"id":1066,"title":1067,"titles":1068,"content":1069,"level":9},"\u002Fdebugging-techniques","Debugging_Techniques",[],"A brain-dump of various approaches to debugging (code) things that I like. Development is mostly debugging\nYou could even say that it is ALL debuggingImplementing a feature is fixing the lack of that featureTypes of bugs\nSyntax500 server errorUnexpected outputLegit issue that is not communicated to the user wellConfiguration issue -- routes, library setupSecurity issueGenerally undesired behaviorRead the documentation\n\"Use The Source, Luke\" -- Wise SageDead Debugging vs Live Debugging\nDead Debugging -- you can't (easily) run the code or modified versionsLive Debugging -- make a change, see result, breakpoints, everythingWhat's even happening\nBuild your feedback loop\nWrite log entries to SEE what is happening instead of guessingBuild shortcut to getting to the critical point\nThis is a great spot for leveraging unit\u002Ffeature specsHave a fast way to re-start -- like a save point in a gameRe-send XHR in browser, or open in new tab! Copy Curl command!Get some visibility\nYou can't debug what you can't observe or inferObserving is easier than inferringLog-based debugging (print \"here\")Debugger-based debugging (binding.pry)Why is it this way anyway?\nRevision control ... did someone do this on purpose?State -- Best friend. Worst enemy.\nThink about inputs, outputs, and stateLocal variables, parameters, scoped variables, global variablesLook at the actual database \u002F storage\nThe state that exists even when your program isn't runningState CHANGES over TIME\nThis is why multi-process debugging is so hard... competing timelinesModel the world. Beware of assumptions!\nDon't assume!\nLOOK at the contents of variablesRUN methods and see what they returnLOOK at the code you're calling and what calls youVERIFY that it's even running this code at allLOOK at the revision history to get some time-context\nDid this change recently?Was this put here on purpose?Look at the annotation, the commits, the commit-messages, the linked ticketsVerify assumptions\nAdd an \"X\" and see if it shows up on the page where you expectAdd a syntax error and make sure it breaks. Delete everything and make sure it breaks.Hard-wire weird values in place of method callsNarrow the problem\nSimplify reproduction steps\nTry to figure out what you care about and what you don'tSee if you can reproduce the issue without some of the nuanceRemove the weird bits one at a timeThe less steps it takes to cause the problem, the less you have to think aboutFigure out where this code even lives\n!\n, ripgrep (), atom\u002Fvscode search, ...See some textTrace from entrypointsTrace backwards from the error if you have oneRead the stacktrace!Copy some random text from the screen and grep for thatBracket the issue\nHard-wire valuesInteractive Unit TestingLog state at various points of executionRead the error message\nSometimes ... often ... it will actually TELL you what is wrongEven when it is vague or lying it is a good starting point to trace backwards fromOften it comes with a stack trace -- read the stack trace!Read the log entries just before the error messageTrace forward and backward from the error\nLearning who calls what in any language is necessary knowledgeExecution Environment\nUse a completely different dataset \u002F environment to reproduce\nGo beyond \"Works on my machine!\"Eliminate your environment as the unintended cause of the issue\nSpeaking of environments, use  or similar and don't install using Try a different browser, or incognito, or different OSAsk a friend!Structured thinking\nTry to think about less things\nChunk concepts into short-term memoryTake notesModify the world\nDon't suffer in the current world, switch to the one you wish you hadBuild tiny scenarios\nCreate toy worlds to play inH1 tags should be clickable ... make a new component with an H1 tag and an onclick and ... click itEdit your dependencies!\nbundle openpry your way inIt's more obvious what a variable contains when it is hard-wiredActual bug hunting in a living application\nDid this work before?\nWhat changed?Assumptions about the dataAssumptions about the external worldWhy did it change?Why did this ever work?Do we have tests around this? What do they assume?Why does this work sometimes and not others?\nSOMETHING about the state is changingThe ordering in the sequence of eventsThe datatypesExternal state is changing (and depended on)\nTime! My favorite. (TimeCop)\nEspecially time zones, DST, and holidaysOther systemsThe world is deterministic but chaotic\nUnless you are dealing with quantum physicsYou are not dealing with quantum physicsWhen you are stuck\nModel the problem in detail\nDraw pictures of the data-flowDraw pictures of the data-structuresSequence diagrams are good for complex interactions, especially timing issuesScience!\n\"Remember kids, the only difference between screwing around and science is writing it down\" -- Adam Savage\nhttps:\u002F\u002Fwww.reddit.com\u002Fr\u002Fmythbusters\u002Fcomments\u002F3wgqgv\u002Fthe_origin_of_the_remember_kids_the_only\u002FThe tool of last resort?When things can't fit in our tiny brainsWrite it as a testWrite it on paperWrite it on a whiteboardWrite it in code (aka Test Driven Debugging)Ask for help!The problem is not in the language\nYou did not find an implementation error in Ruby (unless you are reading C code)You did not find an implementation error in Linux (unless you are reading C code)It is almost definitely not the frameworkIt is probably not the libraryPrioritize your suspect list based on probability\nHow many people use layer X without issue?Linux -- LOTSRuby -- LotsRails -- Lotsapp\u002Fmodels\u002Fmy_biz_logic.rb? Not so manyHow to practice\nPick something on the screen and find the code that makes itModify the code to see that you can affect changeTrace the code to see how it goes from Browser -> code -> BrowserWrite failing tests that would have caught the issueTry out different tools -- debuggers, REPLS, editors, git thingsRead (trace!) code of your app, your dependencies, other applicationsWrite More Tests\nUnit tests are like robot-you that are validating assumptions all the timeUnit tests are a shortcut to get into situations quicklyTests can contain bugs!Feature (browser tests) verify that things fit togetherKey tools\n\u002FYour editorPry\u002Firb\u002Fbyebug, js +firefox\u002Fchrome\npry-byebugrspec\u002Fcapybara \u002F Crazy power tools\ngit bisectrspec bisectruby -rtracer hiya.rbstrace \u002F dtracewireshark\u002FProxy? xxd? decompiler?",{"id":1071,"title":1072,"titles":1073,"content":1074,"level":9},"\u002Fdebunking-model-view-controller","Debunking_Model_View_Controller",[],"As I have discussed elsewhere (see Thoughts and issues with web-based DB programming), Model-View-Controller is one way of going about complex GUI internals, even in a web-application context. It has quite a few benefits, mostly organizational, which have drawn people like myself to the mindset. I propose, however, that the MVC method and its variants actually work against the object-oriented nature which it is often touted as exemplifying.",{"id":1076,"title":1077,"titles":1078,"content":1079,"level":9},"\u002Fdebunking-model-view-controller#in-a-web-application-context","In a Web-Application Context",[],"As I have discussed elsewhere (see Thoughts and issues with web-based DB programming), Model-View-Controller is one way of going about complex GUI internals, even in a web-application context. It has quite a few benefits, mostly organizational, which have drawn people like myself to the mindset. I propose, however, that the MVC method and its variants actually work against the object-oriented nature which it is often touted as exemplifying. It all comes down to the relationship between the Model and the View. Perhaps the raw MVC model has it correct, but implementations of the framework are not.",{"id":1081,"title":1082,"titles":1083,"content":1084,"level":9},"\u002Fdeclarative-diagrams","Declarative Diagrams",[],"I love diagrams! I love code! Mashing them together is delightful :) The idea here is to write some markup, like we do with HTML, and just like with HTML\u002FCSS we let the computer do the heavy lifting to decide what pixels go where. I long ago fell in love with GraphViz. More recently I've expanded that love to PlantUML! Let's take a look. List of Awesome Diagramming tools",{"id":1086,"title":1087,"titles":1088,"content":1089,"level":15},"\u002Fdeclarative-diagrams#graphviz-via-plantuml","GraphViz (via PlantUML)",[1082],"We'll start off with some simple GraphViz. This is basically a set of nodes and edges plus a bunch of hints about how we want it arranged. So we can be simple: And then we can make it a bit more complex: Now lets say we want that  to be directly below the  node. This is where there is some trickstyness involved. Generally when you are using a declarative system you are giving up control over some of these nitty gritty details. Still ... there are hints that we can give. In this case what we'll do is to say that the edge between  and  is not a \"constraint\", which means that they layout won't make  a \"child\" (separate rank) of . This is not quite what we want though, since now  is basically a top-level node. What we can do instead is put  and  into a group together and declare that all the members of that group have the same \"rank\".",{"id":1091,"title":1092,"titles":1093,"content":1094,"level":15},"\u002Fdeclarative-diagrams#plantuml","PlantUML",[1082],"PlantUML is a funny sort of super-language. For the most part it looks at the content of your markup and guesses what sort of diagram you want. It can do this since the syntax of each diagram is different enough to be distinguishable. Starting with my favorite, a sequence diagram, this is the exact and complete code: Now we can compare that to this activity diagram. Each part of this code corresponds to a part of the diagram, and it should be very readable even without reading the documentation.",{"id":1096,"title":1097,"titles":1098,"content":1099,"level":15},"\u002Fdeclarative-diagrams#mermaid","Mermaid",[1082],"I don't like it as much as PlantUML when it comes to the syntax, but Mermaid is increasingly popular and available. Specifically, you can put Mermaid directly in markdown and github will render it! html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"id":1101,"title":1102,"titles":1103,"content":1104,"level":9},"\u002Fdeep-code-tracing","Deep_Code_Tracing",[],"Let's have some fun with tracing code! Here is a nice way to get Elasticsearch+Kibana up and running: We're going to record our traces as a time-series. We unfortunately have to do a small config first, to ES know that our timestamp is ... a timestamp: Now we need to write down interesting things during our program execution. In my case, I'm working with a Rails project using RSpec. So I put this code near the top of spec\u002Fspec_helper.rb. Once executed, this code will start writing out to 'trace.log' lots and lots of tracing data: I have some stuff in there that is specific to RSpec. Later in the same file I put this config to track the current test being executed: Then I run my tests, which outputs trace.log. With this tracing turned on, it went at about half the normal speed. Mine is 123M (after disabling some logging). Now we load it into our ES. I do this in batches of 10k, and then POST it into ES: OK! Now we can finally have some fun! Load up http:\u002F\u002Flocalhost:5601\u002F Set index name to \"trace\"Accept the timestamp field it automatically picksClick into discover, and now you can slice and dice some stuff! Given a file, annotate the lines with a list of the tests that touch that line: Given a file and a line, list all of the tests that cover that line: Ideas: Editor:\nAdd to quickfix all of the tests that get hereHighlight on the screen in a heatmap way the code that leads to the current line and the code that leads away from the current lineHighlight untested linesGiven a test, highlight lines that get executedFollow a trace within the editor, stepping forward\u002Fback\u002Fin\u002Fout. Choose your own adventure for where to step nextHighlight variables that are visible from the current scopeGiven a test, generate a new copy of the codebase with only enough code to pass that one testVisualize (graphviz) some interesting control flows\nMake an interactive (svg+web) traceStep in, step over, switch sequencesHighlight past vs future in different colorsRecord state in the trace -- local variable contentsProfiling:\nBlock enter vs exit durationLine durationVariable scope & contentsRecord during interactive execution (not only tests)Capture line source code at time of trace?\nWith cache to make it efficientExtract into gem for recording, cli-app for using Related work: Using Neo4j instead of ES\nhttps:\u002F\u002Fneo4j.com\u002Fblog\u002Fneolytics-ruby-code-neo4j\u002FThey also index a TON of other stuff -- AST, variable contentsImplementation is specific to Ruby html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sOrwc, html code.shiki .sOrwc{--shiki-default:#E36209;--shiki-dark:#FFAB70;--shiki-sepia:#F8F8F2}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sTrkL, html code.shiki .sTrkL{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .s-m8C, html code.shiki .s-m8C{--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}",{"id":1106,"title":1107,"titles":1108,"content":45,"level":9},"\u002Fdeep-thought","Deep_Thought",[],{"id":1110,"title":1111,"titles":1112,"content":1113,"level":15},"\u002Fdeep-thought#jack-handy-is-my-god","Jack Handy Is My God",[1107],"What will they call paperwork when there is no more paper?",{"id":1115,"title":1116,"titles":1117,"content":45,"level":9},"\u002Fdeep-thoughts","Deep_Thoughts",[],{"id":1119,"title":1111,"titles":1120,"content":1113,"level":15},"\u002Fdeep-thoughts#jack-handy-is-my-god",[1116],{"id":1122,"title":1123,"titles":1124,"content":1125,"level":9},"\u002Fdelphi","Delphi",[],"Delphi is a lovely programming language and environment. The programming language is more technically \"Object Pascal\" I believe. I learned Pascal in HS from Denton which was lovely... and Delphi just brings sweet memories. Good type system (no OCaml, but quite nice), acceptable editor... its just great.",{"id":1127,"title":1128,"titles":1129,"content":1130,"level":15},"\u002Fdelphi#beginner-links","Beginner Links",[1123],"http:\u002F\u002Fwww.delphibasics.co.uk\u002F - A great reference site for built-in stuffhttp:\u002F\u002Fwww.undu.com\u002Fdn960118\u002F00000015.htm - Some lovely tips",{"id":1132,"title":1133,"titles":1134,"content":1135,"level":9},"\u002Fdeploy-first-breadth-first","Deploy First, Breadth First",[],"An exploration of mitigating project risks with frequent deploys and prioritizing end-to-end execution.",{"id":1137,"title":1138,"titles":1139,"content":1140,"level":15},"\u002Fdeploy-first-breadth-first#common-project-risks","Common project risks",[1133],"Introducing change to a project always comes with some risk. Some examples: Breaking existing functionalityNot building the \"right\" thingSpecified wrongImplemented wrongNot handling data scaleDifficult deployDifficult rollbackDifficult to work on (local setup)Taking longer than expected to developDeveloping without value being delivered Here are two key strategies to help mitigate some of these risks!",{"id":1142,"title":1143,"titles":1144,"content":1145,"level":15},"\u002Fdeploy-first-breadth-first#deploy-first","Deploy First",[1133],"The first thing you should do when working on a project is deploy. Then you know that you can do it with the existing code. The second thing you should do when working on a project is to write a stub of what you are doing, prove that it doesn't cause a regression (wrap it in a beta-flag if need be), and then deploy. Here's what usually happens: You wait until the end of the project to deploy. Then you realize that you can't deploy, because you need a new database or because your deploy script doesn't work or because this is a new service that has never been deployed before and you simply don't know how. So you start working on deploying it into a staging environment. But then you have to go around and build a staging environment and get all of your stuff working there. Then you test. But you STILL can't deploy to production, and you don't know how long it will take. So finally you get your prod stuff set up and deploy, 2 weeks after you intended to be done with the project. Typical way to do that last deploy: Get it running on your machine, working pretty wellPut in a PRHelp get it running on someone else's machine, working pretty wellIterate a bitTry to get it running on stagingIterate a bit, working with QA or other stakeholders via stagingTry to get it working on production This stacks up a severe unknown right at the end. So let's flip this. Work out how to deploy null code, zero changes, into prod. If there is no real code, there can be no real errors, so you don't need to put it into staging first. Next put it into staging, since you'll need that in the future. Now you know exactly how much labor it will take to get your thing into production - none. Putting something in prod immediately might seem scary, but really this strategy has the least and most isolated risk. Put your empty code behind a feature flag or if safe and non-contradicting put it on a new page that isn't linked.",{"id":1147,"title":1148,"titles":1149,"content":1150,"level":15},"\u002Fdeploy-first-breadth-first#breadth-first","Breadth First",[1133],"A typical project implements a new workflow, usually with several steps or across a few systems. We take the project and break it into features with each feature feeding data into the next. Then we sort based on the data flow and begin implementing features. Imagine we were trying to add a new feature to our eCommerce site so that people can submit issues with an order. So here we would say \"ok! Let's start by building a Create-Claim UI on our site!\". We break that into a few tickets and go to work! Once we have that working pretty well we move on to Transmitting, Processing, etc. There are a lot of things we might run into in this workflow: Business priorities shift before all is done. Code rots for a while before we get back to itThe backend needs enough information from the frontend to execute a refund, but we don't know what that might beGetting the tools into production adds an API, which turns out requires a new set of permissions that we didn't realize until trying to send things (unit tests missed them)Getting validations on orders right takes a long time, leaving little time for a quality execute-refund code One approach that some people take to help with these issues is complete up-front design. You think out every bit of the thing, every interface and API and variable and column, and work them all out ahead of time. While appealing, this has issues too - namely that when you go to write the code you have some situational awareness that cannot be obtained beforehand. So let's try another strategy. Let's try to get the end-to-end flow working, breadth-first style, and then go from there. Stub out all the \"useful\" work code and get this working end-to-end as the first task. For example, instead of letting the user create a complete claim, ask them for a single item or just hard-wire it to the last-most item available without any user input. Don't validate or handle errors on transmitting or even handle different products - make a hand-built json string to transmit if you can. And so on. Use Deploy First Development techniques to put your completely wrong but harmless code into production (behind a feature-flag or permission). Depending on the complexity of the project, a second breadth-first pass might be a good idea - one that doesn't use any hard-coded values for example. Your goal is to get the project to be minimally-useful. Once the project is minimally-useful, every change after that will make it more-useful! This also opens the possibility of parallel development. Once you have the end-to-end flow working, and ideally have some testing methodology worked out (either automated or by-hand), then you can switch into a more depth-first technique. You keep factoring out any hard-coded values until you get the whole project organized and feature-full. If you have been deploying the whole time there are no surprises - it isn't a matter of releasing the project, but instead of granting a wider set of people access to an already-working system.",{"id":1152,"title":1153,"titles":1154,"content":1155,"level":15},"\u002Fdeploy-first-breadth-first#notes-for-article-improvement","Notes for article improvement",[1133],"Give example of depth-first\nWhy this is naturalHow it misses important end-to-end questionsHow it doesn't lock in useful valueHow it can catch some low-level implementation detail issues earlyGive example of breadth-first\nWhy it is unnaturalHow it answers important end-to-end questionsHow it locks in value soonerHow it can miss low-level implementation details earlyCome up with another example. Something generic. Blog Engine? Blog admin panel?Is this the same as top-down vs bottom-up design\u002Fcoding?\nBoth breadth-first and depth-first are part of an overall top-down planDepth-first works fine if you start at the bottom and work your way up, so is compatible with bottom-up, kindaBottom-up could be considered breadth-first but starting at the leaf-nodesDoesn't lock in useful valueI guess you might call this \"middle-out\" designFeedback loops!\nBreadth first when it comes to team roles - design, dev, qa, opsGet end-to-end flow early\nTry out general and happy-path workflowDiscover initial boundaries and APIsBreadth-First vs TDD?\nMaybe breadth-first is more BDDFirst pass only?\nAfter end-to-end flow is established, depth on an individual piece can continue to lock in valueOnce the first pass is done you can more safely parallel-path develop the sub-componentsPsychology of BF-vs-DF\nhttps:\u002F\u002Farpitonline.com\u002F2010\u002F04\u002F10\u002Fon-breadth-first-and-depth-first-thinking\u002F - says that breadth-first is indicative of a happy state of mind and is more conductive to out of the box thinking, and that tension\u002Fpressure puts you into depth-first mode.\n\"So concept in breadth first mode, execute in depth first.\"http:\u002F\u002Fwww.dubberly.com\u002Farticles\u002Fmiddle-out-design.html - I was joking about calling it middle-out (Silicon Valley reference), and JoshC actually googled it and found this interesting article.",{"id":1157,"title":1158,"titles":1159,"content":1160,"level":9},"\u002Fdevel-tracestate","Devel-TraceState",[],"Use some crazy stuff like cpan::Devel::StackTrace::WithLexicals (or just plain ol' cpan:PadWalker) in a modified cpan:Devel::Trace to do a run-trace that includes lexical state.",{"id":1162,"title":1163,"titles":1164,"content":1165,"level":9},"\u002Fdiamond-hack-formation","Diamond_Hack_Formation",[],"I hypothesize that things that start out as a hack and then have tons of other hacks put on top of them sometimes have just the correct amount of pressure on them to form a diamond -- something stable and useful as the foundation for production-grade stuff.",{"id":1167,"title":1168,"titles":1169,"content":1170,"level":9},"\u002Fdim-memories","Dim_Memories",[],"(2011.07.02) Form and thought compel me,\nAll throughout the night,\nEyes open! They quickly vanish,\nDissipate in light. Still the visions are present,\nAll mixed up in my head,\nOf memories I cannot tell,\nWhich are dreams instead.",{"id":1172,"title":1173,"titles":1174,"content":1175,"level":9},"\u002Fdocs","Docs",[],"I try to keep all of my documents and make them available to anyone who is interested in reading them. For the most part I've been trying to use LaTeX as my source language and then converting to ps, pdf, html, and plain text. One exception that I am now making is Wiki-based documents -- ones that I have composed directly in the wiki. I like having them in the wiki because people can contribute... I like having them in LaTeX because it is fun. Oh well. I've also attempted to sort things out by subject -- since most of my documents have to do with school most of the subjects do too. One thing that I would like to change is my mix of self-authored documents and documents that others have written. My plan is to split docs into two directories: docs for my stuff and library for other people's stuff. For the time being they are a little mixed up, but it should be fairly obvious which work was originally composed and which work has come from other sources. If you have any questions, just ask! Here is a list of some of my documents. Remember you can access the non-wiki documents directly through docs. Wiki documents tend to be shorter, more dynamically changing, and more interrelated. The LaTeX documents (which will have 's around their titles) tend to be longer, more static, and possibly more in-depth.",{"id":1177,"title":1178,"titles":1179,"content":1180,"level":15},"\u002Fdocs#computer-science-and-programming","Computer Science and Programming",[1173],"Thoughts on Automatic ParallelizationPerl hashref iteration exampleOn Adding a True Predicate Logic Layer to Relation DatabasesThoughts and issues with web-based DB programmingPHPRobitsContinuation-based Web ProgrammingWeb Programming With ContizeSphinx NotesGP for NLPWeb Application TechniquesDebunking Model View ControllerCode SelectorsDOM Templates and AJAXEfficient CSS AlgorithmREST AJAX and ContinuationsACM Turing Award and the Lag of InnovationUnison Backup Setup",{"id":1182,"title":1183,"titles":1184,"content":1185,"level":15},"\u002Fdocs#movie-reviews","Movie Reviews",[1173],"Movie Review - Love ActuallyMovie Review - Star Trek II The Wrath of KhanMovie Review - NovocaineMovie Review - JackassMovie Review - House of a Thousand CorpsesMovie Review - Fight ClubMovie Review - ZoolanderMovie Review - The Matrix Reloaded",{"id":1187,"title":1188,"titles":1189,"content":1190,"level":15},"\u002Fdocs#philosophy","Philosophy",[1173],"Wilcox, Brock: On the Gettier ProblemWilcox, Brock: Critical Review of Homesteading the Noosphere \n\"What Eric fails to grasp is that it is that formalizing hacker customs is not necessary. In his own words Eric has claimed to observe the consistency of these practices throughout his 20 years of experience in the community. This illustrates exactly how unnecessary it is to do any formalization of this code of conduct.\"Response to Richard Epstein ArticleThe Sociopath In All Of UsPredicting the FutureScience vs MathematicsStudy of Hobbs' Leviathan",{"id":1192,"title":1193,"titles":1194,"content":1195,"level":15},"\u002Fdocs#poems","Poems",[1173],"Zero One InfinityIt's Dark Here NowThe Haiku GameWhat Do Creatures DreamDim MemoriesCode UndoneHoney Honey Honey",{"id":1197,"title":1198,"titles":1199,"content":1200,"level":15},"\u002Fdocs#songs","Songs",[1173],"UmbrellasZombie LoveImmaterial ThingsGot One ShoeTalking DC Vote Blues",{"id":1202,"title":1203,"titles":1204,"content":1205,"level":15},"\u002Fdocs#other-unsorted","Other \u002F Unsorted",[1173],"ArcaneJillGraphics DesignAutobiographyMutt - My mail clientWST - Women's Studies course stuffEPFarms ASCII LogoLinux on the Compaq v2311Firefox Extensions I Like",{"id":1207,"title":1208,"titles":1209,"content":1210,"level":9},"\u002Fdont-repeat-yourself","Don't_Repeat_Yourself",[],"Listen (acoustic draft):  (download) Artist: Brock Wilcox\nCopy and Share: under the terms of Creative Commons Attribution-NonCommercial license!",{"id":1212,"title":300,"titles":1213,"content":1214,"level":15},"\u002Fdont-repeat-yourself#lyrics",[1208],"Don't repeat yourself\nDon't repeat yourself\nYeah the blog post said\nDon't repeat yourself Don't repeat yourself\nDon't repeat yourself\nYeah the blog post said\nDon't repeat yourself But I asked myself\nHow can that be\nWhen such a thing\nIs hypocrisy Cause' the other day\nIt said the tight coupling\nIs the absolute\nMost horrid thing And if everything\nDepends on everything\nThen tight coupling\nIs the only thing Don't repeat yourself\nDon't repeat yourself\nYeah the blog post said\nDon't repeat yourself Don't repeat yourself\nDon't repeat yourself\nYeah the blog post said\nDon't repeat yourself Spent all last week\nThinkin bout my code\nAll the duplicate lines\nIt has to load Well I factored out\nAll the common bits\nAnd then I sat back\nTo watch the hits I got three downloads\nOf my app today\nGuess that extra week\nIs the price I pay Don't repeat yourself\nDon't repeat yourself\nYeah the blog post said\nDon't repeat yourself",{"id":1216,"title":1217,"titles":1218,"content":1219,"level":9},"\u002Fdot2html","Dot2html",[],"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. darcs get http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fdot2html",{"id":1221,"title":1222,"titles":1223,"content":1224,"level":15},"\u002Fdot2html#recent-development-feed","Recent Development Feed",[1217],"\u003Crss 5 http:\u002F\u002Fthelackthereof.org\u002Fdarcs-rss\u002Ffeed\u002Fperl-dot2html.rss>",{"id":1226,"title":1227,"titles":1228,"content":1229,"level":9},"\u002Fdynamic-language-conference-brainstorm","Dynamic_Language_Conference_Brainstorm",[],"Idea: A regional one\u002Ftwo day two-track conference on software development in dynamic languages. Perhaps even an annual \u002F 6mo event? Submit the same talks that you would submit to your regional or national language-specific conference ... only here, instead of the speaker before and after you using the same language, they might be using something completely different. But ultimately very similar problems get solved, systems get built, concepts get used. Names: DCDU - DC Dynamic UnitedDDC - Dynamic DCDCD - DC Dynamiceval (ēval)late bound What makes a language dynamic? No\u002Flittle compilationEval :)Late binding... Sample dynamic languages\u002FTechnologies: ClojureJavascriptNodejsPHPPerlPythonRuby Aspects: Open source communitiesSource-code centric\nAka developer centricCelebrate similaritiesShare new ideasLibraries, applications, platformsWhere do you shine, and how can others steal or make it betterStand on each other's shoulders Example overlapping tech: pydoc, perldoc, rdocWSGI, Rack, PSGIDBIx::Class, ActiveRecordRails, Django, Catalyst, CakeCPAN, Gems, pipi, npmHandlebars, TemplateToolkitPygame, SDLNumpy, PDLMechanizepypy, rubinius, jpython, jruby, ironpython, ironruby, perlito We don't have a common runtime -- you can't just call a perl sub from a python one. Even within a language you have this issue -- you can't call arbitrary ruby from jruby. Yet we do have in common a set of overlapping problems to be solved and ideas for how to solve them. Let's get together to share (steal!) even more of these ideas. There are interesting design decisions made between one project and the next within a language, and you get a whole other view when comparing projects from a variety of languages.",{"id":1231,"title":1232,"titles":1233,"content":1234,"level":15},"\u002Fdynamic-language-conference-brainstorm#other-conferences","Other Conferences",[1227],"Dynamic Languages Conference 2011 (UK) - \"The DLC is a cross-language event aimed at Open Source Dynamic Languages, we hope to bring together all the languages in an open forum to discuss and present the manner in which these languages approach and solve tasks at the cutting edge of development technology\" Organized by Mark KeatingDynamic Languages Symposium (DLS) - Tucson, Arizona, USA, October 22, 2012\nCo-located with SPLASH 2012. 6th annual ACM symposium. Very notable lack of \"perl\" in their list of dynamic languages :(Dynamic Languages Conference (Stockholm) - cancelled due to lack of participants",{"id":1236,"title":1237,"titles":1238,"content":1239,"level":15},"\u002Fdynamic-language-conference-brainstorm#dynamic-language-and-other-local-groups","Dynamic Language and Other (local) Groups",[1227],"List of DC Tech Groups\u002FEventsLambda Lounge, IndyDC PHP DevelopersDC PythonDC Ruby Users GroupHacDCRefresh DCFringe DC - Less-mainstream language group, on HiatusNode.DC - NodeJS, monthly meetings, next June 27DC HTML5 MeetupDC Groovy User GroupErlang Users of Arlington\u002FDC",{"id":1241,"title":1242,"titles":1243,"content":1244,"level":9},"\u002Fepfarms-ascii-logo","EPFarms_ASCII_Logo",[],"Erik: Brock: Eric2: Brock3:",{"id":1246,"title":1247,"titles":1248,"content":45,"level":9},"\u002Fepfarms-panel","EPFarms_Panel",[],{"id":1250,"title":1251,"titles":1252,"content":1253,"level":15},"\u002Fepfarms-panel#structure","Structure",[1247],"The panel is built around Contize (and eventually Continuity), 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 Continuity, so someday the panel will move to use that (and will thus be a little cleaner).",{"id":1255,"title":1256,"titles":1257,"content":1258,"level":15},"\u002Fepfarms-panel#modules","Modules",[1247],"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 EPFarms Panel Module Development for technical details.",{"id":1260,"title":870,"titles":1261,"content":1262,"level":15},"\u002Fepfarms-panel#see-also",[1247],"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fepfarms-panel\u002FEggplant Farms Panel Development Project on the epfarms wiki",{"id":1264,"title":1222,"titles":1265,"content":1266,"level":15},"\u002Fepfarms-panel#recent-development-feed",[1247],"\u003Crss 5 http:\u002F\u002Fthelackthereof.org\u002Fdarcs-rss\u002Ffeed\u002Fperl-EPFarms-Panel.rss>",{"id":1268,"title":1269,"titles":1270,"content":1271,"level":9},"\u002Fepfarms-panel-module-development","EPFarms_Panel_Module_Development",[],"Coding a module for the panel is fun and easy! Unfortunately it has changed significantly since I started this... so I'm removing everything that was here before.",{"id":1273,"title":1274,"titles":1275,"content":1276,"level":9},"\u002Fearley-parser","Earley_Parser",[],"This is a parsing technique invented by Earley in which yacc-like grammars may be defined which can be ambiguous and yet still parse. The algorithm returns all possible parses, allowing the decision of which parse tree to use to be made by someone else.",{"id":1278,"title":1279,"titles":1280,"content":1281,"level":9},"\u002Fefficient-css-algorithm","Efficient_CSS_Algorithm",[],"While thinking about Code Selectors I started contemplating how CSS gets applied to a webpage. Based on my readings, it is done the hard way. (stick link in here to mozilla's description of the process). I've also been using the improved PHP fork of html2ps, but the more CSS you use the slower it gets. So here is an idea for a CSS algorithm, at least for the context selector. Example CSS: #a .b c {\na1: 5;\na2: 10;\n} .b c {\na1: 10;\na2: 20;\n} During the parsing of the CSS text, we create a data structure which is element-centric. So maybe something like: $css{c}{context}{'.b'}{context}{'#a'}{attrs} = {\na1 => 5,\na2 => 10,\n}; $css{c}{context}{'.b'}{attrs} = {\na1 => 10,\na2 => 20,\n}; Then if we have some markup: This is content This is more content We traverse the tree. Lets traverse down to the first 'c' tag. Now we traverse the css hash-tree we built, starting with the current node. We go through the 'c' tag's list of contexts... Each node has three things -- its tag name, its ID, and its class list.",{"id":1283,"title":870,"titles":1284,"content":1285,"level":15},"\u002Fefficient-css-algorithm#see-also",[1279],"http:\u002F\u002Fwww.dillo.org\u002FCSS.v1.txthttp:\u002F\u002Fcthedot.de\u002Fcssutils\u002Fhttp:\u002F\u002Fwww.w3.org\u002FStyle\u002FCSS\u002FSAC\u002Fhttp:\u002F\u002Fajax.sourceforge.net\u002Fcypress\u002Fhttp:\u002F\u002Fsearch.cpan.org\u002F~iamcal\u002FCSS-1.07\u002F",{"id":1287,"title":1288,"titles":1289,"content":45,"level":9},"\u002Fernst-thoughts","Ernst_Thoughts",[],{"id":1291,"title":1292,"titles":1293,"content":1294,"level":15},"\u002Fernst-thoughts#merge-the-model-and-view","Merge the Model and View",[1288],"The classic structure is Model-View-Controller. The Model-View separation leads to code duplication, since often the description of the data in the model is similar (or even identical) to the description of the view. For example, an address record might have a Street, City, State, and Zip. When rendered it still has all these things. Beyond just merging the View into the Model, in concept the View can actually be derived from the Model.",{"id":1296,"title":1297,"titles":1298,"content":1299,"level":15},"\u002Fernst-thoughts#data-type-implies-view-type","Data Type Implies View Type",[1288],"If the datatype is a short string, then we'll probably want a short text input field. If it is a date, we'll probably want a date-selector. If it is long text we'll want a textarea. At this low level the type in the Model has a nearly one-to-one correspondence with the type in the View. This abstraction can often continue without intervention at higher levels. Lists, tuples, and unions can be expressed in the View in a straightforward manner.",{"id":1301,"title":1302,"titles":1303,"content":1304,"level":15},"\u002Fernst-thoughts#problem-multiple-views","Problem: Multiple Views",[1288],"In MVC it is easy to have multiple views for a single model (or across model objects). How can this be done if the Model and View are merged? Here are some ideas: Give the Model a sense of it's rendering context.Actually have separate view code, but more tightly integrated into the Model than in traditional MVC.",{"id":1306,"title":1307,"titles":1308,"content":1309,"level":15},"\u002Fernst-thoughts#code-selectors","Code Selectors",[1288],"Rather than having completely different Views (aka \"modes\") for a Model, instead have a more fine-grained list of attributes that are used for rendering. These attributes might be things like flags for showing or not showing a label, or indicating that the instance should be editable or read-only.",{"id":1311,"title":1312,"titles":1313,"content":1314,"level":9},"\u002Fevolveability","Evolveability",[],"Literally, the measure of how evolveable a genetic programming system is. So then comes the question -- what is this? Solve complex problemsDon't get stuck at local maximaThe longer it is run, the better solution it findsAvoid bloat, increase parsimonyIncrease genetic drift so that a current good solution can become an even better solution",{"id":1316,"title":1317,"titles":1318,"content":1319,"level":9},"\u002Ffinding-a-dc-apartment","Finding_a_DC_Apartment",[],"This is for our DC apartment hunt.",{"id":1321,"title":1322,"titles":1323,"content":1324,"level":15},"\u002Ffinding-a-dc-apartment#goal","Goal",[1317],"Efficiency or 1 bedroomOn-site laundryNear grocery storeSafe neighborhoodMetro$1500 range (less is better! :) )Cats!",{"id":1326,"title":1327,"titles":1328,"content":1329,"level":15},"\u002Ffinding-a-dc-apartment#map","Map",[1317],"Check out the Current Google Map of these locations.",{"id":1331,"title":1332,"titles":1333,"content":1334,"level":15},"\u002Ffinding-a-dc-apartment#apartments","Apartments",[1317],"|| Eval || Name                                || Address             || Size       || Price       || Notes ||\n||      || West Park || 2130 P Street 20037 || studio\u002F1br || $1400\u002F$1700 ||       || http:\u002F\u002Fwashingtondc.craigslist.org\u002Fdoc\u002Fapa\u002F340351116.html\n1 bdrm in townhouse at fantastic 15th and Church Street location. Private entrance, good sunlight, located on 1st and 2nd floors. Walk to Whole Foods, Dupont and Logan Circles. Extra storage and laundry room on site. Pets Ok. $1350 plus electric, available any time. Call 202.329.9164 for appointment.\n15th Street, NW at Church Street, NW http:\u002F\u002Fwashingtondc.craigslist.org\u002Fdoc\u002Fapa\u002F339863362.html\n$1395 Great Dupont Location\nReply to: hous-339863362@craigslist.org\nDate: 2007-05-28, 1:44PM EDT\nWell-kept and ready to move in Studio! Balcony, nice HDW floor, fresh paint! In\na secured building with 24hrs front desk, pool, roof top deck. Perfect\nlocation, walk to metro, shops and restaurants!\nAvailable June 1st. Call Dennis at 202-731-9559\n1718 P St NW #610\nElizabeth will be contacting Dennis again on Wednesday (5\u002F30) to see about\nlooking at the place and possibly starting the process... will update 1830 R Street NW Apartments\n1830 R Street NW\nWashington, DC 20009\n(866) 824-8389 ext. 6240\nProbably interested in a 1br, since these are very small and very cheap. Rocksboro Apartments, LLC\n1717 R Street NW\nWashington, DC 20009\n(866) 824-8373 ext. 5526\nProbably interested in a 1br, since these are very small and very cheap (like above).",{"id":1336,"title":1337,"titles":1338,"content":1339,"level":15},"\u002Ffinding-a-dc-apartment#possibilities-added-by-elizabeth","Possibilities Added By Elizabeth",[1317],"http:\u002F\u002Fwashingtondc.craigslist.org\u002Fdoc\u002Fapa\u002F340793871.html $1200 Nice size efficiency for June 9th\nReply to: hous-340793871@craigslist.org\nDate: 2007-05-30, 1:54PM EDT\nGreat size efficiency for $1200.00 all utilities included, hardwood floors, central air and heating, newly renovated kitchen, large walk in closet and cable\u002FInternet ready.\nOur community offers 24 hour front desk, 24 hour emergency maintenance, controlled access and 24 hour laundry. 1600 is located on the corner of 16th and Q minutes from shopping and the red line DuPont Circle metro station.\nFor more information or to schedule viewing please contact our office 202\u002F667-6600. 1600 16th st. at 16 and Q\n* cats are OK - purrr http:\u002F\u002Fwashingtondc.craigslist.org\u002Fdoc\u002Fapa\u002F338620456.html $1700 \u002F 1br - Huge SUN! It's GORGEOUS! in the IOWA. Open House SUN\nReply to: wardenstaci@yahoo.com\nDate: 2007-05-26, 4:03AM EDT\nBeautiful, southern-facing one bedroom with huge sun in the highly sought after Iowa condominium. I truly loved this apartment.\nOPEN HOUSE SUNDAY, May 26, from 1:00 - 3:00.\nADDRESS: 1325 13th st., NW, #404 (13th and O). Code = #4040.\nIncredibly sunny, beautiful place with hardwoods and tile. All new appliances; washer-dryer and dishwasher in the unit; beautiful cabinets; huge walk-in closet; lots of shelves in bathroom. It is very nicely appointed as I renovated it to live there myself, until transferred out of DC. The location is fabulous. Steps to 14th street, with the Whole Foods, great bars and restaurants and funky shops. I walked to Dupont Metro to work, no problem (about 6-8 long blocks I think) If you want more information you can email me on wardenstaci@yahoo.com or email my current tenants c\u002Fo Sarah at sarashon@gmail.com. You can also email her if you can't make the open house and need a private showing.",{"id":1341,"title":1342,"titles":1343,"content":1344,"level":15},"\u002Ffinding-a-dc-apartment#eliminated-apartments","Eliminated Apartments",[1317],"http:\u002F\u002Fwashingtondc.craigslist.org\u002Fdoc\u002Fapa\u002F338416610.html\nBarclay\u002FRavenel\npretty darn Bad reviews Sixteen Hundred\n1600 16th Street, NW\nWashington, DC 20009\nrent.com phone number: (866) 579-1660 ext. 1400\n$1200\u002Fmo, available the 15th\nCall Carla 202-667-6600\nRoach Infested (bad reviews)",{"id":1346,"title":1347,"titles":1348,"content":1349,"level":9},"\u002Ffirefox-extensions-i-like","Firefox_Extensions_I_Like",[],"Tab XTabbrowser PreferencesTab Mix Plus (possible tabbrowser preferences replacement)Web Developer ToolbarFireBugAdblock PlusAdd Bookmark HereHTML ValidatorView-Source-WithMozEx - edit textareas with an external editor (vim) Sideways tabbar chrome",{"id":1351,"title":1352,"titles":1353,"content":1354,"level":9},"\u002Ffrog-prince","Frog_Prince",[],"Listen:  (download) Songwriting: Brock Wilcox\nArtists: Elizabeth Woys and Brock Wilcox\nCopy and Share: under the terms of Creative Commons Attribution-NonCommercial license!",{"id":1356,"title":1357,"titles":1358,"content":1359,"level":15},"\u002Ffrog-prince#remixes","Remixes",[1352],"I uploaded this to ccMixter and some people actually remixed it! Charlie Charles - The Prince  (download)Dan Mantau - Frog Prince  (download)Reiswerk - Frog Prince  (download)Manny Arquette - Frog Prince Video",{"id":1361,"title":300,"titles":1362,"content":1363,"level":15},"\u002Ffrog-prince#lyrics",[1352],"Frog All the young ladies gather 'round gather 'round\nWanna piece of me 'cause they wanna wear the crown\nBut it's gotta be true for a kiss to set me free\nJust one pretty lady can rule the world with me Some witch said that I was rude and I was vain\nTurned me green and slimy 'til a kiss'll lift my shame\nSo I gotta taste every river every stream\nOnly way I'll find her and awaken from my dream So kiss me girl 'cause I'm a prince\nI'm a frog prince I'm a prince\nKiss me girl 'cause I'm a prince\nI'm a frog prince I'm a prince Princess Girls aren't as dumb as you think\nShiny bling don't make us leap\nInto your arms just for the night\nWhat makes you think you're Mr. Right? You players, you're all the same\nThink you can win your game\nKnow that you can't fool me\nWith your froggy fantasy See I don't want your crown,\nDon't wanna mess around,\nYou better hit the road\nYou ain't nothing but an ugly toad",{"id":1365,"title":1366,"titles":1367,"content":1368,"level":9},"\u002Ffujitsu-lifebook-t730","Fujitsu_Lifebook_T730",[],"I recently got a Fujitsu Lifebook T730, the package with these specs (from the website): Intel i5-450M Processor (2.4 GHz, 3 MB L3 cache) with Turbo Boost Technology12.1\" WXGA LED backlightDual digitizer (pen input and capacitive multi-touch screen)Intel HD GraphicsBuilt-in webcam with dual digital array microphones for video chat4 GB DDR3 1066 MHz SDRAM memory (2 GB + 2GB)160 GB S-ATA, 7200 rpm hard drive (protected by Fujitsu Shock Sensor)10\u002F100\u002F1000 Gigabit Ethernet LANIntel Centrino Advanced-N 6200 WLANBluetooth WirelessModular Dual-Layer Super-Multi DVD WriterEmbedded Fingerprint Sensor, integrated TPM, Security PanelIntegrated ambient light sensorFull-size, spill-resistant keyboard with touchpad (includes scroll sensor)High-Definition Multimedia Interface (HDMI) portUser-cleanable dust filterMain battery: Lithium ion (6-cell, 5200 mAh)Bundle code XBUY-T730-W7-003 Plus I got the extra battery for the swappable bay.",{"id":1370,"title":1371,"titles":1372,"content":1373,"level":15},"\u002Ffujitsu-lifebook-t730#ubuntu-linux-1004-lucid-on-the-fujitsu-lifebook-t730","Ubuntu Linux 10.04 (Lucid) on the Fujitsu Lifebook T730",[1366],"I thought I'd boot into windows to make sure all the hardware worked before replacing it with linux, but after it rebooted for the 4th time while doing it's configuration I gave up and killed it. I didn't even make it to the desktop. So unfortunately that means I can't do much of a comparison there. So on to linux! I had an Ubuntu 10.04 disk, so I tried that first. Almost everything works out of the box! In fact, the only thing that doesn't work is the capacitive touch screen and screen buttons. I haven't tried the fingerprint reader, and probably won't mess with it at all. I also haven't tried the HDMI, though I'll probably give that a go eventually. Highlights of what works, what doesn't\n|| Feature || Status ||\n|| Pen input || Perfect, though needs some calibration ||\n|| Touch input || Perfect, after much gnashing of teeth that turned out simple. See below. ||\n|| Screen buttons || Didn't work until I got fjbtndrv, now they work fine ||\n|| Wireless || Perfect ||\n|| Touchpad || Perfect, scrollyness and all. It needs to be more sensitive though. ||\n|| Webcam || Perfect ||\n|| Sound || Perfect ||\n|| Screen || Perfect. Fully controllable via xrandr and some wacom tool. ||\n|| Suspend to RAM || Perfect. Sweetness. || (Note that this info probably exactly applies for Linux on the Fujitsu Lifebook T900 and TH900 and probably a few others, since they have extremely similar hardware).",{"id":1375,"title":1376,"titles":1377,"content":1378,"level":15},"\u002Ffujitsu-lifebook-t730#battery-life","Battery Life",[1366],"One of my hopes with the extra battery has been to get a significant boost on the battery life. Unoptimized, listening to pandora over wifi - 5:00 hours",{"id":1380,"title":1381,"titles":1382,"content":1383,"level":15},"\u002Ffujitsu-lifebook-t730#touch-input","Touch Input",[1366],"I thrashed about for a few days before I got the touch input to work -- and most of the thrashing was because I didn't try to actually follow the directions linearly, as usual. Here are the two main resources that I found useful: Linux Wacom Project HOWTOUbuntu Forum LinuxWacom HOWTO post Now the pen\u002Feraser inputs were listed out of the box in xinput --list, so I mistakenly believed that the issue was somewhere before X. Ubuntu switched from HAL to udev for Lucid (10.04), so I was digging around there. I also upgraded my Wacom X11 driver to the latest release, and then to the latest git. I poked at the \u002Fusr\u002Flib\u002FX11\u002Fxorg.conf.d\u002F10-wacom.conf, upgrading that to the latest recommended settings. Nothing worked. I knew it worked in general because 'xxd \u002Fdev\u002FttyS0' showed stuff when I touched the screen. Finally I went ahead and created an \u002Fetc\u002FX11\u002Fxorg.conf. I was really reluctant to do that because I thought I'd end up having to have the full config, like in the old days. But no! I only had to specify the things I wanted to override, in this case some details on the touch screen. Everything else was still auto detected! Here is my entire xorg.conf: I haven't done calibration yet, looks like that is a bit of a manual process right now (they are transitioning codebases over at LinuxWacom). But it is close enough to be useable anyway :) Once I got it working, I tried some plugins for firefox and also grabbed Fennec. Fun!",{"id":1385,"title":1386,"titles":1387,"content":1388,"level":15},"\u002Ffujitsu-lifebook-t730#screen-buttons-and-swivel-auto-rotate","Screen Buttons and Swivel Auto Rotate",[1366],"Installing fjbtndrv made the buttons work. It also comes with a daemon named fscrotd that does the auto-rotate on swivel. Finding it was the hardest part -- it works great. EDIT (By Erich.me) There is a file you can download in the T730 Driver\u002FUtility downloads on the Fujitsu site called AutoRotationSSD_FJ_v1.00.10.003SSD_W7-32.exe that makes the Auto-Rotate function work perfectly. I am trying out some of the other T731 Drivers and Utilities and I will post more if any of them add functionality. (awwaiid asks) Question to Erich.me - how is an .exe useful in linux?",{"id":1390,"title":1391,"titles":1392,"content":45,"level":9},"\u002Ffujitsu-lifebook-t730-dmesg","Fujitsu_Lifebook_T730_dmesg",[],{"id":1394,"title":1395,"titles":1396,"content":1397,"level":9},"\u002Ffunctors","Functors",[],"A function, except with modules. The return type of a functor is always a module, I believe.",{"id":1399,"title":1400,"titles":1401,"content":45,"level":9},"\u002Fgoe","GOE",[],{"id":1403,"title":1404,"titles":1405,"content":1406,"level":15},"\u002Fgoe#goe-object-environment","Goe Object Environment",[1400],"The goal of this project is to create a smalltalk-like environment using perl as the foundation. See http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fgoe\u002Fhtml\u002F for the website, though at some point this wiki will probably become more accurate. It at least has a pretty logo! 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. (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.",{"id":1408,"title":870,"titles":1409,"content":1410,"level":15},"\u002Fgoe#see-also",[1400],"http:\u002F\u002Fc2.com\u002Fcgi\u002Fwiki?CanPerlBeSmalltalkhttp:\u002F\u002Fminnow.cc.gatech.edu\u002Fsqueak\u002F665",{"id":1412,"title":1413,"titles":1414,"content":45,"level":9},"\u002Fgp-references","GP_References",[],{"id":1416,"title":1417,"titles":1418,"content":45,"level":15},"\u002Fgp-references#inproceedingsolson2002geccoauthor-roland-olsson-and-brock-wilcoxtitle-self-improvement-for-the-adate-automatic-programmingsystembooktitle-gecco-2002-proceedings-of-the-genetic-andevolutionary-computation-conferenceeditor-w-b-langdon-and-e-cantu-paz-and-k-mathias-andr-roy-and-d-davis-and-r-poli-and-k-balakrishnan-andv-honavar-and-g-rudolph-and-j-wegener-and-l-bulland-m-a-potter-and-a-c-schultz-and-j-f-miller-ande-burke-and-n-jonoskayear-2002pages-893address-new-yorkpublisher_address-san-francisco-ca-94104-usamonth-9-13-julpublisher-morgan-kaufmann-publisherskeywords-genetic-algorithms-genetic-programming-poster-paperautomatic-programming-mutation-method-neutralevolution-self-improvement-adateisbn-1-55860-878-8url-httpwwwcsbhamacukwblbibliogecco2002gp065psurl-httpwwwcsbhamacukwblbibliogecco2002gp065pdfurl-httpwwwcsuclacukstaffwlangdonftppapersgecco2002gecco-2002-15pdfnotes-gecco-2002-a-joint-meeting-of-the-eleventhinternational-conference-on-genetic-algorithmsicga-2002-and-the-seventh-annual-genetic-programmingconference-gp-2002","@InProceedings{olson:2002:gecco,\nauthor =\t\"Roland Olsson and Brock Wilcox\",\ntitle =\t\"Self-improvement For The {ADATE} Automatic Programming\nSystem\",\nbooktitle =\t\"GECCO 2002: Proceedings of the Genetic and\nEvolutionary Computation Conference\",\neditor =\t\"W. B. Langdon and E. Cant{'u}-Paz and K. Mathias and\nR. Roy and D. Davis and R. Poli and K. Balakrishnan and\nV. Honavar and G. Rudolph and J. Wegener and L. Bull\nand M. A. Potter and A. C. Schultz and J. F. Miller and\nE. Burke and N. Jonoska\",\nyear = \t\"2002\",\npages =\t\"893\",\naddress =\t\"New York\",\npublisher_address = \"San Francisco, CA 94104, USA\",\nmonth =\t\"9-13 \" # jul,\npublisher =\t\"Morgan Kaufmann Publishers\",\nkeywords =\t\"genetic algorithms, genetic programming, poster paper,\nautomatic programming, mutation method, neutral\nevolution, self-improvement, ADATE\",\nISBN = \t\"1-55860-878-8\",\nURL =  \t\"http:\u002F\u002Fwww.cs.bham.ac.uk\u002F~wbl\u002Fbiblio\u002Fgecco2002\u002FGP065.ps\",\nURL =  \t\"http:\u002F\u002Fwww.cs.bham.ac.uk\u002F~wbl\u002Fbiblio\u002Fgecco2002\u002FGP065.pdf\",\nURL =  \t\"http:\u002F\u002Fwww.cs.ucl.ac.uk\u002Fstaff\u002FW.Langdon\u002Fftp\u002Fpapers\u002Fgecco2002\u002Fgecco-2002-15.pdf\",\nnotes =\t\"GECCO-2002. A joint meeting of the eleventh\nInternational Conference on Genetic Algorithms\n(ICGA-2002) and the seventh Annual Genetic Programming\nConference (GP-2002)\",\n}",[1413],{"id":1420,"title":1421,"titles":1422,"content":1423,"level":15},"\u002Fgp-references#bookkozabookauthor-john-r-kozatitle-genetic-programming-on-the-programming-of-computersby-means-of-natural-selectionyear-1992publisher-mit-pressaddress-cambridge-ma-usakeywords-genetic-algorithms-genetic-programming-text-bookisbn-0-262-11170-5","@Book{koza:book,\nauthor =\t\"John R. Koza\",\ntitle =\t\"Genetic Programming: On the Programming of Computers\nby Means of Natural Selection\",\nyear = \t\"1992\",\npublisher =\t\"MIT Press\",\naddress =\t\"Cambridge, MA, USA\",\nkeywords =\t\"genetic algorithms, genetic programming, text book\",\nISBN = \t\"0-262-11170-5\",\n}",[1413],"la la la",{"id":1425,"title":1426,"titles":1427,"content":1428,"level":9},"\u002Fgp-for-nlp","GP_for_NLP",[],"So I was reading  the Spring 2003 Natural Language and the Computer Representation of Knowledge from the good folks at MIT and an idea struck me... one that I now recall already stuck Roland. Use Genetic Programming to evolve a Natural Language Processor. Roland did a first run of this here. My idea is to use this technique for VladimirBot. Up until this point I've been trying to create an Earley Parser grammar so that Vladimir could understand all things relating to scheduling (the idea being for him to become my own personal scheduling agent). This isn't very hard to do, but not very interesting. So, the new idea. I will create a list of things myself or others might say to Vladimir. I will also create the appropriate semantic representation I want for each of the sentences. Then I hand this off to a GP to create the grammar and translator. Perhaps, however, a simple grammar is not enough. In that case I'd get my GP to output actual code to be run. Hmm. The biggest issue is the knowledge representation language, I think. I've been thinking about this a lot lately, which is why I was reading the MIT course. But for this domain I think a fairly simple knowledge representation will work well. The two fundamental things which need to be expressible are the obvious -- querying the existing knowledge and adding new knowledge. The real question is whether the knowledge should encompass rules in addition to facts.",{"id":1430,"title":1431,"titles":1432,"content":1433,"level":9},"\u002Fgalaxy-note-unlock-notes","Galaxy_Note_Unlock_Notes",[],"sg3 unlock -- flip \"lock\" bit in nv_data.bin http:\u002F\u002Fforum.xda-developers.com\u002Fshowthread.php?t=1715149https:\u002F\u002Fgithub.com\u002Fproject-voodoohttp:\u002F\u002Fproject-voodoo.org\u002Fnewshttps:\u002F\u002Ftwitter.com\u002Fsupercurio\u002Fhttps:\u002F\u002Fgithub.com\u002Fproject-voodoo\u002Fgalaxysiii-sim-unlock-app",{"id":1435,"title":1436,"titles":1437,"content":1438,"level":9},"\u002Fgecko-based-html2ps","Gecko-based_html2ps",[],"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.",{"id":1440,"title":1441,"titles":1442,"content":1443,"level":15},"\u002Fgecko-based-html2ps#status","Status",[1436],"Broken.",{"id":1445,"title":1446,"titles":1447,"content":1448,"level":15},"\u002Fgecko-based-html2ps#plan","Plan",[1436],"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. 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.",{"id":1450,"title":261,"titles":1451,"content":1452,"level":15},"\u002Fgecko-based-html2ps#code",[1436],"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fcpp\u002Fhtml2ps\u002F (Darcs)",{"id":1454,"title":1455,"titles":1456,"content":1457,"level":9},"\u002Fgenetic-programming","Genetic_Programming",[],"The idea is to use lessons from biological evolution theory to automatically generate programs (or solve problems). Genetic Programming ResourcesGP for NLPGenotype-Phenotype MappingOGPFEvolveability",{"id":1459,"title":1460,"titles":1461,"content":1462,"level":9},"\u002Fgenetic-programming-resources","Genetic_Programming_Resources",[],"http:\u002F\u002Fwww.sigevolution.org\u002Fhttp:\u002F\u002Fwww.illigal.uiuc.edu\u002Fhttp:\u002F\u002Fgroups.google.com\u002Fgroup\u002Fracingcompetition - Car racing competition grouphttp:\u002F\u002Fcig.dei.polimi.it\u002F - Car racing competitionhttp:\u002F\u002Fwww.gp-field-guide.org.uk\u002F",{"id":1464,"title":1465,"titles":1466,"content":1467,"level":9},"\u002Fgenotype-phenotype-mapping","Genotype-Phenotype_Mapping",[],"Biologically speaking, a Genotype is the DNA, a Phenotype is a John or Bob or Mary. As genetically-identical twins illustrate, just because you have the DNA for a trait doesn't mean that your actual person will exhibit that trait. This is not so clean as it sounds, of course. There are tons and tons of factors in this mapping from the detailed DNA to the final (and ever changing) phenotype. But... I'm not so interested in Biology. The analogy can be drawn into Genetic Programming. Grammarical Evolution provides a concise example of this idea. Take a grammar of your target language. Assign each production a number. Then a string of numbers can indicate which productions to follow to generate a program. Manipulate this string of numbers and you are manipulating the genotype. Use the numbers to generate a program and this program is the phenotype. This, however, is not my own ideal of a genotype-phenotype mapping. The importance of a mapping in my mind is that a single genotype is actual encoding for a number of phenotypes. Grammatical Evolution, however, creates a one-to-one mapping. I propose that a one-to-many mapping is better than a one-to-one mapping. The basis of my argument is in search-space size. In a one-to-one mapping you have not made the genotype search space any smaller, you have only re-ordered it. Not to say this is a bad thing -- indeed it is a very good thing. I say that making it smaller in addition to reordering the genotype search space is an even better approach. Actually... this is not ''really'' lessening the search space. I suppose it is more like this: in addition to re-ordering the search space (so that results we desire are closer together) we should also group similar results. Hmm. I should additionally mention that in serveral models many genotypes map to a single phenotype. This is not how biological evolution works. It does provide for Neutral Evolution, however. Does my one-to-many mapping provide for neutral evolution? Well I suppose that it provides for neutrality in the same way the one-to-one mappings do. Namely, different genotypes may share a set of resulting phenotypes. And I've changed my mind... this is more or less what biological evolution does. So lets say we do have a genotype which maps to numerous phenotypes (one-to-many). How should we explore this mapping? If the number of possible phenotypes is small then we can just try them all. If, however, the number of phenotypes is large we may once again resort to a stochastic method. Rolland seemed to imply that a one-to-many mapping would be no better than several one-to-one mappings. I wonder if this is the case.",{"id":1469,"title":1470,"titles":1471,"content":1472,"level":9},"\u002Fghostwriter","Ghostwriter",[],"Use the reMarkable2 as an interface to vision-LLMs. Ghost in the machine!",{"id":1474,"title":1475,"titles":1476,"content":1477,"level":15},"\u002Fghostwriter#the-idea","The Idea",[1470],"This is an exploration of another way to interact with vision LLMs, effectively pen-and-paper. All of the up to date info and some notes are at github.com\u002Fawwaiid\u002Fghostwriter.",{"id":1479,"title":1480,"titles":1481,"content":1482,"level":9},"\u002Fgitmo","Gitmo",[],"Listen:  (download) Artist: Brock Wilcox\nCopy and Share: under the terms of Creative Commons Attribution-NonCommercial license!",{"id":1484,"title":300,"titles":1485,"content":1486,"level":15},"\u002Fgitmo#lyrics",[1480],"President Obama\nYou know you wanna\nGet rid of Gitmo\nLet all those people go Maximum security\nThat's good enough for me\nDo it for society\nTry them now or set them free President Obama\nYou know you wanna\nGet rid of Gitmo\nLet all those people go We have come too far\nFor this to be who we are\nShow the world we know\n107 left to go Maximum security\nThat's good enough for me\nDo it for society\nTry them now or set them free President Obama\nWhen are you gonna\nGet rid of Gitmo\nLet all those people go! Alternate verses We're the USA\nLeader for today\nShow the world we know\nLet those people go",{"id":1488,"title":1489,"titles":1490,"content":1491,"level":9},"\u002Fgood-thing","Good_Thing",[],"Something which is ethically, morally, and taoistically Right.",{"id":1493,"title":1494,"titles":1495,"content":1496,"level":9},"\u002Fgot-one-shoe","Got_One_Shoe",[],"A delightful song about that one shoe you can't seem to find! Lyrics by Brock, music by Brock, Jason, and Elizabeth. (download) I got one shoe,\nLookin' for the other,\nGot one shoe,\nLookin' for his brother,\nGot one shoe,\nLookin' for the other,\nWell there ain't no shoe in sight! How am I gonna get to school?\nHow am I gonna get to work?\nI better find that shoe real soon,\nOr else I'm gonna go bezurk! I got one glove,\nLookin' for the other,\nGot one glove,\nLookin' for his brother,\nGot one glove,\nLookin' for the other,\nWell there ain't no glove in sight! How am I gonna get to school?\nHow am I gonna get to work?\nI better find that glove real soon,\nOr else I'm gonna go bezurk! (Musical interlude) I got one sock,\nLookin' for the other,\nGot one sock,\nLookin' for his brother,\nGot one sock,\nLookin' for the other,\nWell there ain't no sock in sight! How am I gonna get to school?\nHow am I gonna get to work?\nI better find that sock real soon,\nOr else I'm gonna go bezurk! I got one shoe,\nLookin' for the other,\nGot one shoe,\nLookin' for his brother,\nGot one shoe,\nLookin' for the other,\nWell there ain't no shoe in sight!",{"id":1498,"title":1499,"titles":1500,"content":1501,"level":9},"\u002Fgraph-module","Graph_Module",[],"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.",{"id":1503,"title":1504,"titles":1505,"content":1506,"level":9},"\u002Fgraviton","Graviton",[],"A theorized subatomic particle which would explain gravity.",{"id":1508,"title":870,"titles":1509,"content":1510,"level":56},"\u002Fgraviton#see-also",[1504],"http:\u002F\u002Fwww.geocities.com\u002Frecycling_universe\u002Fed_gravitons2.htmhttp:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGraviton",{"id":1512,"title":1513,"titles":1514,"content":1515,"level":9},"\u002Fgravitonism","Gravitonism",[],"A religion\u002Fphilosophy in which Gravitons are the basis of all spiritual or otherwise mysterious things -- Souls, Dark Matter, Homesickness, and the appeal of free-fall or downhill sports.",{"id":1517,"title":1518,"titles":1519,"content":1520,"level":15},"\u002Fgravitonism#the-graviton","The Graviton",[1513],"Gravity has been an accepted phenomenon for years. Yet when Newton first introduced the idea of universal gravitation skepticism was very high. The problem was that his equations described what happens in a crude way... but they gave no indication as to ''why'' or ''how'' gravity actually works. It just works. Scientists of his day were pretty freaked out about this whole notion of \"action at a distance.\" But then they all died. By the next generation it was pretty much accepted and they moved on... now people don't mention \"action at a distance\" as being a problem at all, even though it describes something we'd normally call magical. As subatomic theories of physics continued to unravel the secrets of mother nature during the 20th century the nagging question as to the why and how of gravity began to become increasingly heard. This was mostly due to being closer and closer to an actual understanding. The closer we get the more pronounced the gap in our knowledge becomes. Thus the concept of Graviton has become popular. A Graviton is a subatomic particle, like an electron, which is the cause of gravity. It is difficult to imagine gravitons, but the idea is that all matter emits them and thus big balls of matter emit more of them (weigh more), and that the gravitons somehow cause the attractive force of gravity.",{"id":1522,"title":1523,"titles":1524,"content":1525,"level":15},"\u002Fgravitonism#beyond-gravity","Beyond Gravity",[1513],"Gravity itself is a minor role in the life of a graviton. As gravitons flow through all matter -- living, dead, dense lead, and even sponges -- it causes subtle influences which explain a lot more about our world than just gravity. Let's start with Dark Matter. Dark matter is the missing variable which balances the total weight of the universe. Dark matter essentially gives off gravitons but is otherwise so far undetectable. Well that is because dark matter ''is'' gravitons. Once set free after the Big Bang, large amounts of gravitons filled the void of space, pushing and pulling until they spread out over everything. They, in fact, encouraged the expansion which followed the big bang... pulling things apart. Second is the concept of soul. When a human dies their body instantly loses some weight... that is it instantly loses a significant amount of graviton-generating power. The center of a life is the soul... the gravitons which add coherence to it as a being.",{"id":1527,"title":1528,"titles":1529,"content":1530,"level":15},"\u002Fgravitonism#sports","Sports",[1513],"Gravitons play a big role in our lives. From the womb we first gain our gravitons from our mother, pulling some of hers into ourself. The influence of gravitons is felt from the moment of conception and throughout one's life. It is no wonder that once we are out in the world we wish to return home (homesickness)... our gravitons wish to return to their previous state. Yet even gravitons feel restless. Downhill sports and skydiving put our gravitons into active use. They are able to accelerate to their full potential, and in the process bring us along. The happiest feeling in the world, some say, is the rush attained during freefall.",{"id":1532,"title":1533,"titles":1534,"content":1533,"level":9},"\u002Fgrid","Placeholder",[],{"id":1536,"title":1537,"titles":1538,"content":1539,"level":9},"\u002Fgrouprss","GroupRSS",[],"This is the aggregated RSS of upcoming events from several Phoenix-area groups. \u003Crss http:\u002F\u002Fwww.azphp.org\u002Fnode\u002Ffeedhttp:\u002F\u002Fplug.phoenix.az.us\u002Findex2.php?option=com_rss&feed=RSS1.0&no_html=1http:\u002F\u002Fasulug.org\u002Fnode\u002Ffeed>",{"id":1541,"title":1542,"titles":1543,"content":1544,"level":9},"\u002Fguestbook","Guestbook",[],"Please let me know that you've visited my site! Name: Brock Email: awwaiid@thelackthereof.org This is an example of a guestbook entry. Just do like I do! Just separate entries with some dashes.",{"id":1546,"title":1547,"titles":1548,"content":1549,"level":9},"\u002Fhttp-abstraction-layers","HTTP_Abstraction_Layers",[],"These are protocols or APIs or libraries that roughly abstract away HTTP serving from your application. Most of them take the form of:",{"id":1551,"title":1552,"titles":1553,"content":1554,"level":9},"\u002Fhalloween-costumes","Halloween_Costumes",[],"I never want to be the same thing twice... so: 2015 - Fisherman2014 - Wolverine2013 - Bitcoin2012 - Frog Prince2011 - Spider2010 - Blue Knight2009 - Tiger2008 - Orange Cone2007 -2006 - Lumberjack2005 - ...2004 - Mario Plant2003 -    --- Monty Python Old Lady, Jeff Rushall, Weirdo2002 -2001 -2000 -1999 - Eggplant, NAU freshman, Flagstaff1998 - ... nothing? ... went to a party, HS senior1997 -1996 -1995 -1994 -1993 -1992 -1991 -1990 -1989 -1988 -1987 -1986 -1985 - WWHH-I? -1984 -1983 -1982 -1981 - too young? I was zero years (10 months) old. Robot\nTurtle\nZorro\nAndy (of Raggedy Ann).\nFriar tuck? WWHH -- Wilcox Waddell Halloween Hayride",{"id":1556,"title":1557,"titles":1558,"content":1559,"level":9},"\u002Fhammie","Hammie",[],"Hammie (The Queene's Prince Hamlet) was one of the greatest dogs ever. He was a large Great Dane (upwards of 190 pounds!) and was a gentle giant. We should trace his family tree!",{"id":1561,"title":1562,"titles":1563,"content":1564,"level":9},"\u002Fhiphop","HipHop",[],"There is some subset of Hip Hop music that I like -- I don't know the name of it. I've been doing random sampling for a while ... now it's time to take some notes. Atmosphere\nYesterday - nice beat, nice twist in the storyHilltop Hoods\nHard Road, Restrung -- cool album with symphonic backingIllogic",{"id":1566,"title":1567,"titles":1568,"content":1569,"level":9},"\u002Fhoney-honey-honey","Honey_Honey_Honey",[],"Honey, Honey, Honey,\nI woke up and found a bunny,\nHe looked a little funny,\nSo I put him on my tummy. Well he looked me in the eye,\nAnd he gave a little sigh,\nThen he jumped upon my thigh,\nThen he flew up in the sky! (written... 2011?)",{"id":1571,"title":1572,"titles":1573,"content":1574,"level":9},"\u002Fhuman-essentials","Human Essentials",[],"Part of the Ruby For Good organization; inventory control for diaper and period-supply banks. See the 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). I got turned onto the 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!\" Every week on Sunday morning (\"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. Join Us!",{"id":1576,"title":1577,"titles":1578,"content":1579,"level":9},"\u002Fhybrid-approach-to-templating","Hybrid_Approach_to_Templating",[],"Just some brain-storming here. I've been going back and forth between an inline, DSL-style template and an external, DOM-manipulation template. Here's what the DSL looks like: Each has advantages and disadvantages altering the balances between abstraction and maintainability. In the DSL it is very easy to add in loops and subroutine calls that generate various bits of the structure. Callbacks (simple ones at least) can be put inline. In the second the HTML is separate, which also means that it can be developed separately. The HTML Designer can build and the Code Designer weaves. My current idea is to have them both! Simply make the DSL produce a DOM. Then one can switch arbitrarily. Snippets can be generated and replace parts of the DOM, or raw HTML can be used in place of some of the inner DSL code. Either way we get the DOM tree. Once we have the DOM tree on the server we can do some other magical things, such as only sending the tree diffs over ajax (as has been done elsewhere I'm sure). Also in my head is that a similar hybrid approach can work for control flow. The split there is between event handling and sequential flow. The idea is to simply allow both.",{"id":1581,"title":1582,"titles":1583,"content":1584,"level":9},"\u002Fi-like-caffeine","I_Like_Caffeine",[],"(download) I like caffeine\nFrom my favorite bean\nMakes me want to sing\nI like caffeine Once upon a time\nThere was a mime\nTown called Sublime\nOnly had a dime No-where to go\nFeeling pretty low\nAt the corner store\nBought a cup o' Joe Late for a train\nHiding from the rain\nMet the perfect dame\nNever caught her name In a sunshine ray\nStanding down the way\nPulling shots all day\nMade a mean Latte",{"id":1586,"title":1587,"titles":1588,"content":1589,"level":9},"\u002Fi-love-vim","I_love_Vim",[],"I do! I do! Vim is an improved clone of vi (see vim.org) which is free under the GPL. It used to be guilt-ware (you could use it if you felt guilty about not donating to the author's cause), but now it is Free. I won't go into a holy-war rant on this one because, well, I just like vim better and don't really care about emacs or others. I don't hate them. I don't want to recruit people. I just love vim. You should check out my Vim Configuration!",{"id":1591,"title":1592,"titles":1593,"content":1594,"level":9},"\u002Ficfp-contest","ICFP_Contest",[],"I enjoy participating in the International Conference for Functional Programming Contest, an annual coding marathon. ICFP Contest 2005 - Cops & Robbers AIICFP Contest 2006 - Implement UMIX VM and then solve puzzlesICFP Contest 2007 - Implement VM to render image, finding cluesICFP Contest 2008 - Mars rover AIICFP Contest 2009 - Satellite controlICFP Contest 2010 - Car and fuel productionICFP Contest 2011 - 256-slot magic-the-gathering-like gameICFP Contest 2012 - Boulder Dash alike AIICFP Contest 2013 - Infer function definitionsICFP Contest 2014 - Packman-alike AI (Lisp and 8-bit)ICFP Contest 2015 - Hexagon Tetris AIICFP Contest 2016 - Origami",{"id":1596,"title":1597,"titles":1598,"content":1599,"level":9},"\u002Ficfp-contest-2005","ICFP_Contest_2005",[],"This is to help coordinate efforts on the ICFP Contest 2005. I'm almost done implementing the protocol and state machines. I switched languages from Ocaml to Python in the middle, which added a few hours on. I am, however, using a different style in Python than I would normally have used. After I get done with the stuff mentioned above I'm going to set up the graph data structure. Then I'll work on the AI. I'll probably just use some fuzzy logic. I don't know whether I'll have time for minimax (which I have zero experience with). --Ben Sweet. So far we've got a random-robber and a random-cop implemented, and we have pseudocode for our AI for the robber and are going to re-use some of those ideas for the cop. We (david and I) are doing it in Perl for its flexibility and CPAN. So, for example, we are using cpan:Graph to do our graphing. Unfortunately perl is slow, though you'll have the same issue (speed) with python. Not so slow that it is too slow though. at least not yet. Up to now I seem to be taking roughly the same path you are. I implemented random-cop and random-robber this morning. I was thinking about using cpan:Graph to get shortest paths and putting them into a file somehow. I haven't done AI yet but I plan on working until about 3:00AM tonight and doing the same tomorrow. -- Ben Sweet. Out of curiosity, do you come here to look for updates, or do you look at the RSS feed for the wiki, or what? Just wondering :) --Brock I'm not using RSS yet. I typically check your site every two weeks to a month. Generally when I post things anywhere I check back once or twice a day until the discussion is over. I'm glad you asked, though. It has caused me consider using RSS once again. I'll probably just find a GUI client for Gnome. I'd like a client where I can add an RSS feed with an expiration date, so a week after I post a comment, my computer will stop polling the comment feed (for pages that have multiple RSS feeds). It would be nice if I could say how many days rather than calculate the date in my head, too. Know of any good clients for Gnome? --Ben I haven't really been satisfied by any clients in particular. And I'm pretty sure there aren't any with the feature you desire :(. The client in Firebird is as good as any, so I use that from time-to-time. I wish I was so organized or thoughtful to check back on the sites I post on :)",{"id":1601,"title":1533,"titles":1602,"content":1533,"level":9},"\u002Ficfp-contest-2006",[],{"id":1604,"title":1605,"titles":1606,"content":45,"level":9},"\u002Ficfp-contest-2007","ICFP_Contest_2007",[],{"id":1608,"title":1609,"titles":1610,"content":1611,"level":15},"\u002Ficfp-contest-2007#the-task","The Task",[1605],"Read the full description on the ICFP website, but here is a summary: an alien crash landed on earth and we must fix his DNA. We were provided a 22-page specification for how the alien DNA gets translated into RNA and how the RNA can then be rendered as an image. They provided the initial DNA and the image that it produces when the DNA->RNA->image transfer works correctly. They also provided the target image -- the exact pixel-by-pixel goal for fixing the alien. The fix takes the form of DNA that is pre-pended onto the provided DNA, which immediately brings to mind the idea that your new DNA will build off of the existing technology. They also provided a prefix to get you started.",{"id":1613,"title":1614,"titles":1615,"content":1616,"level":15},"\u002Ficfp-contest-2007#the-team","The Team",[1605],"Though I invited everyone I talked to, it ended up being just Jason and myself which worked out great. Jason was able to dedicate the entire 72 hours to the project, and we did a bit of planning beforehand to figure out what resources we'd need, where we'd hang out, etc. I more or less pushed him into using Perl, though he didn't seem to mind :)",{"id":1618,"title":1619,"titles":1620,"content":1621,"level":15},"\u002Ficfp-contest-2007#friday","Friday",[1605],"After getting the (completely insane) specification we went to breakfast and mulled a bit. Got back and divided the task into two parts, DNA->RNA and RNA->Image. This was a very clean way to separate the code. I worked on the DNA->RNA while Jason took the RNA->Image. The first implementation of DNA->RNA I did was in Perl, and I never quite got the bugs out but I made a lot of progress. Unfortunately it was very very slow. So sometime in the afternoon I started over in OCaml (making heavy use of the recently released Vec library). Meanwhile Jason began building the RNA->Image library. He was able to produce images almost immediately using Imagemagick.",{"id":1623,"title":1624,"titles":1625,"content":1626,"level":15},"\u002Ficfp-contest-2007#saturday","Saturday",[1605],"All of Saturday was spent perfecting our implementation of the DNA->RNA->Image spec. My DNA->RNA implementation continued to have bugs, but the extra prefix they provided helped a lot. It turned out to be a self-check prefix, which tried out various things in both the DNA->RNA stage and (assuming that part worked) in the RNA->Image stage. Jason's image library was working ok, but he did end up switching to Imager once he started dealing with lots of alpha transparency and such. Perl got in his way quite a bit on Saturday, the same old confusion about arrays vs arrayrefs (and arrays of arrayrefs)... oh to have Perl6. In any case he got it going, though at some point switched from keeping his own bitmap to just drawing directly on an Imager object.",{"id":1628,"title":1629,"titles":1630,"content":1631,"level":15},"\u002Ficfp-contest-2007#sunday","Sunday",[1605],"We finally got the self-check to run perfectly, after fixing a few more bugs in both parts of our program. Then Jason set to work building techniques for getting us closer to the target image. His idea was to break the image into a grid and flood fill each square with the most common color. Speaking of flood fill... we found out on Sunday that the flood fill algorithm that comes with Imager had a subtle bug. It took us four freakin hours to fix! gar! On the other hand, one nice thing about Imager is its Inline:: support, which allowed us to drop down to C to speed up a few critical spots in our RNA->Image conversion. Probably the coolest thing that came out of Jason's stuff was an nifty algorithm for selecting a specified color. The specification doesn't allow you to just pick any RGBA color you like, instead we get a set of 8 or so predefined colors and must mix them together. The trick is that each color you add averages with the existing ones. Add in a red (255,0,0) and a blue (0,255,0) and you'd get purple (127,127,0). Throw in a green (0,0,255) and you'd get some shade of grey around (80,80,80) or so. His algorithm would calculate how many of each red, green, or blue (or the other colors they provided) you'd need to get some given color. Meanwhile I spent quite a bit (probably too much) of time optimizing the DNA->RNA stage for speed. Unfortunately almost all of my ideas didn't pan out. At the same time I started running through random ideas and reverse engineering of the original DNA. At some point I happened upon a static image in the code which provided some hints and two more DNA prefixes. One of the prefixes turned night into day in the image, getting us much closer to the target. That is what ultimately got us our final score. I uploaded this prefix and noticed that there were some folks with a prefix that was slightly shorter (and shorter prefix == more points). So I studied ours and saw that there was an extra bit that could be removed and bumped us up a notch. I spent some time looking for other manipulations of this prefix but didn't get anything better. The second prefix pointed us to a user manual. The manual page had fairly specific instructions for finding other manual pages, but I never did figure it out. My understanding was that it was really easy, so I either overlooked it or tried it and messed it up somehow. Come about 2 in the morning we saw that we weren't going to get any farther with either of our approaches. Jason had grids getting flood filled with colors, but it didn't provide an advantage as far as number of pixels correct over the night-to-day prefix. And I dug around more in the code but didn't make any further breakthroughs. So we called it a night! It was great fun!",{"id":1633,"title":1634,"titles":1635,"content":1636,"level":15},"\u002Ficfp-contest-2007#tools","Tools",[1605],"We used darcs to share code. It's in apt-get, and here are the basics:",{"id":1638,"title":1639,"titles":1640,"content":1641,"level":9},"\u002Ficfp-contest-2007#initial-get","Initial get",[],"darcs get http:\u002F\u002Fserver\u002Fpath",{"id":1643,"title":1644,"titles":1645,"content":1646,"level":9},"\u002Ficfp-contest-2007#pull-updates","Pull updates",[],"darcs pull",{"id":1648,"title":1649,"titles":1650,"content":1651,"level":9},"\u002Ficfp-contest-2007#pull-updates-from-a-different-server","Pull updates from a different server",[],"darcs pull http:\u002F\u002Fserver\u002Fpath",{"id":1653,"title":1654,"titles":1655,"content":1656,"level":9},"\u002Ficfp-contest-2007#record-your-local-changes-the-l-is-for-also-adding-new-files","Record your local changes (the -l is for also adding new files)",[],"darcs rec -l We used other common unix command line tools, such as grep and less and xxd and imagemagick. Programming languages: Perl, OCaml, C (using Inline::C).",{"id":1658,"title":1533,"titles":1659,"content":1533,"level":9},"\u002Ficfp-contest-2008",[],{"id":1661,"title":1533,"titles":1662,"content":1533,"level":9},"\u002Ficfp-contest-2009",[],{"id":1664,"title":1533,"titles":1665,"content":1533,"level":9},"\u002Ficfp-contest-2010",[],{"id":1667,"title":1533,"titles":1668,"content":1533,"level":9},"\u002Ficfp-contest-2011",[],{"id":1670,"title":1533,"titles":1671,"content":1533,"level":9},"\u002Ficfp-contest-2012",[],{"id":1673,"title":1533,"titles":1674,"content":1533,"level":9},"\u002Ficfp-contest-2013",[],{"id":1676,"title":1677,"titles":1678,"content":45,"level":9},"\u002Ficfp-contest-2014","ICFP_Contest_2014",[],{"id":1680,"title":1681,"titles":1682,"content":1683,"level":15},"\u002Ficfp-contest-2014#challenge-packman-alike-ai-lisp-and-8-bit","Challenge: Packman-alike AI (Lisp and 8-bit)",[1677],"Team:\nMembers:\nTechnology: Did this one in Portland with Jason!",{"id":1685,"title":1686,"titles":1687,"content":45,"level":9},"\u002Ficfp-contest-2015","ICFP_Contest_2015",[],{"id":1689,"title":1690,"titles":1691,"content":1692,"level":15},"\u002Ficfp-contest-2015#challenge-hexagon-tetris-ai","Challenge: Hexagon Tetris AI",[1686],"This year Jason and I again met up in Portland to do the contest.",{"id":1694,"title":1695,"titles":1696,"content":1697,"level":15},"\u002Ficfp-contest-2015#result","Result",[1686],"We were at 131 of 300+ on the leaderboard, so unlikely that we'll be going on to further rounds.",{"id":1699,"title":1700,"titles":1701,"content":45,"level":9},"\u002Ficfp-contest-2016","ICFP_Contest_2016",[],{"id":1703,"title":1704,"titles":1705,"content":1706,"level":15},"\u002Ficfp-contest-2016#challenge-folding-origami","Challenge: Folding Origami",[1700],"This year the ICFP will be held in Nara, Japan. The contest was organized by members of The University of Electro-Communications. I checked out their website since that sounded like a weird school name, and see that they are also hosting \"The Joint Conference of the 8th International Conference on ESP in Asia & the 3rd International Symposium on Innovative Teaching and Research in ESP in Japan\". Unfortunately \"ESP\" here is for \"English for Specific Purposes\" rather than the usual usage. Unlike other years, the contest started at 00:00 UTC, which is 8:00pm Thursday, and lasted until 8:00pm Saturday. This was a nice schedule to start with, getting to roll into the contest right after work, but it did leave me jazzed up on Sunday night after it was over. I was joined at my house by Mike, and Jason joined us remotely from Portland. We coordinated by google hangouts, irc, and github. Near the end I turned on the github-notification hook that posted to irc upon pushes, and should have done that a lot earlier. First we read through the problem, which was very tricky to wrap our heads around as usual, despite it's somewhat minimalistic Japanese aesthetic. We drew on the whiteboards and drew on paper and folded some paper. Apparently I'm not supposed to use scissors to do origami, who knew? The rough idea is that we are given the shadow, or \"silhouette\", of a folded origami flattened to 2D. We then need to reconstruct it by starting with an unfolded paper and then trying to fold it until we get the same shadow. During the lightning round we were given 101 problems of this form. After the lightning round we could submit new problems of our own invention and solve problems submitted by other contestants. We submit our solutions as we go and acquire points based on how well we solved a problem, how big in bytes was our solution, and how easy it was to solve (based on how many others solved it). They even provided a nice leaderboard. I talked Mike into programming in Perl 6 :) . While he and Jason worked on understanding the rules of folding and solving a few problems by hand, I whipped up a problem parser using Perl 6 Grammars, which worked perfectly. I had fortunately practiced a bit before. I built a simple caching API layer to get problems from the contest server, just shelling out to curl basically. After that I did a very basic visualization using cpan:Imager (via Inline::Perl5), which Mike then took over and worked on. Then (and we're talking Friday or Saturday) I started working on modeling folding of an origami. And then I got stuck. I didn't realize it until I was taking a shower on Monday morning after the contest, but I was attempting to implement too general of a solution for part of it. The rough idea is to consider an origami as a bunch of polygons. You start off with one, and then when you fold it you end up with two, one of which you reflect along the fold line. So I set out to chop up a polygon given a line, and unfortunately didn't think through my goal clearly enough -- I tried to split ANY polygon. That includes funky looking concave polygons that when you cut with a single line might split into a bunch of pieces. What I realized after the contest was that a single cut starting from a solid piece of paper can never end up that way -- there is no way to cut it into a funky shape! So I lost a lot of time there. The other thing that cost time was reflection. We cast about for some off the shelf libraries, but got mad at them, so I just started to implement reflection myself. I even thought I had it working, but sometime early on Sunday I realized something was fishy. I switched to an off-the-shelf implementation via cpan:Math::Geometry::Planar and presto! Worked much better. Should have used that from the beginning. Meanwhile Mike was both improving the visualization, especially around setting a useful viewport for shadows that had been moved far away from the axis origins. He also went through and generated images for the existing problem, which helped us pick out good test cases. Jason kept at it too, starting to hand-generate us some problems to submit once we got past the lightning round, and hand-solving some of the problems that were provided. After visualizations were working, Mike connected the dots between problems and the origami modeling to calculate a score, making further use of the Planar library. This gave us the final ingredient we needed for automated exploration of simple folds in origami space. Finally, late on Sunday, we got to where I wanted to be by Saturday morning. Given a problem we could start with an unfolded square and then randomly fold, keeping the improvements. Basic hill-climbing, in other words. I consider this stumbling across the finish line ... but we made it :) Code: https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Ficfp2016",{"id":1708,"title":1709,"titles":1710,"content":1711,"level":9},"\u002Fideas","Ideas",[],"2003.09.24 Here's one: A nearly static index of keywords on this entire website. It would be automatically generated on a regular basis (daily or something). It would be like the index of a book. This has a one-up on a regular search engine since you might say \"Hey... I wasn't looking for that but its neat!\"",{"id":1713,"title":1714,"titles":1715,"content":1716,"level":9},"\u002Fim-a-platonist","I'm_a_Platonist",[],"From http:\u002F\u002Fwikipedia.org\u002F we see that Platonism can be defined along these lines: Platonic idealism is the theory that the substantive reality around us is only a reflection of a higher truth. That truth, Plato argues, is the abstraction. A particular tree, with a branch or two missing, possibly alive, possibly dead, and initials of two lovers carved into its bark, is distinct from the concept of a Tree. A Tree is the ideal that each of us holds that allows us to identify the imperfect reflections of trees all around us.\nWhen I first look at this definition of Platonism I certainly don't think that I'm a platonist. People are pattern-matchers, getting the idea of 'Tree' from all the examples of trees which have been presented to us. We don't have a deep grasp of some higher true reality.That is, of course, until we consider Mathematics.",{"id":1718,"title":1719,"titles":1720,"content":1721,"level":9},"\u002Fimmaterial-things","Immaterial_Things",[],"Written and performed by Brock Wilcox and Jason Woys. Please share, copy, and modify, under the terms of Creative Commons Attribution-ShareAlike (CC BY-SA)! (download) Em6 Cm G Em6 F# A -- Bridge E A E A E B A E Last night I walked\nTo the store\nSaw something peculiar\nOn the corner\nStanding there naked\nWearing all her clothes\nI asked her if she knew I could see her soul Refrain: She said\nI get that a lot\nI wear it under my sleeve\nYou're creepin me out, mister\nWhy don't you leave?\nWhy so bothered by immaterial things? Now I wonder\nCould she be right?\nShould I reconsider\nHow I live my life,\nLooking at people\nWith objectivity,\nI asked her what's wrong with transparency refrain So I left\nMade my way home\nTurned on the TV\nWatched the world alone\nAnd it occurred to me\nThat reality\nIs just a buzzword for immaterial things refrain Why so bothered by immaterial things?",{"id":1723,"title":1724,"titles":1725,"content":1726,"level":9},"\u002Fimmortal-crowd","Immortal_Crowd",[],"Listen:  (download) Artists: Jason Woys and Brock Wilcox\nCreation: 2012-11-21\nCopy, Share, and Create: under the terms of Creative Commons Attribution-ShareAlike (CC BY-SA) license",{"id":1728,"title":300,"titles":1729,"content":1730,"level":15},"\u002Fimmortal-crowd#lyrics",[1724],"How our faces felt they\nswelled from the blood\nWe drained our river and sank\nlike a wounded stud As the time draws near\nday turns to night\nWhat good are these wings\ncan we not take flight? And when the rapture comes\ntakes all our friends\nAt least you'll keep me company\nas the rest ascend Here we wait for our\nfate with fear aroused\nTime means nothing to the\nimmortal crowd",{"id":1732,"title":1733,"titles":1734,"content":1735,"level":9},"\u002Fintermap","InterMap",[],"This is the InterMap wikipedia http:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002F\nWikipedia http:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002F\nLJ http:\u002F\u002Fwww.livejournal.com\u002Fusers\u002F\nTLT http:\u002F\u002Fthelackthereof.org\u002F",{"id":1737,"title":1738,"titles":1739,"content":1740,"level":9},"\u002Fintroduction-to-frequent-sequential-pattern-mining","Introduction_to_Frequent_Sequential_Pattern_Mining",[],"Here are some links for now: Wikipedia article on sequential miningCloSpan homepageSPAM (mining algorithm) homepage",{"id":1742,"title":1743,"titles":1744,"content":1745,"level":9},"\u002Fion-window-manager","Ion_Window_Manager",[],"I love it. I used ion2 for years and years (at least 2005-2010)... but then in 2010 I switched to the XMonad Window Manager. http:\u002F\u002Fwww-128.ibm.com\u002Fdeveloperworks\u002Flinux\u002Flibrary\u002Fl-cpion.html",{"id":1747,"title":1748,"titles":1749,"content":1750,"level":9},"\u002Fit-takes-all-sorts","It_Takes_All_Sorts",[],"Songwriting: Jason Woys and Brock Wilcox\nGuitar: Jason Woys\nVocals: Jason Woys and Brock Wilcox Verses: G E C G\nChorus: A C G E D C G E (verse 1)\nA man walks in the door\nSays my name is George\nI got a big time offer for you\nAin't got nothin to lose Just a little bit up front,\nI'll double it each month,\nSimple as a song,\nWhat could go wrong? (Chorus)\nCause that's our lot\nCause that's our lot\nIt's simple til it's not\nIt's simple til it's not\nIt's simple til it's not\nMy favorite retort\nIt takes all sorts (x7) (verse 2)\nSaw a girl standing there,\nGoing by the name of Cher,\nTelling me my life needs more,\nAnd about her cult du jour All you need to be happy,\nIs to get rid of everything,\nBut before you do,\nCould you buy a trinket or two? (chorus) (verse 3)\nPassing by, saw something odd,\nAn old man named Brother Todd,\nWarning of the world's demise,\nPreaching the End Is Nigh, Been standing on the same corner,\nSince Nineteen Eighty Four,\nEventually he may be right,\nThe world's gotta end sometime. (chorus)",{"id":1752,"title":1753,"titles":1754,"content":1755,"level":9},"\u002Fits-dark-here-now","It's_Dark_Here_Now",[],"it's dark here now\nyou're far away\nyou're still within\nthe light of day waiting, waiting\nit's all i've got\ni cannot be\nwhat i am not no self-fulfilling\nprophecy\ncan come between\nmy love and me i must become\none with the tao\nbut you're far away\nand it's dark here now",{"id":1757,"title":1758,"titles":1759,"content":1760,"level":9},"\u002Fjquery-autoindent","JQuery_Autoindent",[],"Parent: Projects Pulling together random snippets that lie around the internet, I know that it's possible to build a textarea auto-indent. So I did. darcs get http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fjavascript\u002Fautoindent\u002F It is based off of the somewhat incomplete jquery extension at http:\u002F\u002Flaboratorium.0xab.cd\u002Fjquery\u002Ffieldselection\u002F0.2.3-test\u002F. 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. Check out the jquery autoindent demo!",{"id":1762,"title":1763,"titles":1764,"content":1765,"level":9},"\u002Fjre-on-debian","JRE_on_Debian",[],"Debian sucks when it comes to jre (and j2sdk and so on). Here's the best way I've found so far: http:\u002F\u002Fwww.debian-administration.org\u002Farticles\u002F142",{"id":1767,"title":1768,"titles":1769,"content":1770,"level":9},"\u002Fjobs","Jobs",[],"This page is to help me organize my job search.",{"id":1772,"title":1773,"titles":1774,"content":1775,"level":15},"\u002Fjobs#job-search-sites","Job Search Sites",[1768],"Career Builder - Tempe, AZ Work Zoo US Perl jobs Plug News on jobs",{"id":1777,"title":1778,"titles":1779,"content":1780,"level":15},"\u002Fjobs#job-applications","Job applications",[1768],"Status: (A) Applied, (P) Pending, (K) Kill\nDetail: (C) Custom cover letter, (G) Generic cover letter, (F) Form application Teksomething http:\u002F\u002Fcareers.aztech.idealhire.com\u002Fopportunity_.asp?OID=AZT1PU269448 http:\u002F\u002Fwww.jobsearch.org\u002Fseeker\u002Fjobsearch\u002Fquick?action=JobSearchViewJob&JobSearch_JobId=18179576&JobSearchType=JobSearch U-Haul Choice Hotels Compiler Developer (though I'm not qualified...) Perl internet programming - fun. they want me to write Perl\u002FC code as a pre-employment test. (AF) General Dynamics - Entry Level Software Engineer I (AF) General Dynamics - College Level Software Engineer I",{"id":1782,"title":1783,"titles":1784,"content":1785,"level":9},"\u002Fkeyboard-number-symbol-swap","Keyboard_Number-Symbol_Swap",[],"(Instructions for doing this on other OSes or setups are welcome!) The idea here is that we use the symbols at the top of the keyboard a lot more often than the numbers at the top of the keyboard. In my case because I write a lot of perl :) Here are the various configurations that you can set to switch the number keys and symbol keys in Linux\u002FX11 -- effectively making it so you don't press shift for the symbols but you DO for the numbers.",{"id":1787,"title":1788,"titles":1789,"content":1790,"level":15},"\u002Fkeyboard-number-symbol-swap#configuration","Configuration",[1783],"The first, .Xmodmap, is what actually switches things. The others are to make other applications be OK with the new setup. From: ~\u002F.Xmodmap Once you put your .Xmodmap in place (and do \"xmodmap .Xmodmap\" to load it), your buttons are swapped! But you might find, as I did, that other applications with key-modifiers expected those same keys to be numbers. Some of them you can just hold down an extra 'shift' for, but some you can't. And that's no fun anyway. I did try to do some fancy stuff with xmodmap and then with x11 xkb configuration to make it so that alt+n (no shift) still sent the number key. But I gave up. Suggestions welcome. First thing that I fixed is my XMonad Window Manager. It uses alt+n to switch workspaces, so I made it so it can additionally use alt+symbol. From: ~\u002F.xmonad\u002Fxmonad.hs Next is screen. It uses ctrl-a, N to switch to the Nth window. ctrl-a, shift-N works, but is no fun. So this will make it so you do ctrl-a, symbol. From: ~\u002F.screenrc Mike does the same thing with Gnome Terminal. He fixed his using the GUI, and it produced this gconf file. You might be able to just drop it in. From: ~\u002F.gconf\u002Fapps\u002Fgnome-terminal\u002Fkeybinding\u002F%gconf.xml",{"id":1792,"title":1793,"titles":1794,"content":1795,"level":15},"\u002Fkeyboard-number-symbol-swap#results-of-usage","Results of Usage",[1783],"2011.03.18 Entering passwords is trickyI find it very difficult to type :) because I type it so often and fastMost of the time I find myself still pressing shift when I don't need toLess often is not pressing shift when I need numbersVim line-number or count-based operations have become annoyingMike noted that \"select count(*)\" is easier to type :) 2011.10.21 I am now also using xbindkeys to make 'shift+shift' (left+right) toggle the setup. That way I can easily switch it back if some other poor fool is trying to use my laptop. On my desktop it isn't a problem since I have the number pad.Some number-oriented features line-number are actually easier. For example, in vim when jumping to line 343, I have to press shift to get ':' anyway. so ':343' I hold shift the whole timeI'm still using this full time, and the main annoying thing is using other people's broken keyboards :)",{"id":1797,"title":1798,"titles":1799,"content":1800,"level":9},"\u002Fknit-some-shit","Knit_Some_Shit",[],"Listen:  (download) Artists: Elizabeth Woys and Brock Wilcox\nCopy and Share: under the terms of Creative Commons Attribution-NonCommercial license!",{"id":1802,"title":1803,"titles":1804,"content":1805,"level":15},"\u002Fknit-some-shit#chords","Chords",[1798],"A, D, A E, (A, D, E)",{"id":1807,"title":300,"titles":1808,"content":1809,"level":15},"\u002Fknit-some-shit#lyrics",[1798],"verse 1\nCome on people, come gather round,\nGonna play you a great new sound,\nA sound that's happy, this is it!\nA sound for singing, while you knit. Now get your needles, get your yarn,\nIf you're creating, well, you'll do no harm,\nPick a pattern, you can follow it through,\nOr start a million projects, just like I do. chorus\nKnit, knit, knit some shit!\nKnit, knit, knit some shit!\nKnit, knit, knit some shit!\nWe've got a knitting song, and this is it! verse 2\nCraft me a sweater, or knit me a glove,\nIt don't matter, if it's made with love,\nKnit me a scarf, knit me a hat,\nKnit me some socks for my kitty cat, Knit me a car, knit me a job,\nKnit a million dollars and I won't have to rob,\nKnit me a war, knit me some love,\nKnit me into hell and to heaven above, chorus bridge - E, D, ..., A, D, E, A\nYou can make it out of superwash, cotton, or merino,\nYou can make it from a worsted or a lacy super fino,\nYou can knit it English Style, or you can knit it Continental, Stitch markers and a lifeline, to keep from going mental,\nYou can knit it in a parking lot, or on some public transit,\nThe only thing that matters is to knit knit knit some shit! chorus",{"id":1811,"title":1812,"titles":1813,"content":1814,"level":9},"\u002Fllm-token-tree-visualization","LLM Token Tree Visualization",[],"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!",{"id":1816,"title":1817,"titles":1818,"content":1819,"level":15},"\u002Fllm-token-tree-visualization#the-next-token-machine","The Next-Token Machine",[1812],"Mostly we talk about LLMs (Large Language Models) as generating one 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 all of the possible tokens and assign each a weight (a probability). So if you have  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. Here you can see a list of tokens of what could come after our prompt. First is . Once a token is generated it is pretty locked in, so the next  and then  aren't too surprising. The first  could have been  ... but that sort of nonsense token is ranked very low. But each step of the selection doesn't look like this. Instead, at each step the overall execution is sampling one of the possible next-tokens.",{"id":1821,"title":1822,"titles":1823,"content":1824,"level":15},"\u002Fllm-token-tree-visualization#token-vocabulary","Token Vocabulary",[1812],"People talk about the \"length\" of a token -- that it is one word or one syllable and so on. But ... how many tokens are there? 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 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  territory. Let's look at some example Tokens from GPT-4o: = 32 = 33 = 34 = 2073; Yes this is a capital- and lower-case- = 3295; Yes this is three letters = 45980; That is a space followed by 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:",{"id":1826,"title":1827,"titles":1828,"content":1829,"level":15},"\u002Fllm-token-tree-visualization#sampling","Sampling",[1812],"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. 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. 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. To make this a bit more visible, here we can see the tree with counts for how many times a particular path was taken. We can already learn a lot! For one thing,  appears to be a very common name for our kitten. Though after the name, the story goes on to either have a comma (), or maybe NOT have a comma, and talk about where Whiskers lived.",{"id":1831,"title":1832,"titles":1833,"content":1834,"level":15},"\u002Fllm-token-tree-visualization#kittens","Kittens",[1812],"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). OK ... now let's try Claude (from Anthropic)... Yep. Kittens are named \"Whiskers\". 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. 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! Therefore all kittens in stories are named Whiskers, or maaaayybbeee Luna. Facts. In conclusion, play around with this LLM Token Tree Visualization Tool to form some new intuitions. You can get the source code over at https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Ftoken-tree.",{"id":1836,"title":1533,"titles":1837,"content":1533,"level":9},"\u002Flesson-00-philosophy",[],{"id":1839,"title":1533,"titles":1840,"content":1533,"level":9},"\u002Flesson-01-printing",[],{"id":1842,"title":1533,"titles":1843,"content":1533,"level":9},"\u002Flesson-02-variables",[],{"id":1845,"title":1533,"titles":1846,"content":1533,"level":9},"\u002Flesson-03-input",[],{"id":1848,"title":1533,"titles":1849,"content":1533,"level":9},"\u002Flesson-04-math",[],{"id":1851,"title":1852,"titles":1853,"content":45,"level":9},"\u002Flesson-05-if-then-else","Lesson_05_-_IF_THEN_ELSE",[],{"id":1855,"title":1856,"titles":1857,"content":1858,"level":9},"\u002Flinks","Links",[],"Here is a collection of links to other things of interest. Feel free to add your own... if I don't like them then I will delete them!",{"id":1860,"title":1861,"titles":1862,"content":1863,"level":15},"\u002Flinks#general","General",[1856],"http:\u002F\u002Fepfarms.net\u002F - Eggplant Farms, the nonprofit hosting organization which David and I startedhttp:\u002F\u002Fwww.wpdfd.com\u002F - Web Page Design For Designers",{"id":1865,"title":1866,"titles":1867,"content":1868,"level":15},"\u002Flinks#friends","Friends",[1856],"http:\u002F\u002Fe2thex.org\u002F - Erik Summerfieldhttp:\u002F\u002Fwoys.org\u002F - Jason Woyshttp:\u002F\u002Fzigamorph.net\u002F - Adam Fritzlerhttp:\u002F\u002Fmousetrout.org\u002F - Mandies",{"id":1870,"title":1871,"titles":1872,"content":1873,"level":15},"\u002Flinks#politics-and-news","Politics and News",[1856],"http:\u002F\u002Fwww.washingtonpost.com\u002Fhttp:\u002F\u002Fwww.nytimes.com\u002Fhttp:\u002F\u002Fnews.bbc.co.uk\u002Fhttp:\u002F\u002Fwww.cnn.com\u002Fhttp:\u002F\u002Fwire.ap.org\u002F - Associated Press news wirehttp:\u002F\u002Fwww.reuters.com\u002Fhttp:\u002F\u002Fnews.google.com\u002F - Automatically aggregated news by GoogleInternet Health Report",{"id":1875,"title":1876,"titles":1877,"content":1878,"level":15},"\u002Flinks#programming","Programming",[1856],"http:\u002F\u002Fscala.epfl.ch\u002F - The Scala Programming Language. Object-oriented, functional, strongly typed.http:\u002F\u002Fwww.sysprog.net\u002Fquotes.html - Great quoteshttp:\u002F\u002Fwww.amzi.com\u002FAdventureInProlog\u002F - Someday I'll learn more Prolog",{"id":1880,"title":1881,"titles":1882,"content":1883,"level":15},"\u002Flinks#web-development-stuff","Web-Development Stuff",[1856],"http:\u002F\u002Fwww.crazilocks.com\u002Fbuilding-web-applications.html - A good overview of what to do and what not to do when creating web-driven applicationshttp:\u002F\u002Fwww.useit.com\u002F - Jakob Nielsen's webpage, apparently a good start for web-usability stuff",{"id":1885,"title":1886,"titles":1887,"content":1888,"level":15},"\u002Flinks#mathematics","Mathematics",[1856],"http:\u002F\u002Fwww-gap.dcs.st-and.ac.uk\u002F~history\u002F - A neat math-history sitehttp:\u002F\u002Fmathworld.wolfram.com\u002Ftopics\u002FGroupTheory.html - Group Theoryhttp:\u002F\u002Fwww.cs.toronto.edu\u002F~hehner\u002Fpublist.html - Eric C.R. Hehner's publications. Great stuff in both mathematics and CS.http:\u002F\u002Fmaxima.sourceforge.net\u002F - A mathematica-like symbolic manipulation system (GPL).",{"id":1890,"title":1891,"titles":1892,"content":1893,"level":15},"\u002Flinks#reference","Reference",[1856],"http:\u002F\u002Fwww.wikipedia.org - A community-created encyclopedia",{"id":1895,"title":1896,"titles":1897,"content":1898,"level":9},"\u002Flinks-for-mike","Links_For_Mike",[],"http:\u002F\u002Fwww.mythtv.org\u002Fwiki\u002Findex.php\u002FFrequently_Asked_Questions#Q:_Since_I_need_to_keep_using_my_Cable.2FSat_box.2C_how_can_I_control_it_with_MythTV.3F",{"id":1900,"title":1901,"titles":1902,"content":1903,"level":9},"\u002Flinks-todo","Links_TODO",[],"Martin Prescher, CTO, AutoGravity - Scrapping the Monolithhttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Feoiit75e8p Eliot Horowitz, CTO, MongoDB - Coding Time for Managershttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fbqk2yj6mni Liz Crawford, ex-CTO, Birchbox - How to Build a Product Teamhttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002F006f3skx41 Jean-Michel Lemieux, SVP Engineering, Shopify - Post Traumatic Agile Syndromehttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fa44b80zoyi Ilia Papas, CTO & Founder, Blue Apron - Scaling your team before people know you're a tech companyhttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fgg7g3r2h1d Jeff Smith, Manager, Tech, x.ai - Bringing Data Scientists and Engineers Togetherhttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Ft61jczn2iy Daniel Doubrovkine, CTO, Artsy - Inspiring Team Leads to Give Away Their Legoshttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fxo6uw6v4fm Johnny Austin, Senior Engineering Manager, Social Tables - Diversity as a Means to Profitabilityhttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fbycwn9rwj8 Debbie Madden, CEO, Stride - The Top 5 Secrets to Stop Engineering & Product Inter-Team Communication Breakdownhttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fufj8thiobq Will Ballard, CTO, Gerson Lehrman Group - Real Engineering Value Metricshttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002F67o33fzgiq Adam Jonas, MD of Engineering, Flatiron School - Overcoming Ourselves: Firing One of Our Ownhttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fejf4tmn5h5 Dustin Lucien, COO (ex-CTO), Betterment - Nimble Project Planning and Executionhttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002F23smwsq1d9 Andrea Goulet, CEO, Corgibytes - Makers vs. Mendershttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002F82l99hvnj3 Damion Hankejh, CTO and Founder, Ingk - The Jeopardies of Cognitive Computinghttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fr02ejnrrqm Griffin Caprio, Dir Eng, Enova - Engineering at Scale: Running a 100+ person teamhttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fta42qetgj5 Jeff Casimir, Executive Director, The Turing School of Software and Design - New Ideas on Compensationhttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fuhw46qblqq Will Maier, VP Eng, Simple - You Should Build Distributed Teamshttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fdfbtv9vhke Lisa van Gelder, VP Eng, Stride - Burnout Isn't Just Overworkhttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fcokjtjrsvt Albert Wenger, Managing Partner, Union Square Ventures - Some Questions about the Future of Codehttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fo97gtyrpgj",{"id":1905,"title":1906,"titles":1907,"content":1908,"level":9},"\u002Flinux-on-the-compaq-v2311","Linux_on_the_Compaq_v2311",[],"This is the machine that Beth got, I'll toss notes here on what I had to do to make it work. Specifically I will be talking about Debian Sarge using Pure64 (purely amd64-based system).",{"id":1910,"title":1911,"titles":1912,"content":1913,"level":15},"\u002Flinux-on-the-compaq-v2311#specs","Specs",[1906],"Processor: AMD64RAM: 512mb, shared with videoStorage: 60gigVideo: ATI radeon mobile 200m or somethin'Wireless: broadcom chipset",{"id":1915,"title":1916,"titles":1917,"content":1918,"level":15},"\u002Flinux-on-the-compaq-v2311#initial-installation","Initial Installation",[1906],"Debian Sarge uses a 2.4 kernel which doesn't talk to the BIOS ACPI (apic specifically) quite right, so it helps to pass 'noapic' as a boot parameter. Otherwise the initial installation went without a hitch. The wired ethernet is detected without issue for net installs, and the vesa driver detected for X11 works OK (its just not very pretty or fast). One other thing that helped was to allocate only 64 megs of ram to the video card in the bios. This freed up more RAM for linux to make use of... and I don't really need all that ram for the video anyway. Once you get Debian installed, I highly recommend you compile a customized kernel, or at the very least update the the latest 2.6-debianized kernel. This machine likes 2.6 much more than 2.4, and then you don't need the 'noapic' parameter. At one point I had to do some video parameters... uh... remove vga=770 or something.",{"id":1920,"title":1921,"titles":1922,"content":1923,"level":15},"\u002Flinux-on-the-compaq-v2311#video","Video",[1906],"Used proprietary ATI driver",{"id":1925,"title":1926,"titles":1927,"content":1928,"level":15},"\u002Flinux-on-the-compaq-v2311#wireless","Wireless",[1906],"Used proprietary 64-bit broadcom driver and ndiswrapper",{"id":1930,"title":1931,"titles":1932,"content":1933,"level":15},"\u002Flinux-on-the-compaq-v2311#suspend","Suspend",[1906],"Haven't gotten this going yet",{"id":1935,"title":1936,"titles":1937,"content":1938,"level":9},"\u002Flinux-on-the-lenovo-3000-v100","Linux_on_the_Lenovo_3000_v100",[],"Just got a brand new Lenovo 3000 v100 0763-4CU, and thought I'd throw up some notes. While trying to get the various devices to work, I discovered that there are various editions of the v100. Mine has the core2duo 7200 and atheros wifi, which seems to the biggest chipset-different bits I noticed. I installed with Debian etch (nightly-build of the installer) and it got almost everything working. When the stable etch came out I upgraded to that and it didn't get worse. I've tried an ubuntu (7.04) install on another partition, but it doesn't do any better. Right now the thing that I really really want is suspend-to-ram, but I can't quite get it to work. It suspends for 10-15 seconds just fine, and I can wake it up. But if I suspend it for any longer it won't wake back up.",{"id":1940,"title":1941,"titles":1942,"content":1943,"level":15},"\u002Flinux-on-the-lenovo-3000-v100#overview","Overview",[1936],"|| Device || Model         || Status || Notes                                                              ||\n|| Video  || intel 945GM) || works  || graphics acceleration works. dual screen with alternate xorg.conf ||\n|| Audio  || ICH7 82801G rev 02) || mostly-works || must run script to switch to headphones-only mode ||\n|| Ethernet || RTL-8139 || works ||   ||\n|| Wireless || Atheros  || works || svn madwifi driver, or ndiswrapper ||\n|| Webcam   || 5602 ALi Corp || no-linux || works in vmware+windows w\u002F usb2 ||\n|| Fingerprint || AuthenTec  || no-linux || haven't even tried it in windows ||\n|| Suspend (ram)  ||    || no || almost works! ||\n|| Suspend (disk) ||    || no ||  ||\n|| Firewire || Ricoh || untested || ||\n|| card reader || Ricoh || untested || ||",{"id":1945,"title":1946,"titles":1947,"content":45,"level":15},"\u002Flinux-on-the-lenovo-3000-v100#output-of-lspci","Output of lspci",[1936],{"id":1949,"title":1950,"titles":1951,"content":1952,"level":15},"\u002Flinux-on-the-lenovo-3000-v100#output-of-lsusb","Output of lsusb",[1936],"Bus 004 Device 002: ID 08ff:1600 AuthenTec, Inc.\nBus 004 Device 001: ID 0000:0000\nBus 003 Device 001: ID 0000:0000\nBus 001 Device 005: ID 0bc2:0502 Seagate RSS LLC\nBus 001 Device 002: ID 0402:5602 ALi Corp.\nBus 001 Device 001: ID 0000:0000\nBus 005 Device 002: ID 0a5c:2101 Broadcom Corp.\nBus 005 Device 001: ID 0000:0000\nBus 002 Device 001: ID 0000:0000",{"id":1954,"title":1926,"titles":1955,"content":1956,"level":15},"\u002Flinux-on-the-lenovo-3000-v100#wireless",[1936],"This one uses an Atheros chipset, unlike all of the other v100's up to this point. MadWifi now works with this card, as per http:\u002F\u002Fmadwifi.org\u002Fticket\u002F1001. I got it working by simply grabbing the madwifi-hal-0.9.30.13 svn with a straight make && make install. Previously: I got it working very easily by installing the latest stable ndiswrapper (v1.33) and the windows driver from lenovo's website. Lenovo doesn't even list the atheros card for this laptop (that I notice), so I had to grab it from some other Lenovo laptop with an atheros chipset page. I slightly followed the ndiswrapper instructions at thinkwiki -- though there wasn't much to it. I'm not sure if it will work in 802.11n mode or not.",{"id":1958,"title":1959,"titles":1960,"content":1961,"level":15},"\u002Flinux-on-the-lenovo-3000-v100#audio","Audio",[1936],"This works out of the box in many distributions... but not the one I installed. I thought briefly that it was my specific kernel, but then I found a note saying that it might just be some module parameters.http:\u002F\u002Fwww.puzzle.ch\u002Fsamsung_q35.html\nAdded \"options snd-hda-intel index=0 single_cmd=1 model=laptop-eapd\"\nto \u002Fetc\u002Fmodules.conf Turns out that it doesn't detect when the headphones are plugged in. To switch to headphones-only-mode I do: which effectively loads the wrong sound card driver, but one that does the trick :)",{"id":1963,"title":1921,"titles":1964,"content":1965,"level":15},"\u002Flinux-on-the-lenovo-3000-v100#video",[1936],"Debian set up the 1280x800 resolution out of the box. I've since enabled graphic acceleration and figured out a dual-monitor mode. I have to switch Xorg configs to go from single to multi-monitor. I have an experimental version that sort-of switches dynamically using xrandr... but it doesn't work.",{"id":1967,"title":1968,"titles":1969,"content":45,"level":56},"\u002Flinux-on-the-lenovo-3000-v100#lenovo-3000-v100-945gm-xorg-i810-single-screen-config","Lenovo 3000 v100 945GM Xorg i810 single-screen config",[1936,1921],{"id":1971,"title":1972,"titles":1973,"content":45,"level":56},"\u002Flinux-on-the-lenovo-3000-v100#lenovo-3000-v100-945gm-xorg-i810-dual-screen-config","Lenovo 3000 v100 945GM Xorg i810 dual-screen config",[1936,1921],{"id":1975,"title":1976,"titles":1977,"content":1978,"level":9},"\u002Flivingroom-adventures","Livingroom_Adventures",[],"I made this by sampling some random Jazz, looping it, and layering in some drums and effects -- all using my fun Pocket Operator PO-33! Listen:  (download) Artist: Brock Wilcox\nCopy and Share: under the terms of Creative Commons Attribution-NonCommercial license!",{"id":1980,"title":1981,"titles":1982,"content":45,"level":9},"\u002Flocation","Location",[],{"id":1984,"title":1985,"titles":1986,"content":1987,"level":9},"\u002Fmat412-202004.04.12-notes","MAT412_-_202004.04.12_-_Notes",[],"$$x^5 - 10x + 5$$ is not solvable by radicals.",{"id":1989,"title":1990,"titles":1991,"content":1992,"level":9},"\u002Fmcs-research","MCS_Research",[],"NC State University MCS Distance LearningCourses are provided via NCSU Engineering OnlineVideo of lectures (using silverlight!)Requirements:\n3.0 GPAGRE31 credit hours (non-thesis) UIUC Requirements:\n3.2 GPA (3.7 is average)36 credit hours (non-thesis)Video of lectures (using flash or downloadable)Spring deadline Oct 15",{"id":1994,"title":1995,"titles":1996,"content":1997,"level":9},"\u002Fmhtml","MHTML",[],"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. 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. If nothing else this is a good example of writing such a thing in OCaml, including parsing and interpreting the macro language. Get the code at: http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Focaml\u002Fmhtml\u002F",{"id":1999,"title":2000,"titles":2001,"content":2002,"level":9},"\u002Fmplan1","MPlan1",[],"Here is a write-up of The Plan.",{"id":2004,"title":2005,"titles":2006,"content":2007,"level":15},"\u002Fmplan1#important-dates","Important Dates",[2000],"8\u002F24\u002F2005 - School begins9\u002F1\u002F2005 - Forest Meadows Apt lease ends",{"id":2009,"title":2010,"titles":2011,"content":2012,"level":9},"\u002Fmanager-philosophy","Manager_Philosophy",[],"Meet people where they're atTailor the guidance style based on the situationDo things on purpose\nBe hands off because you want to, not because you are too busyBe hands on because you want to, not because you haven't stepped back to see how to empowerTop down strategy (problems), Bottom up tactics (solutions)With great responsibility comes great powerThe price of many things is time, the most precious commodity. It takes time to manage - if you are not spending time you are likely not managingPeople mostly want to be happy and do the right thing. If they aren't, try to figure out why.\nOften people aren't doing what you want because of other factors - they don't understand (and thus buy in) to the bigger picture. Assuming a base level of cooperation is a better starting pointFeedback works well when you can illustrate the results of actions (impact feedback). The causality chain is an important part to everyone.Get people to \"consent\" - full agreement is great, but there is a space between full agreement and veto that can be used for compromise and experimentationBuild and use tight feedback loops!\nIn building code things\nEdit code, see live resultsPush code, get expensive test resultsSubmit PR, get other dev feedbackDeploy to staging, get qa and stakeholder feedbackDeploy to production, get real world data and usage experience from usersSame patterns apply for manager feedback loopsInstant feedback let's us dynamically adjust, like riding a snowboardIf feedback is fast enough then things become an extension of our bodySlower feedback limits us to slow adjustmentReaction time to feedback is proportional to the event to feedback delayForce feedback loops to exist; have 1-1 or solicit impactful feedbackEveryone needs feedback, even bossesHumans are humans - messy flawed amazing machines made of meat. They can be programmed directly to a degree, but are mostly self-programming. Look for ways of enhancing the self program system - feedback of the results of actions is a great way to do this, as their self-programming system is entirely based on feedback mechanismsLook for ways to leverage strengthsHelp people imagine a better world and figure out how to move in that direction\"The only difference between science and screwing around is writing it down\". Write down your plan and results.Decrease the barrier to doing things right. Make it so it is easier, more convenient, more joyous to do things right than to do them wrongFailure is required for learningDon't test people, instead talk to them and teach them, ensure they succeed",{"id":2014,"title":2015,"titles":2016,"content":2017,"level":9},"\u002Fmathematical-markup","Mathematical_Markup",[],"There's something wrong here - all mathematics is blacked out, as it too the page header. I've taught this wiki to use LaTeX for mathematical markup, using MathJax, a Javascript library for rendering mathematical markup. (Previously I used the LaTeX module extension for OddMuse. But that requires LaTeX be installed and some other messiness, generating images as the output. MathJax is better -- it requires Javascript, but gives lovely copy-pasteable equations). You simply wrap your math like this: $ $ x^2 $ $ to get something like $$x^2$$. Or, you could wrap your math with \\ ( x^2 \\ ) to get an inline equation, ( x^2 ). This page is to document some of the ways this can be used. Please choose 'Edit text of this page' at the bottom to play! We can do nifty integrals, like: $$ \\int^{\\infty}_{0}{x^8} $$ Heck, we can even do summations such as: $$ \\sum  ^{\\infty+2} x^2 + 3i $$ Fun, eh?  For limits we can do: $$ \\lim{x \\rightarrow 0} x^3=0 $$ Fractions are done like this: ( \\frac{x^6}{\\sqrt{3x}} ) or this: ( {dy\\over dx} ) || \\Gamma  || $$\\Gamma$$  || \\Delta  || $$\\Delta$$  ||\n|| \\Lambda || $$\\Lambda$$ || \\Phi    || $$\\Phi$$    ||\n|| \\Pi     || $$\\Pi$$     || \\Psi    || $$\\Psi$$    || More symbols - $$ \\Sigma \\Theta \\Upsilon \\Xi \\Omega \\alpha \\beta \\gamma \\delta \\epsilon \\zeta \\eta \\theta \\iota \\kappa \\lambda \\mu \\nu \\xi \\pi \\rho \\sigma \\tau \\upsilon \\phi \\chi \\psi \\omega $$ $$e^{i\\pi}=-1$$ $$x_2^3$$ $$\\left(\\begin{array}{cc} 1 & 0 \\ 0 & \\phi\\ \\end{array}\\right)$$ Some special things like ( \\mathcal{P} ) and (\\mathbb{R}) work, but I might have to turn on some more stuff from MathJax for other things. $$\\nabla\\cdot\\vec{B}=0$$ $$\\sigma_^{i-\\frac{1}{2},j-\\frac{1}{2}}=\\mu^{i-\\frac{1}{2},j-\\frac{1}{2}}(\\frac{\\partial u_x^{i-\\frac{1}{2},j-\\frac{1}{2}}}{\\partial z}+\\frac{\\partial u_z^{i-\\frac{1}{2},j-\\frac{1}{2}}}{\\partial x})$$ Testing... $$\\sum_{i \\in J}x^i$$",{"id":2019,"title":2020,"titles":2021,"content":45,"level":9},"\u002Fmathematics-study-topics","Mathematics_-_Study_Topics",[],{"id":2023,"title":2024,"titles":2025,"content":2026,"level":15},"\u002Fmathematics-study-topics#integers","Integers",[2020],"Topics include: types of #soperations (plus, minus, multiplication)\nProperties of operationsCommutative, associative, distributivevocabulary, synonyms, phrasesnegative numbersnumber line (introduction)useful properties of integer arithmetic (odds\u002Fevens)\nevens \u002F oddsodd + odd, odd + even, even * even, etc5's, 10's",{"id":2028,"title":2029,"titles":2030,"content":2031,"level":15},"\u002Fmathematics-study-topics#l3","L3",[2020],"Properties of operatorsProperties of integers\npositive, negativeeven, oddx is a multiple of yy is a factor of xlist all the factors of nlist all the unique factors of nprimesprime factorizationlist all the prime factors of n",{"id":2033,"title":2034,"titles":2035,"content":2036,"level":9},"\u002Fmeta-information","Meta_Information",[],"You know... information about information.",{"id":2038,"title":2039,"titles":2040,"content":2041,"level":9},"\u002Fmizik","Mizik Game",[],"A hexagon-grid sound and sequence memory game. This is a game inspired by TLT - 2020.01.19 - Mobile WebAudio Synth. The game has its own domain at https:\u002F\u002Fmizikgame.com\u002F. Technologies: VueJSToneJSParseHoneycomb Grid",{"id":2043,"title":2044,"titles":2045,"content":2046,"level":9},"\u002Fmobilefs","MobileFS",[],"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. 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. 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.",{"id":2048,"title":2049,"titles":2050,"content":2051,"level":15},"\u002Fmobilefs#features","Features",[2044],"Looks like it works!For mp3\u002Fogg files it waits until 15 seconds or so into the song before cachingThat also means it ignores pure id3 reads and song length checksTransparently reads files from cache if source unavailable (even in the middle of a song!)",{"id":2053,"title":261,"titles":2054,"content":2055,"level":15},"\u002Fmobilefs#code",[2044],"darcs get http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fmobilefs",{"id":2057,"title":1222,"titles":2058,"content":2059,"level":15},"\u002Fmobilefs#recent-development-feed",[2044],"\u003Crss 5 http:\u002F\u002Fthelackthereof.org\u002Fdarcs-rss\u002Ffeed\u002Fperl-mobilefs.rss>",{"id":2061,"title":1533,"titles":2062,"content":1533,"level":9},"\u002Fmodel-view-controller",[],{"id":2064,"title":2065,"titles":2066,"content":2067,"level":9},"\u002Fmodule-level-polyglot","Module_Level_Polyglot",[],"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. Never implement pyplot again.",{"id":2069,"title":2070,"titles":2071,"content":2072,"level":15},"\u002Fmodule-level-polyglot#types","Types",[2065],"\"Hosted\" language\nClojure, Scala, others run on the JVM, allowing them to (usually) call and be-called-by other JVM languagesElm, ClojureScript, others run on JavaScriptC-level\nCompiled languages can output a C-compatible library. Most un-hosted languages you can think of as being hosted on CEmbed language\nTypically this uses C-bindings for language B, so that from language A's perspective it is calling a C library call",{"id":2074,"title":2075,"titles":2076,"content":2077,"level":15},"\u002Fmodule-level-polyglot#issues","Issues",[2065],"Performance - When you cross datastructures over from one system to another there is sometimes a translation, and that means overhead of time or spaceUnmappable language constructs - Maybe a given language doesn't have a regex or a series generatorIdiomatic 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 languageLanguage 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)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",{"id":2079,"title":2080,"titles":2081,"content":2082,"level":15},"\u002Fmodule-level-polyglot#references","References",[2065],"http:\u002F\u002Fblog.deepgram.com\u002Fimport-a-docker-container-in-python\u002F",{"id":2084,"title":2085,"titles":2086,"content":2087,"level":15},"\u002Fmodule-level-polyglot#from-perl5","From Perl5",[2065],"Inline::* work pretty darn well",{"id":2089,"title":2090,"titles":2091,"content":2092,"level":15},"\u002Fmodule-level-polyglot#from-perl6","From Perl6",[2065],"I've been working on Inline::Ruby, which will let you do some pretty fancy thingsInline::Perl5 is how you can call Perl5 code at allLots of others",{"id":2094,"title":2095,"titles":2096,"content":2097,"level":15},"\u002Fmodule-level-polyglot#from-clojure","From Clojure",[2065],"Built in support to call arbitrary JVM code",{"id":2099,"title":2100,"titles":2101,"content":2102,"level":9},"\u002Fmovetodc","MoveToDC",[],"Move To DC! Here's how: Why to go\nSchoolWorkWhere to live\nGoogle MapMetro Map Northwest quadrant recommended that would be dupont, foggy bottom, adams morgan, columbia heights, etc. columbia heights can be sketchy adams morgan can be like mill ave on speed dupont is gay gay gay all the way way way What to do",{"id":2104,"title":2105,"titles":2106,"content":2107,"level":9},"\u002Fmovie-review-fight-club","Movie_Review_-_Fight_Club",[],"I've enjoyed this movie each and every time I've seen it. That is saying quite a bit because I've seen it quite a few times. The funny thing is that I like it philosophically and as a work of art... but in general I am opposed to the bloody violence in most films. This movie somehow escapes my blood-o-meter. The subtleties of the film itself are amazing. Each little bit is thought out and put in its place. From the camera angles and the light use of CGI to the subtle plot hints it is indeed a masterpiece. Oh. And I love Edward Norton. Besides all of the cinematography there is more to this film, however. The plot itself and the philosophy behind the main character are grabbing. Anti-materialism is certainly taken to an extreme... but I find myself identifying with the ideal. The whole thing is very eastern in nature. Beyond the naturalism is an idea of self-control and becoming in tune with the true self. The subtle zen nature of it all is profound. You are not your job. You are not your house. You are not unique beautiful snowflakes. Attachment brings pain. Fighting (and the other activities) is an ascetic practice meant to bring about enlightenment... realizing that you do not need the things which society wants you to need. You only need yourself. And your imaginary friend.",{"id":2109,"title":2110,"titles":2111,"content":2112,"level":9},"\u002Fmovie-review-house-of-a-thousand-corpses","Movie_Review_-_House_of_a_Thousand_Corpses",[],"If there was a defining characteristic between thriller and horror, then that characteristic is Rob Zombie's House of a Thousand Corpses. The only movie I've hated more than this one up to now was Movie Review - Jackass. Through the skeleton plot we discover a house full of escaped insane asylum inmates, all of whom are obsessed with death in its many forms. Some kids who are touring the country stumble upon the house and are all eventually killed in horribly disgusting ways. Thats about it as far as plot goes. The actual film consisted mainly of a horrifying series images and footage which was more than enough to turn my stomach over and over again. I ended up watching this entire film, though in retrospect I would have stopped it at my first inkling to do so... but in my naive state I decided to stick it out and see where it would lead; it lead to the most disgusting depths of gruesome imagery imaginable. Do not watch this film.",{"id":2114,"title":2115,"titles":2116,"content":2117,"level":9},"\u002Fmovie-review-jackass","Movie_Review_-_Jackass",[],"Less of a film and more of a series of pranks and idiotic dares. It is difficult for me to believe that this series did so well that it became a film, and that the film actually made it to the theater. Makes me wonder about my fellow americans. I am ashamed of this film on the behalf of the entire film industry, of which I am not even a part. Do not watch this movie.",{"id":2119,"title":2120,"titles":2121,"content":2122,"level":9},"\u002Fmovie-review-love-actually","Movie_Review_-_Love_Actually",[],"I must admit I went into this movie with a bad attitude. I wasn't quite sure if I wanted to see a movie, and wasn't quite sure if this was the sort of movie I'd like to see even if I did want to see a movie. The thing that scared me the most was the whole \"from the makers of Bridget Jone's Diary\" thing. But then I got there and sat down and gave myself a little lecture about how I need to keep an open mind and embrace this movie for all its worth. I did like other movies from the same people, after all. Lights... camera... and then it was horrible for a good 20 minutes. I can't recall exactly what music they chose, but it was killing me (and not softly). Just a bunch of blurry happiness scenes slowly trickling into a disoriented plot. After a while things started to gel a bit and several threads of story began to unfold, some of which were actually interesting. Eventually the movie got quite enjoyable. There were characters to like and to hate. Laughs, romance, tragedy. It was great! Well... until the end at least, at which point it started to get sickeningly sweet again, ultimately leaving a bad taste in my mouth consisting of perfect happy romance. One of the stories could have been focused on. There could have been one happy ending. There were, however, at least four sappy happy endings. I don't mind a happy ending, its just that I don't like them all bunched up together one after another after another after... yeah. My thoughts: watch the middle.",{"id":2124,"title":2125,"titles":2126,"content":2127,"level":9},"\u002Fmovie-review-novocaine","Movie_Review_-_Novocaine",[],"IMDB: Novocaine Staring: Steve Martin, Helena Bonham Carter, and Laura Dern In this movie Dr. Frank Sangster (Steve Martin) is a Dentist gets pulled into a world of lies, sex, drugs, and murder. This movie sucked. Do not bother to watch it. I've liked just about every Steve Martin movie which I've had the privilege to watch, but this one was awful. Not like a Movie Review - House of a Thousand Corpses awful, but awful non-the-less. My least favorite part was the intro and screen wipes which all involved x-rays of human skulls and teeth doing live things like eating or putting on makeup. Quite disturbing. Watch this film if you are a big Steve Martin or Helena Bonham Carter fan who would like to disillusion yourself about your favorite actor\u002Factress. Beth thinks that this claim is a bit strong, and that this movie isn't much stranger than Movie Review - The Man With Two Brains, but I think that The Man With Two Brains was much better.",{"id":2129,"title":2130,"titles":2131,"content":2132,"level":9},"\u002Fmovie-review-star-trek-ii-the-wrath-of-khan","Movie_Review_-_Star_Trek_II_The_Wrath_of_Khan",[],"Second of the Star Trek movies, this one is centered around the Genesis Project and Khan, who is a genetically engineered soldier from 1996. It was pretty good.",{"id":2134,"title":2135,"titles":2136,"content":2137,"level":9},"\u002Fmovie-review-the-matrix-reloaded","Movie_Review_-_The_Matrix_Reloaded",[],"I hate this movie more every time I see it. I hated it a lot the first time.",{"id":2139,"title":2140,"titles":2141,"content":2142,"level":9},"\u002Fmovie-review-zoolander","Movie_Review_-_Zoolander",[],"We were reluctant to watch this movie at first because it seemed like it would be stupid. We were either extremely right or extremely wrong. Since our first viewing Beth and I have probably watched this movie at least a dozen times... and it just doesn't seem to get old! Though Adam contributes to our madness as well. This movie is hilarious. Watch it. Or die in a freak gasoline fight accident!",{"id":2144,"title":2145,"titles":2146,"content":45,"level":9},"\u002Fmovies-to-watch","Movies_To_Watch",[],{"id":2148,"title":2149,"titles":2150,"content":2151,"level":15},"\u002Fmovies-to-watch#mike-or-things-we-think-he-should-watch","Mike (or things we think he should watch)",[2145],"Brazil (DONE)Galaxy Quest (DONE)Kung FuPrimer (DONE)Caddyshack (DONE)Wall-E (DONE)The Great EscapeReal Genius (DONE)Shaun of the Dead (DONE)Dr. StrangeloveI Heart Huckabees (DONE)Napoleon DynamiteEternal Sunshine of a Spotless MindThe Big Lebowski (DONE)Raising ArizonaLogan's Run (DONE)Space Camp",{"id":2153,"title":2154,"titles":2155,"content":2156,"level":9},"\u002Fmusic","Music",[],"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! These works are licensed under a Creative Commons Attribution-ShareAlike (CC BY-SA) License (or maybe CC BY-NC... feel free to ask). 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. SongPlay!Got One Shoe (download)Frog Prince (download)Umbrellas (download)I Like Caffeine (download)Segfault (download)Knit Some Shit (download)Late Blues (download)Immaterial Things (download)CDOLTM (download)Code On My Mind (download)Dont Repeat Yourself (download)My Little Dog (download)Immortal Crowd (download)Call On Borbyu (download)Pi Girl (download)Gitmo (download)Hotel Yorba (cover) (download)Zombie Love (download)Big Brown Spider (download)I Knew A Girl (download)Happiness Blues (download)Groovin (download)Shaseys (download)Marie Laveau (Bobby Bare cover) (download)SIC (download)Livingroom Adventures (download)Wanda Vision Jam (download)Yo Oliver (download)White Roses (download)It Takes All SortsTalking DC Vote Blues",{"id":2158,"title":2159,"titles":2160,"content":2161,"level":9},"\u002Fmusic-gear-and-setup","Music_Gear_and_Setup",[],"I've been exploring the world of Open Source Music Production! Here I detail my setup.",{"id":2163,"title":2164,"titles":2165,"content":2166,"level":15},"\u002Fmusic-gear-and-setup#hardware","Hardware",[2159],"Asus Zenbook Prime UX32VD: My laptop, powerful enough for my needs Alesis iO2 Express: A 2-input USB recorder, effectively an internal soundcard. This is way better than the intel soundcard in my laptop, none of the noise or anything. It takes XLR inputs for microphones, and 1\u002F4\" plugs for guitar (or non-XLR mics). With this I can record two things at once... not as fancy as some other setups but it's been working great for me. Probably the biggest issue is that the USB adds a touch of latency (relative to PCI, Firewire, or ExpressCard). SM57 Microphone: Industry standard apparently, I like mine very much. M-Audio Axiom 49 (v2) Midi Keyboard: After doing a trial-run on a $20 Craig's List keyboard, I found one of these on sale. Works great, and has lots of knobs and sliders to play with. Besides the keyboard itself, the most enjoyable thing has been the 8 (velocity-sensitive) drum pads. Instruments: Harmonicas, mainly Hohner Special 20. Acoustic guitar. Pots and pans. Semi-broken anglo concertina.",{"id":2168,"title":2169,"titles":2170,"content":2171,"level":15},"\u002Fmusic-gear-and-setup#software","Software",[2159],"This is where it starts getting complex. I think I'll just highlight the things that I use on a regular basis. I use Debian sid. Here's some stuff:",{"id":2173,"title":2174,"titles":2175,"content":2176,"level":56},"\u002Fmusic-gear-and-setup#jackd","Jackd",[2159,2169],"Linux \u002F Open Source music generally follows the unix philosophy of having many tools and open protocols to get them working together. With the command line, that's often sockets and pipes. In linux the main thing is Jack. Jack is basically a software patch-board, allowing you to connect one program to another, so long as they know how to talk to Jack. Jack-related software:qjackctl: GUI for jack daemon configuration and jack sessions. patchage: GUI for jack connections. a2jmidid: Turn Alsa midi devices into jack midi.",{"id":2178,"title":140,"titles":2179,"content":2180,"level":56},"\u002Fmusic-gear-and-setup#ardour",[2159,2169],"I used Audacity for quite a while, but recently got turned on to Ardour. What a fantastic program! I'm using the Ardour3, using it as a multi-track non-destructive editor, mixer, and even midi sequencer a bit. I've also been using this as the main mixing\u002Fmastering tool, hooking it in to filters. I like the LV2 calf plugins, like reverb, compression, etc.",{"id":2182,"title":2183,"titles":2184,"content":2185,"level":56},"\u002Fmusic-gear-and-setup#hydrogen","Hydrogen",[2159,2169],"This drum machine \u002F synthesizer is cool. Among others, I recommend getting the BigMono drum kit, in which drum hits are sampled at different velocities.",{"id":2187,"title":2188,"titles":2189,"content":2190,"level":56},"\u002Fmusic-gear-and-setup#overtone","Overtone",[2159,2169],"This connects clojure to SuperCollider. Seems like a cool way to write synths and do other (possibly live) algorithmic composition. I'm also playing with connecting via OSC and midi to external devices.",{"id":2192,"title":2193,"titles":2194,"content":2195,"level":56},"\u002Fmusic-gear-and-setup#misc","Misc",[2159,2169],"qsynth: Nice wrapper for fluidsynth, renders midi using soundfonts. Audacity: Good for doing quick file conversions. zynaddsubfx: Super powerful synthesizer (forked as yoshimi, I use that sometimes). non tools: non-daw, non-mixer, non-sequencer ... lightweight DAW related tools. Seq24: This is a fun midi sequencer that I've played with. Control: Opensource Android application for OSC UI.",{"id":2197,"title":2198,"titles":2199,"content":2200,"level":15},"\u002Fmusic-gear-and-setup#configuration-and-helper-scripts","Configuration and Helper Scripts",[2159],"I have one script named 'musicstuff.sh' what gets things going, primarily Jack. I plug in my hardware first, then fire it up. It differentiates between when I run in laptop-only mode and when I run with my io2 plugged in. I created those two profiles manually in qjackctl and saved them with the given names. I also have a shut down script (triggered from qjackctl), which just undoes the PulseAudio -> Jack:",{"id":2202,"title":2203,"titles":2204,"content":45,"level":9},"\u002Fmusic-naming-scheme","Music_Naming_Scheme",[],{"id":2206,"title":2207,"titles":2208,"content":2209,"level":15},"\u002Fmusic-naming-scheme#preamble","Preamble",[2203],"This naming scheme is a joint effort between Brock, Jason, and Erik. The goal is to have a common file naming scheme so that we can share music.",{"id":2211,"title":2212,"titles":2213,"content":2214,"level":15},"\u002Fmusic-naming-scheme#directory-structure","Directory Structure",[2203],"Artist\u002FAlbum\u002Ffile Artist and Album have underscores. Actual filenames contain spaces.",{"id":2216,"title":2217,"titles":2218,"content":2219,"level":15},"\u002Fmusic-naming-scheme#file-structure","File Structure",[2203],"Generally, files will be named like this: Artist Name - Album Name - 00 - Track Title.ext where the 00 is the track number (zero-padded). Here is an example of the most complicated possible name, including all optional components: Artist Name - Album Name - Disk 00 - Disk Name - 00 - Track Artist - Track Name.ext As you can see, optional components are: Disk numberDisk nameTrack Artist Here is a regular expression which can get all of these things: $1 - Artist Name$2 - Album Name$3 - Disk Number (optional)$4 - Disk Name (optional)$5 - Track Number$6 - Track Artist (optional)$7 - Track Name$8 - File extension",{"id":2221,"title":2222,"titles":2223,"content":2224,"level":15},"\u002Fmusic-naming-scheme#capitalization","Capitalization",[2203],"All the first letters of each word shall be capitalized. All other letters will be lowercase, except for acronyms of course.",{"id":2226,"title":2227,"titles":2228,"content":2229,"level":15},"\u002Fmusic-naming-scheme#artist-names","Artist Names",[2203],"Artists will be named as \"Firstname Lastname\" (not inverted). What about the \"The\" artists? \"The Who\" \"The Refreshments\" \"The Cranberries\"? The name should appear as it does on the album, as far as middle names or pseudonyms go. I think.",{"id":2231,"title":2232,"titles":2233,"content":2234,"level":9},"\u002Fmusic-in-perl","Music_in_Perl",[],"Existing Articles about Sound Generation in Perl http:\u002F\u002Fshowmetheco.de\u002Farticles\u002F2011\u002F12\u002Flearning-music-notes-with-perl.htmlhttp:\u002F\u002Fperl.postbit.com\u002Fplaying-with-audio-in-perl.htmlhttp:\u002F\u002Fwww.perl.com\u002Fpub\u002F2004\u002F08\u002F31\u002Flivecode.htmlhttp:\u002F\u002Ftaskboy.com\u002Fblog\u002F?bid=641http:\u002F\u002Fwww.perlmonks.org\u002F?node_id=578420 - The state of audio processing in perlhttp:\u002F\u002Fwww.perlmonks.org\u002F?node_id=197478 - Rain (a song in perl)http:\u002F\u002Fwww.perlmonks.org\u002F?node_id=174329 - Manipulating Audio Data in Perl Vibrato http:\u002F\u002Forpheansculptures.com\u002FAudioSynthesis\u002F2_Audio_Synthesis\u002F5_Frequency_Modulation\u002F3_Accelerated_Vibrato\u002F (Nice C++ code!)http:\u002F\u002Fx.i-dat.org\u002F~csem\u002FUNESCO\u002F5\u002Findex.htmlhttp:\u002F\u002Fwww.soundonsound.com\u002Fsos\u002Fapr00\u002Farticles\u002Fsynthsecrets.htm Filters http:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLow-pass_filter (has code sample)http:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHigh-pass_filter (has code sample) General http:\u002F\u002Fhowtomakeelectronicmusic.com\u002F Visualize sound http:\u002F\u002Fyoutu.be\u002FG8FU4Nhl_Mg - Slow motion speakerhttp:\u002F\u002Fyoutu.be\u002F_3ZwPwa5I0k - Another",{"id":2236,"title":2237,"titles":2238,"content":45,"level":9},"\u002Fmutt","Mutt",[],{"id":2240,"title":2241,"titles":2242,"content":2243,"level":15},"\u002Fmutt#a-guys-best-friend","A Guys Best Friend",[2237],"I just discovered that Mutt can do transparent zlib (de)compression of my email folders! Great, eh? All I had to do was add a couple hooks: open-hook \\.gz$ \"gzip -cd %f > %t\"\nclose-hook \\.gz$ \"gzip -c %t > %f\"\nappend-hook \\.gz$ \"gzip -c %t >> %f\" This is especially good for a packrat like myself, since I don't bother deleting most of my mailing-list email (even though it is probably useless). Using these compressed folders my 2003 mail folder went from 450720 megs to 128616 (about 28.5% of the original).",{"id":2245,"title":2246,"titles":2247,"content":2248,"level":9},"\u002Fmy-little-dog","My Little Dog",[],"Song inspired by Hoda The Dog lounging about in the living room sun! Voice note  (download)\nRevision 1  (download)\nRevision 2  (download)\nRevision 3  (download)",{"id":2250,"title":2251,"titles":2252,"content":2253,"level":9},"\u002Fnerd-song-ideas","Nerd_Song_Ideas",[],"Segmentation FaultRecursionBinary Tree TraversalNaming Things (thesaurus song)The Most Difficult Things in CSThere are 10 kinds of peopleVimNeovimSecurity by ObscurityPull Requests\nI do one PR in the morning, one PR at nightDon't Repeat Yourself",{"id":2255,"title":2256,"titles":2257,"content":2258,"level":15},"\u002Fnerd-song-ideas#dont-repeat-yourself","Don't Repeat Yourself",[2251],"Don't repeat yourself\nDon't repeat yourself\nYeah the blog post said\n\u002F Said the little elf\n\u002F Let me say again\n\u002F Do it for your health\n\u002F I've said it myself\n\u002F Said the book on the shelf\nDon't repeat yourself But I asked myself\nHow can that be\nWhen such a thing\nIs hypocrisy Cause' the other day\nIt said the tight coupling\nIs the absolute\nMost horrid thing And if everything\nDepends on everything\nThen tight coupling\nIs the only thing Don't repeat yourself\nDon't repeat yourself\nYeah the blog post said\nDon't repeat yourself music interlude Spent the last week\nThinkin bout my code\nAll the duplicate lines\nThat it has to load I factored out\nAll the common bits\nThen I sat back\nTo watch the hits I got three downloads\nOf my app today\nGuess that extra week\nIs the price that I pay Don't repeat yourself\nDon't repeat yourself\nYeah the blog post said\nDon't repeat yourself",{"id":2260,"title":2261,"titles":2262,"content":2263,"level":9},"\u002Fneutral-evolution","Neutral_Evolution",[],"The idea that most changes in a genotype are neutral -- that they do not affect the phenotype or only affect the phenotype in a fitness-neutral way (see Genotype-Phenotype Mapping. This provides for wider exploration of the search space making it easier to find a genotype which requires only a small change to improve fitness of the resulting phenotype. Roland does a lot with Neutral Evolution, and others are doing a lot with it too.",{"id":2265,"title":2266,"titles":2267,"content":2268,"level":9},"\u002Fneutrality-and-redundancy-in-genetic-programming","Neutrality_And_Redundancy_in_Genetic_Programming",[],"I'm very interested in Neutral Evolution in Genetic Programming (and Genetic Algorithms, I suppose), especially through redundancy in the genotype and genotype-phenotype mapping. I have a couple ideas that I want to test out. Redundant genotypes that are randomly mapped to non-redundant phenotypes\nRSE - Redundant S-Expressions, an OCaml implementationInstead of randomness, make each genotype consist of the redundant tree and an integer array describing which paths to take. Both the integer array and the redundant tree would be targets for mutation and\u002For crossover.The above again, except with a cyclic directed graph\nThen the array could expand the graph during rendering (flattening) into a larger graphThe int-array could be used only during evaluation, so that the rendering wouldn't have to happen completely (for efficiency, results should be the same)",{"id":2270,"title":2271,"titles":2272,"content":2273,"level":9},"\u002Fnoisegen","NoiseGen",[],"20-Minute Software Synth",{"id":2275,"title":2271,"titles":2276,"content":2277,"level":9},"\u002Fnoisegen#noisegen",[],"20-Minute Software Synth [YouTube:pMZ4ilLzKW8](\u002F 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. Perl: github | local browse | local git Python: github | local browse | local git Ruby: github | local browse | local git",{"id":2279,"title":2280,"titles":2281,"content":2282,"level":56},"\u002Fnoisegen#news","News",[2271],"2012.06.23 - Presented at YAPC::NA 2012. Video is up on YouTube!2012.05.31 - Presented NoiseGen at Arlington Ruby",{"id":2284,"title":2285,"titles":2286,"content":2287,"level":9},"\u002Fnoisegen-pagecss","NoiseGen_PageCSS",[],"@import url(http:\u002F\u002Ffonts.googleapis.com\u002Fcss?family=Doppio+One); html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {\nborder: 0px none;\nfont: inherit;\nmargin: 0px;\npadding: 0px;\nvertical-align: baseline;\n} article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {\ndisplay: block;\n} body {\nline-height: 1;\n} ol, ul {\nlist-style: none outside none;\n} blockquote, q {\nquotes: none;\n} blockquote:before, blockquote:after, q:before, q:after {\ncontent: none;\n} table {\nborder-collapse: collapse;\nborder-spacing: 0px;\n} html {\nbackground: none repeat scroll 0% 0% #222222;\ncolor: #CCCCCC;\nmargin-top: 3em;\n} body {\nbackground: none repeat scroll 0% 0% #2B8178;\nborder: 1px solid #303030;\nfont-family: 'Doppio One',sans-serif,verdana;\nline-height: 1.5em;\nmargin: 0px auto;\npadding: 0px;\nwidth: 900px;\n} a {\ncolor: #88FF88;\ntext-decoration: none;\n} a:visited {\ncolor: #FF3333;\n} .header, #shadow-holder, .sidebar {\ndisplay: none;\n} .content {\noverflow: auto;\nwidth: 100%;\n} p,pre {\nbackground: none repeat scroll 0% 0% #0E544C;\nborder-radius: 15px 15px 15px 15px;\ncolor: #CCCCCC;\nfloat: left;\nfont-size: 21px;\nmargin: 1em;\npadding: 1em;\nwidth: 350px;\n} pre {\nfont-size: 14px;\nline-height: 16px;\nfont-family: monospace;\ncolor: white;\n} p.flashbox {\nbackground-color: inherit;\nborder: 0px none;\npadding: 0px;\nwidth: 420px;\n} .footer .gotobar, .footer .time, .footer .search, .footer hr {\ndisplay: none;\n} .footer {\nborder-top: 1px solid #222222;\nfont-size: x-small;\npadding: 0px 0px 0px 20px;\n} .footer a {\nmargin-right: 2em;\n} .footer br {\ndisplay: none;\n} h2 {\nbackground: url(\"http:\u002F\u002Fthelackthereof.org\u002Fdownload\u002FNoiseGenHeader.jpg\") no-repeat scroll 0% 0% transparent;\ncolor: #FFFFFF;\nfont-size: 300%;\nheight: 120px;\nletter-spacing: 8px;\nmargin: 0px;\npadding-top: 80px;\ntext-align: center;\ntext-shadow: 0px 0px 5px #000000;\nwidth: 900px;\n} h2 + p {\nbackground-color: inherit;\nborder-radius: 0px 0px 0px 0px;\nborder: 0px none;\ncolor: #D08045;\nfloat: none;\nfont-variant: small-caps;\nfont-weight: bold;\nletter-spacing: 5px;\nmargin-bottom: 60px;\nmargin-top: -100px;\ntext-align: center;\ntext-shadow: 0px 0px 2px #000000;\nwidth: auto;\n} h3 {\nmargin: 0px 0px 0px 1em;\nclear: left;\n} ul {\nmargin-bottom: 1em;\nmargin-left: 30px;\nmargin-top: 0px;\n} dl {\nbackground: none repeat scroll 0% 0% #0E544C;\nborder-radius: 15px 15px 15px 15px;\nclear: both;\ncolor: #CCCCCC;\nfloat: left;\nfont-size: large;\nmargin: 20px;\noverflow: auto;\npadding: 1em;\nwidth: 385px\n} dt {\nclear: left;\nfloat: left;\nfont-weight: bold;\nwidth: 80px;\n} dd {\ndisplay: block;\nfloat: left;\nmargin: 0px 0px 0px 1em;\n} dt + dd + dt, dt + dd + dt + dd {\nmargin-top: 1em;\n}",{"id":2289,"title":2290,"titles":2291,"content":2292,"level":9},"\u002Fnoisegenold","NoiseGenOld",[],"Lately I've been interested in digital audio. While exploring, I ran into the PortAudio library, which makes it really easy to output sound from a variety of languages and on a variety of platforms. I decided that using generators and combinators would be a good way to play around with this ... and after a while I started wondering what it would look like in different languages... Perl: browse | local git | browse github Python: browse | local git | github Ruby: browse | local git | github News 2012.06.23 - Presented at YAPC::NA 2012. Video is up on YouTube!2012.05.31 - Presented NoiseGen at Arlington Ruby",{"id":2294,"title":2295,"titles":2296,"content":2297,"level":9},"\u002Fnorns","Monome Norns",[],"Monome Norns is a music-centric device built on top of the Raspberry Pi by https:\u002F\u002Fmonome.org\u002F. There is a healthy community at https:\u002F\u002Fllllllll.co\u002F (\"Lines\"), though they talk about a lot more than only Monome. Norns is scripted primarily with Lua and SuperCollider, though is a fully Linux system.",{"id":2299,"title":2300,"titles":2301,"content":2302,"level":9},"\u002Fnotes","Notes",[],"Put this in your .screenrc and your terminal's normal scrollback will work for the screen history! WOOT!!! My Amazon Wish List",{"id":2304,"title":2305,"titles":2306,"content":2307,"level":15},"\u002Fnotes#new-news-item","New News Item",[2300],"there is an image to the left\nblah This is just a scratch page for random junk. http:\u002F\u002Fminnow.cc.gatech.edu\u002Fsqueak\u002F665 - notes on giving an OOP language a smalltalk like programming environment. http:\u002F\u002Fducts.27b-6.de\u002Fcdcover\u002F - XMMS cd cover plugin Write a love song in which I demonstrate that someone loves me using a proof-by-contradiction technique. Mention that Bauer wouldn't care for the proof much, but most people would go for it. Wiki-based math notes with conversion to my LaTeX stylesheet for printing. Abstract Algebra Notes Graph Module http:\u002F\u002Fwww.jundy.com\u002Findex.html http:\u002F\u002Fwww.jltechnical.com\u002FExporter.htm Take cpan:Sub::Curry and create Sub::Curyize http:\u002F\u002Fwww.cis.upenn.edu\u002F~bcpierce\u002Fcourses\u002F670Fall04\u002FGreatWorksInPL.html http:\u002F\u002Fwww.pst.informatik.uni-muenchen.de\u002F~rauschma\u002Fcgi-bin\u002Fread\u002Fwiki.cgi?ContinuationsForWebProgramming A good introduction to quantum computing \u002F entanglement - http:\u002F\u002Fplato.stanford.edu\u002Fentries\u002Fqt-entangle\u002F article on self-esteem Create Tracker Item or Tracker Status http:\u002F\u002Fwww.math2.org\u002Feulermb\u002Fpod\u002FEulerMB\u002FCoroutine.html\nMore perl coroutines (continuations?)http:\u002F\u002Fwww.math2.org\u002Fmmb\u002Farea\u002Fdev image:image name Wikipedia:Japanese language\nLJ:mousetrout http:\u002F\u002Flinux.ucla.edu\u002Fevents\u002Fmeeting-20040217\u002Fprocmail+spamassassin-2004-02-17.pdf Idea: Automatic parser generator (generator). Given inputs and AST outputs, figure out a parser. I'm still a bit hung up on this whole SetDB thing, but now that I'm  using cpan:Class::DBI a lot I have much less motivation to actually develop it. So perhaps I should write Class::DBI::Sets or something. Then we could use the class dbi stuff to make sets, then create new sets out of them, which would really be views. hmm... does class::dbi have views? lets see... Looks like cpan:Class::DBI::View exists, but is only good for reading, not writing. Well the thing that I lose by using a single set class is types. You could make a set of anything, and things in the set wouldn't have to be the same type. Or would they? I could make a rule that says only things of a single type can go into a set. hm. Of course this type could be a tuple. Thats probably what the SetDB system implied previously anyway, come to think of it. Well cpan:Class::DBI is sort of a subset of what I want. The only types of sets they allow have a one-to-one correspondence with tables. http:\u002F\u002Fkb.mozillazine.org\u002FMove_the_tabbar_(Firefox) http:\u002F\u002Fwiki.perlchina.org\u002Fmain\u002Fshow\u002Fhaskell+workshop+2005 http:\u002F\u002Fndiswrapper.sourceforge.net\u002Fmediawiki\u002Findex.php\u002FList#WMP54GS - beth linux wireless http:\u002F\u002Fgenie.sis.pitt.edu\u002F hrm http:\u002F\u002Fpro.html.it\u002Farticoli\u002Fid_599\u002Fidcat_31\u002Fpag_1\u002Fpag.html links secretly trigger js which alters the form's action and then POSTS the page.js detects a visit to a cached page, does a background GET to server to let it know and to display its resultsif a link detects that it has forked-the-window, maybe it could fork the continuation on the server? http:\u002F\u002Fondras.praha12.net\u002Fsql\u002F - javascript gui sql schema editor http:\u002F\u002Fwww.capacious.org\u002F - free hosting http:\u002F\u002Fwww.inference.phy.cam.ac.uk\u002Fmackay\u002Fitila\u002Fbook.html - book on information theory Idea: Dots! The game where you have a grid, take turns placing lines surrounding squares. Might want to look for that book... hmm, I actually think that the math club has that one. The overlapping concepts: Object-DB mapperHTML binding\u002Frendering of ODB widgetsComposing of ODB widgetsComposing of ODB objectsDOM-based template Full screen degraded digital video - if you get only every nth packet you get every nth pixel. No compression? Very fine-grade... Centralized Logic - The core happenings of a program should all be in one spot, easily readable and understandable. Web-MVC spreads things out too much. This is part of the CSS power -- a central spot describing the look of a wide variety of things. Behaviour -- a central spot describing the behaviour of a wide variety of things.",{"id":2309,"title":2310,"titles":2311,"content":2312,"level":15},"\u002Fnotes#mit-courses-i-should-self-take","MIT Courses I Should Self-Take",[2300],"[\u002F 6.840J Theory of Computation, Fall 2002](http:\u002F\u002Focw.mit.edu\u002FOcwWeb\u002FMathematics\u002F18-404JTheory-of-ComputationFall2002\u002FCourseHome\u002Findex.htm\n18.404J)\n6.844 Computability Theory of and with Scheme, Spring 20036.863J \u002F 9.611J Natural Language and the Computer Representation of Knowledge, Spring 20036.881 Natural Language Processing, Fall 20046.895 Essential Coding Theory, Fall 2004 http:\u002F\u002Fwww.pxn8.com\u002F - online Image Editor http:\u002F\u002Fsimon.incutio.com\u002Fslides\u002F2006\u002Fetech\u002Fjavascript\u002Fjs-reintroduction-notes.html http:\u002F\u002Fwww.math.harvard.edu\u002F~mazur\u002Fpreprints\u002Fwhen_is_one.pdf http:\u002F\u002Fwww.iamjacksbrain.com\u002FAboutMe.html http:\u002F\u002Fwww.cavecanen.org\u002Flinux\u002Fbashtips.php http:\u002F\u002Flist.cs.brown.edu\u002Fpipermail\u002Fplt-scheme\u002F2006-April\u002F012418.html - Tutorial on writing 'yield' in scheme http:\u002F\u002Fwww.netspace.org\u002F~mts\u002Fguit_tut\u002Ftutorial.htm Here are links for my mom:http:\u002F\u002Fwww.womensmediacenter.com\u002Fex\u002F110106.html tah dah!Tags: fish, mouse, cat fish, fredthis is a test This is Miko in the window.Random thought: Evolved programs work mostly through side-effects. Same is true of evolved biological systems... need to be analyzed not based on intent but rather on influence. What parts of this process can possibly affect this other process?The idea I'm going for is to provide a smooth gradient between one-state\nsessions, many-state sessions, and state-less sessions.Storable continuations and web programming in OCaml (needs a usable API!)http:\u002F\u002Flogic.cs.tsukuba.ac.jp\u002FContinuation\u002Fprogram.htmlChicken Dance[YouTube:nstI0bjTqwQ](\u002FProposed name of my n900: Koenig (download)Oh My Baby  (download)http:\u002F\u002Fwww.luatex.org\u002F - Lua as the TeX scripting language. Interesting.",{"id":2314,"title":2315,"titles":2316,"content":2317,"level":9},"\u002Focaml","OCaml",[],"Objective Caml See http:\u002F\u002Fcaml.inria.fr\u002F. http:\u002F\u002Fwww.lama.univ-savoie.fr\u002F~RAFFALLI\u002Fformel.html As a side note, I don't see Ocaml as a science project.  It's a pragmatic\nlanguage, in that it doesn't automatically assume it knows what's best,\nbut instead provides the programmer the tools he needs to get the job\ndone.  As reflected in it's design decisions, the people designing Ocaml\n(Brian Hurt bhurt@spnz.org) Careful; that sounds like you're describing Perl :-)\n(John Goerzen jgoerzen@complete.org)",{"id":2319,"title":2320,"titles":2321,"content":45,"level":9},"\u002Focaml-eval","OCaml_Eval",[],{"id":2323,"title":2324,"titles":2325,"content":2326,"level":15},"\u002Focaml-eval#evaluate-ocaml-code-dynamically","Evaluate OCaml Code Dynamically",[2320],"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 Genetic Programming, for example). Based on some code in the interactive toplevel module this isn't hard to do.",{"id":2328,"title":315,"titles":2329,"content":2330,"level":56},"\u002Focaml-eval#get-the-code",[2320,2324],"Source directory: http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Focaml\u002Feval\u002F\ndarcs get \nhttp:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Focaml\u002Feval\u002F",{"id":2332,"title":2333,"titles":2334,"content":45,"level":56},"\u002Focaml-eval#usage","Usage",[2320,2324],{"id":2336,"title":2337,"titles":2338,"content":2339,"level":15},"\u002Focaml-eval#evaltestml","evaltest.ml",[2320],"open Eval let _ =\neval_reset();\nevalp \"let add1 x = x +1;;\";\nlet n : int = eval \"n\" \"let n = add1 2;;\" in\nprint_string \"n = \";\nprint_int n;\nprint_newline() Result:\nbrock@ihd103:\u002Ftmp$ ocamlc -o evaltest toplevellib.cma eval.ml evaltest.ml\nbrock@ihd103:\u002Ftmp$ .\u002Fevaltest\nn = 3 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.",{"id":2341,"title":2342,"titles":2343,"content":2344,"level":9},"\u002Focaml-grabbag","OCaml_GrabBag",[],"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. See the grabbag directory for the source code (GPLed unless you talk to me). 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.  nodes can thus be accessed in  operations (which is equivalent to  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.",{"id":2346,"title":2347,"titles":2348,"content":45,"level":9},"\u002Fodb","ODB",[],{"id":2350,"title":2351,"titles":2352,"content":2353,"level":15},"\u002Fodb#object-database","Object DataBase",[2347],"This is my own cpan:Class::DBI -alike for PHP. Sort of. I'm also using it to bridge the Model-View gap (see Debunking Model View Controller). It is in some ways similar to DBForm, the PHP thingie I made while at the IHD. But different.",{"id":2355,"title":2356,"titles":2357,"content":45,"level":9},"\u002Fogpf","OGPF",[],{"id":2359,"title":2360,"titles":2361,"content":2362,"level":15},"\u002Fogpf#ocaml-genetic-programming-framework","OCaml Genetic Programming Framework",[2356],"One of the greatest strengths of 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. The goal of OGPF is to create a modular framework for building genetic programming systems in OCaml. It is additionally an experiment in modular framework design, making heavy use of Functors. OGPF seeks to be a clean, elegant, and efficient solution to the question \"How do I do genetic programming in OCaml?\" If you are interested in using OGPF please mailto:awwaiid@thelackthereof.org email me and I'll help you get started. The more people who use the system and contribute components the easier everything will get.",{"id":2364,"title":870,"titles":2365,"content":2366,"level":15},"\u002Fogpf#see-also",[2356],"The OGPF project directorySnapshots of the codeOGPF Backgrounddo  \"darcs get http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Focaml\u002Fogpf\"  to join development (see Darcs)http:\u002F\u002Fwww.lri.fr\u002F~marc\u002FEO\u002Feo\u002Ftutorial\u002Fhtml\u002FeoBottomUp.html",{"id":2368,"title":1441,"titles":2369,"content":2370,"level":15},"\u002Fogpf#status",[2356],"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.",{"id":2372,"title":1049,"titles":2373,"content":2374,"level":15},"\u002Fogpf#plans",[2356],"Other things that this thing needs (long-term stuff): UI for managing runsStatistical analysis of runsGraphs of said statisticsHistory \u002F Genealogy in runs (also for analysis)Preemption of runs",{"id":2376,"title":2377,"titles":2378,"content":2379,"level":15},"\u002Fogpf#documentation","Documentation",[2356],"OGPF Layout",{"id":2381,"title":2382,"titles":2383,"content":45,"level":9},"\u002Fogpf-background","OGPF_Background",[],{"id":2385,"title":2386,"titles":2387,"content":2388,"level":56},"\u002Fogpf-background#why","Why?",[2382],"I noticed that other languages (including Perl) have these lovely little genetic programming systems which makes it easy for people to plug-in various genotypes and strategies to solve a problem evolutionarily. I've been tinkering with my own GP stuff in OCaml (one of the few I believe) and so was already moving in this direction, I've merely decided to formalize the whole thing and document it a bit so that others can partake. The framework is also an experiment in a modular programming style. It is heavily reliant on functors (parameterized modules) giving it a lovely compartmentalized feel. This is both for my own education and because I'm seeking out the Right Way to do this in OCaml.",{"id":2390,"title":2391,"titles":2392,"content":2393,"level":9},"\u002Fogpf-layout","OGPF_Layout",[],"Documenting the data architecture for OGPF (OCaml Genetic Programming Framework). I've attempted to modularize the various aspects of OGPF so that each piece is independent for the others. This is unfortunately not completely possible, due to the interdependent nature of the very problem. To the left is a dependency chart. Its not as bad as it looks, however. All of the black dependency arrows indicate dependence on simple types and functions which won't change much from one setup to another. It is only the big blue line which will take some work. There is a certain balance to be had here. An ideal situation would have your genotype and fitness test be completely separate. Yet you must also use the fitness test to probe individual genomes and discover how good they are at solving the problem at hand. If nothing else the fitness test must know the capabilities of the genotype, such as its ability to deal with various types of data (is this genotype able to work with strings? Can it return a string? etc). How much you have to coordinate the workings of the genotype and fitness test depend a lot on what sort of problem you're solving. If the fitness test itself is important, but you have a genotype you always use, then not much change is necessary. For myself, the genotype basically '''is''' the experiment, so I tend to alter both constantly.",{"id":2395,"title":2396,"titles":2397,"content":2398,"level":15},"\u002Fogpf-layout#component-definitions","Component Definitions",[2391],"Genotype - specifies and manipulates a single genomeFitness Test - Tests a genome for fitness. In GP this means evaluating the genome, which means you have to know a lot about the genome. Thus the Fitness Test is tied closely to the Genotype and might share some code.Population Container - Holds a bunch of genomes and allows insertion and removal. Not a very intelligent module. May in the future keep genealogical data (but never understanding the meaning of the data)Selection Method - Embodies the workflow of pulling things out of the population, testing, eliminating, manipulating, and putting back.  Uses the other three modules to get this done.",{"id":2400,"title":2401,"titles":2402,"content":2403,"level":15},"\u002Fogpf-layout#genotype","Genotype",[2391],"Genotypes define and manipulate individual genomes. Here is the basic signature which a genotype must implement: Here is an additional signature that I have some things require (FGenotype): One debate I'm currently having with myself is whether Genotypes should be responsible for evaluating themselves. On the one hand self-evaluation makes the genotype more modular, keeping the fitness test from having this job. On the flip side the fitness test must then know how to communicate the problem setup to the genotype.",{"id":2405,"title":2406,"titles":2407,"content":2408,"level":9},"\u002Foddmuse-pingback","OddMuse_Pingback",[],"See http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Foddmuse_pingback\u002F for source (and darcs repo). 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 this client, which has worked swimmingly. 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.",{"id":2410,"title":2411,"titles":2412,"content":2413,"level":9},"\u002Foddmuse-editsection","Oddmuse_EditSection",[],"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. http:\u002F\u002Fthelackthereof.org\u002Fwiki_data\u002Fmodules\u002Fzzz-editsection.pl.bak 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.",{"id":2415,"title":2416,"titles":2417,"content":2418,"level":9},"\u002Foddmuse-editfile","Oddmuse_Editfile",[],"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. 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 Darcs, and after review pulled into the main tree. 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. 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.",{"id":2420,"title":2421,"titles":2422,"content":2423,"level":9},"\u002Foddmuse-ref-links","Oddmuse_Ref_Links",[],"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. Source: http:\u002F\u002Fthelackthereof.org\u002Fwiki_data\u002Fmodules\u002Fref-list.pl",{"id":2425,"title":2426,"titles":2427,"content":2428,"level":9},"\u002Foddmuse-search-tags","Oddmuse_Search_Tags",[],"This is an extremely simple Oddmuse module for tagging. It works by looking for a line like: Tags: dog, cat, fish, catfish, killer dolphins 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). Source: http:\u002F\u002Fthelackthereof.org\u002Fwiki_data\u002Fmodules\u002Fsearchtags.pl",{"id":2430,"title":2431,"titles":2432,"content":2433,"level":9},"\u002Fon-adding-a-true-predicate-logic-layer-to-relation-databases","On_Adding_a_True_Predicate_Logic_Layer_to_Relation_Databases",[],"See SetDB for more recent work regarding this subject. This predicate logic stuff was interesting and all, but way too complicated. I am now working on a much more simple and programmer-centric theory on how programming a DB should be. The remainder is here as a reminder of a method which doesn't work, or at least needs a lot more work. Thesis: Relational databases are supposed to be based on Predicate Logic, but they fail to appear that way. It is possible, however, to create a layer which will fix this mis-representation. This layer would have its own interface language, replacing SQL. It would also keep track of data relationships and take those into account for understanding queries. Finally, it would still be able to interface to existing relational databases (by outputting SQL). References: Jezek, Karel and Toncar, Vladimir: Experimental Deductive Databases Relational Databases (RDBs for short) are intended to provide a predicate logic like view of stored data. In their current state, however, RDBs do not keep track of high-level relationships and instead rely on the user (the programmer or program querying the data) to manage said relationships. Let's first toy around a cross between some mathematical syntax and perl for our various operations. Select all people: $$ { \\forall x | (person(x) \\rightarrow x) } $$. The idea here would be that  would be a tied array, allowing you to access the returned results arbitrarily without a big performance hit. Similarly we could return just the first result from this like this:  $$ { \\exists x | (person(x) \\rightarrow x) } $$ . $$ { a | \\forall x (person(x) \\rightarrow has_address(x,a) \\rightarrow a) } $$",{"id":2435,"title":2436,"titles":2437,"content":45,"level":9},"\u002Fopen-source-music-production","Open_Source_Music_Production",[],{"id":2439,"title":2440,"titles":2441,"content":2442,"level":15},"\u002Fopen-source-music-production#communities-and-resources","Communities and Resources",[2436],"Open Source Musician\nOpen Source Musician - PodcastOpen Source Musician - WikiOpen Source Musician - BlogLinux Musicians Forum",{"id":2444,"title":2445,"titles":2446,"content":2447,"level":9},"\u002Fopenmoko","Openmoko",[],"I got my Openmoko on 2008-09-04! I'll be keeping notes here for now.",{"id":2449,"title":2450,"titles":2451,"content":2452,"level":15},"\u002Fopenmoko#distributions","Distributions",[2445],"I've tried several, here's a run-down. ; Om 2007.02 :\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. ; Om 2008.08 :\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. ; FDOM :\nJust like the latest Om distro, but with apps and some minor fixes already installed. Pretty nice! ; Qtopia :\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. ; Debian :\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!",{"id":2454,"title":2455,"titles":2456,"content":2457,"level":15},"\u002Fopenmoko#microsd-card","MicroSD Card",[2445],"I got the SanDisk 8gb card, and so far it works perfectly.",{"id":2459,"title":2460,"titles":2461,"content":2462,"level":15},"\u002Fopenmoko#sim-card","Sim Card",[2445],"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.",{"id":2464,"title":2465,"titles":2466,"content":2467,"level":15},"\u002Fopenmoko#headphone-adapter","Headphone Adapter",[2445],"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.",{"id":2469,"title":2470,"titles":2471,"content":2472,"level":15},"\u002Fopenmoko#gps","GPS",[2445],"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.",{"id":2474,"title":2475,"titles":2476,"content":2477,"level":15},"\u002Fopenmoko#touch-screen","Touch Screen",[2445],"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. 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.",{"id":2479,"title":1931,"titles":2480,"content":2481,"level":15},"\u002Fopenmoko#suspend",[2445],"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! We'll see if it keeps working :)",{"id":2483,"title":2484,"titles":2485,"content":2486,"level":15},"\u002Fopenmoko#general-software","General Software",[2445],"Debian has everything! I even got iceweasel (aka firefox) running without any problems at all.",{"id":2488,"title":2489,"titles":2490,"content":2491,"level":15},"\u002Fopenmoko#perl","Perl",[2445],"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. But then... ROCK ON! Coro works, and thus Continuity works!",{"id":2493,"title":2193,"titles":2494,"content":2495,"level":15},"\u002Fopenmoko#misc",[2445],"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.",{"id":2497,"title":2498,"titles":2499,"content":2500,"level":15},"\u002Fopenmoko#todo","TODO",[2445],"http:\u002F\u002Fwww.tinymail.org\u002Ftrac\u002Ftmut - mail readerwordtrans-qtdasherwayv",{"id":2502,"title":2503,"titles":2504,"content":45,"level":9},"\u002Foutside-news","Outside_News",[],{"id":2506,"title":2507,"titles":2508,"content":2509,"level":15},"\u002Foutside-news#news-from-external-rss-feeds","News from external RSS feeds",[2503],"News here is from http:\u002F\u002Flambda.weblogs.com and http:\u002F\u002Fnews.google.com\u002F. \u003Crss 10 http:\u002F\u002Flambda.weblogs.com\u002Fxml\u002Frss.xmlhttp:\u002F\u002Fgooglenews.74d.com\u002Frss\u002Fgoogle_scitech.rss>",{"id":2511,"title":2512,"titles":2513,"content":45,"level":9},"\u002Fovertone-adventures","Overtone_Adventures",[],{"id":2515,"title":2516,"titles":2517,"content":2518,"level":15},"\u002Fovertone-adventures#_2013-12-22","2013-12-22",[2512],"So I've gone through Overtone Getting Started a few times, and am up and running. Only trick at all is that I already have my own jackd wrapper script to get jack started. Just like the other times that I went through this tutorial, I get to this point and say \"now what?\" There are two different directions to explore. I have the REPL working, but it would be nice to be able to execute from a file and also do some interactive editing via Vim (or Emacs I suppose). The other path is to ... you know ... make some music (er... noise). So I go on a reading spree. Things I learn: There is a neat Cheat Sheet. But I don't know how to work it.Read a bit about Sequencing on the wiki. Learned:\nYou can grab samples from freesounds, like: (def kick (sample (freesound-path 2086)))You can then play that with (kick). Fun!Something that I read before -- you kinda schedule sounds out in the future a bit. Think I saw that on a videoThe main README references some video tutorials, I'm going to check them outhttp:\u002F\u002Fskillsmatter.com\u002Fpodcast\u002Fscala\u002Fclojurex-unpanel-2894Nice! Shows some dubstep type noise to make during a 20 minute workshopMentions here as I've seen elsewhere: definst uses macros to send synths to supercollider, so only a specific set of things are OK in there (not arbitrary expressions)Shows how to sequence things a bit",{"id":2520,"title":2521,"titles":2522,"content":2523,"level":15},"\u002Fovertone-adventures#_2013-12-23","2013-12-23",[2512],"Today I'm watching Overtone and ClojureScript which is a coding session of someone setting up an web UI to play Overtone stuff. Building a UI like this reminds me of the one-string guitar that I got at an art festival the other day. Clearly home-made, including an energy drink as the echo chamber. And very awesome. Also fun to see someone iterate through their development. Lots of interesting things in there, most of them I can read more or less but doesn't mean I could write them. One thing I noticed was ( ...) to pull in instrument libs. I'll try that. The Cheat Sheet is interesting, but I don't know enough to actually use a lot of the things on there. Current mission is to get the instruments working. Ah! I need to do (use 'overtone.inst.piano) not ( overtone.inst.piano). Now (piano) plays a note!(odoc note) shows that it takes a bunch of params(piano 60), (piano 65), etc plays some nice piano notesI looked up named parameteters in clojure. (piano  65) does what I wantAchievement unlocked ... I can now use all the instruments on the cheat sheet!Now when I do \"(piano  60) (piano  65) (piano  69)\" (still in REPL) it plays all three notes at once. Need to learn how to sequence things.I think I'll go back to that workshop videoAt 13:40 they talk about sequencing thingsPlay a piano note in 1 second (at (+ 1000 (now)) (piano))From their tutorial, I created:\n(defn loop-beats time (at (+ 500 time) (kick)) (at (+ 1000 time) (open-hat)) (apply-at (+ 1500 time) loop-beats (+ 1500 time) ))(loop-beats (now))(stop)I don't know exactly what that last  is for. (odoc apply-at) says it is \"argseq\" but gives no explanation.In general this is \"temporal recursion\" -- delays a bit before calling backAs far as I can tell this does create new stack frames! Will eventually run out. I know this because I accidentally put the loop-beats recursion in parens which invoked it.Following the tutorial, I transformed it to use a metronome:\n(def metro (metronome 180))(defn loop-beats m beat-num (at (m (+ 0 beat-num)) (kick)) (at (m (+ 1 beat-num)) (open-hat)) (apply-at (m (+ 2 beat-num)) loop-beats m (+ 2 beat-num) ))Get it started: (loop-beats metro (metro))Change the temp live! (metro  200)Stop it (stop)Instruments take 'notes' (midi numbers), though some things take hzSymbolic notes can be turned into midi numbers via (note )Can map a sequence of symbolic notes to midi numbers (map note   )Now I can make a general purpose play-note-sequence function. I'll just make it play on the beat. (play-song metro (metro)                )OK. Midi time! Looking at Overtone wiki MIDI pageFired up jack-keyboard (software midi keyboard) since I'm not at homeApparently software midi doesn't get immediately detected. \"modprobe snd-virmidi\" gave me something I can connect to in jackHad to restart overtoneNow I have BUNCHES of midi connections when I do (midi-connected-devices)",{"id":2525,"title":2526,"titles":2527,"content":2528,"level":15},"\u002Fovertone-adventures#_2013-12-25","2013-12-25",[2512],"Good progress today -- I made a hack to get around that BUNCHES of midi issue. I also got Overtone Vim Integration working. Well technically I already had it working (had fireplace.vim installed, etc), I just didn't know it. Now I can start up the REPL in one terminal and start up vim in another. In vim do \":Require\" and it finds the running REPL and hooks into it. I also added \"nnoremap   (stop)\" to my .vimrc, so that I can jam on F1 to make the noise stop. Here is the file I've got now: So that takes midi events specifically from that device (I picked one of my 64 virtual devices at random, seems to work) piped to the piano instrument. Next I'm going to make a new instrument of my own and hook that in! http:\u002F\u002Fibisandbaboon.com\u002F2013\u002F01\u002F13\u002Fplaying-with-music-and-overtone-i\u002F - nice intro http:\u002F\u002Fhg.postspectacular.com\u002Fresonate-2013 - need to check out 2013-12-26 This is awesome -- In The Composing Schemer the author uses \"core.logic\" (which I assume is a clojure lib for doing rule\u002Finference programming) to generate melodies!",{"id":2530,"title":2531,"titles":2532,"content":2533,"level":15},"\u002Fovertone-adventures#_2013-12-26","2013-12-26",[2512],"Today I'm playing with Open Sound Control (OSC), which is more general-purpose than midi but kinda similar idea. I have an android app on my phone named Control which has a few existing UIs, in my case I'm playing with the multi-touch. I set it to have two touch inputs. In my Overtone REPL I first set it up to listen for OSC events, and dump out whatever events it sees: I got both my laptop and phone on the wifi (which allows peer-to-peer communication) and told the Control app to connect to my laptop server (192.168.0.15 port 44100, in this case). Now when I touch the screen I get a bunch of messages about the generated OSC events. They look like: From this I see that the path I want to react to is \"\u002Fmulti\u002F1\" and \"\u002Fmulti\u002F2\". Dragging my fingers around, the args are the x and y coordinates normalized to (0..1). For now I'll just make it beep a bit when it gets an event. I'm hooking the first touch up so the X axis generates a frequency, and the second touch up so that the Y axis generates a frequency (just as a test), giving: Each touch plays for 1\u002F10th of a second, so if I drag around these overlap a bunch. In fact, if I drag around a lot then something gets backed up and the sound is delayed. BONUS Control comes with the ability to dynamically create controls, even over OSC itself! This video shows dynamically creating widgets in Control from SuperCollider, which should be straightforward to translate into Overtone. Three part tutorial on creating reactive Control interfaces",{"id":2535,"title":2536,"titles":2537,"content":2538,"level":15},"\u002Fovertone-adventures#_2014-01-15","2014-01-15",[2512],"One of my goals is to hook up my midi keyboard to an instrument and then hook up some of my midi knob controllers and\u002For OSC from my phone to adjust instrument parameters. I only needed one more thing to make this happen -- clojure refs. First I define an instrument that is parameterized: Next I'll define some refs. I give them the same name, but note that the above names were local to the steel-drum, so are irrelevant here. Now when we get a midi note we need to use these params when we trigger the instrument. As with a previous article, ignore the bit where I'm filtering down my midi device :) Great! Now to modify those refs I can do (dosync (ref-set sustain 0.3)) for example. This says start a transaction, and then do an inconsiderate re-assignment of the sustain. That is, do it without regard to what any other transaction might have done. \"assign\" is nicer than \"ref-set\", but we don't need to be nice. To access the current value we can use \"@sustain\" as we did above. Now what we need to do is listen to some inputs and overwrite the current values. For this I'll use OSC with a x,y touch UI. I'll use the x-coordinate as sustain and the y-coordinate as the subfreq. And with that I can drag around on my touch UI and it changes the sustain and underlying frequency of my instrument, so I simultaneously bang on my virtual keyboard and get different sounds!",{"id":2540,"title":2541,"titles":2542,"content":2543,"level":15},"\u002Fovertone-adventures#overtone-midi-jackd-a2jmidid-linux","Overtone + midi + jackd + a2jmidid + linux",[2512],"Show midi events, good for debugging: (event-debug-on)Get a list of connected devices: (midi-connected-devices)I have jackd set up, and can use my midi keyboard with other jack-based synthsAt this point: no connected devices listed. no events.Load up some \"virtual\" midi devices: sudo modprobe snd-virmidi midi_devs=1Restart overtonejackd connect my midi keyboard to virtual midi (I use patchage)Now I have connected devices! ... But there are 16 :(",{"id":2545,"title":2546,"titles":2547,"content":2548,"level":9},"\u002Fphp","PHP",[],"Here is a good article on templating in PHP: http:\u002F\u002Fwww.massassi.com\u002Fphp\u002Farticles\u002Ftemplate_engines\u002F",{"id":2550,"title":2551,"titles":2552,"content":2553,"level":9},"\u002Fpoe-coro-anyevent-and-reflex","POE,_Coro,_AnyEvent,_and_Reflex",[],"For YAPC::NA 2011 I gave a talk, \"POE, Reflex, Coro, AnyEvent, .... What and Why\". Here are the slides I used for the talk, but they are mostly just large words and there was a lot of talking. The video will appear soon I hope (if it worked), but a written form might be nice -- so here it is!",{"id":2555,"title":48,"titles":2556,"content":2557,"level":15},"\u002Fpoe-coro-anyevent-and-reflex#introduction",[2551],"I hope to give you a very high-level introduction to these four technologies, and a few examples to illustrate their philosophies and usage. One of the very simple examples I use is called 'sleep sort'. This is a fun little algorithm first introduced by the unique minds of 4chan. The game is to write a simple command line program that takes a list of numbers as arguments, and then print them out in sorted order. The fun bit is how this is done -- for each number argument X they fork and then sleep for X seconds before printing out X. One way to put it is that this is a sort that utilizes time instead of space. Quite bizarre and amusing. Here's an example of this using fork that the rest of our samples resembles; note that it sits there forever and will require a ^C to terminate. The examples I use are a bit different because they don't actually fork or use other processes. Instead they work with whatever their concurrency model is to watch for a timeout within the single running process. You'd do similar things with each tool to instead wait for a filehandle to be readable or some data to be ready on a socket. I'll now go through the technologies, following the order in which they appeared on CPAN.",{"id":2559,"title":2560,"titles":2561,"content":2562,"level":15},"\u002Fpoe-coro-anyevent-and-reflex#poe","POE",[2551],"\"portable multitasking and networking framework for any event loop\" First hitting CPAN in 1998, POE was actually started a few years before that by Rocco, who says he initially created it to help write games. At least partly due to its age, POE has a large community and many useful tools on CPAN. I ran into POE when wanting to create an IRC bot, for example.",{"id":2564,"title":107,"titles":2565,"content":2566,"level":15},"\u002Fpoe-coro-anyevent-and-reflex#coro",[2551],"\"the only real threads in perl\" Coro was introduced back in 2001. Coro does some deep magic not only in the perl core but in the C stack itself, saving off the important parts of the current running state into a Coro::State object that represents a single thread of execution. This allows for cooperative threading with very flexible control over shared variable scope. You can think of it as threads, you can think of it as continuations\u002Fcoroutines, and you can think of it a way of implementing the inversion-of-control pattern. It was insane when introduced in 2001, just as it is insane now, with one very very strong caveat -- it works. Ten years and several major perl revisions later, it friggin WORKS and is very good at what it does. But it's deep magic comes at a price -- the perl debugger and some profiling tools (such as NYTProf) do not deal well with Coro. Maybe someday these tools will adapt to run cleanly under Coro, or Coro will adapt to run under them, or maybe some of the perl core will be adapted to make Coro less invasive. Even with this caveat, I've been happily using Coro for years.",{"id":2568,"title":69,"titles":2569,"content":2570,"level":15},"\u002Fpoe-coro-anyevent-and-reflex#anyevent",[2551],"\"the DBI of event loop programming\" Introduced in 2005, AnyEvent provides a simple model of event management centering around callbacks.",{"id":2572,"title":2573,"titles":2574,"content":2575,"level":15},"\u002Fpoe-coro-anyevent-and-reflex#reflex","Reflex",[2551],"This is the newcomer to the scene, currently existing as a layer on top of POE. Rocco has tried over the years with several projects to rise above some of the nitty gritty of POE into the realm of concurrent and reactive objects, and it seems that the approach in Reflex is achieving his goals at last. One thing that strikes me boldly about Reflex: though it is implemented on top of POE, it could just as easily be on top of AnyEvent and change (almost) nothing about the API. I think this fact strongly illustrates the level of abstraction not only of Reflex, but of POE and AnyEvent.",{"id":2577,"title":2578,"titles":2579,"content":2580,"level":15},"\u002Fpoe-coro-anyevent-and-reflex#the-monster","The Monster",[2551],"I claimed at some point that these technologies could work together. Well... Let's Do This! Here is sleep sort using POE, Coro, AnyEvent, and Reflex. It is a simple example, and I wouldn't be surprised if you have to do more work if you want to do more IO-like tasks rather than simple timers. It uses AnyEvent::Impl::POE, which allows POE to be the actual event loop and AnyEvent to tap in, running it's own pending events when POE lets it. Reflex sits on top of the POE event loop. Coro notices AnyEvent is loaded, so it loads Coro::AnyEvent and switches coroutines when AnyEvent lets it. I think.",{"id":2582,"title":1533,"titles":2583,"content":1533,"level":9},"\u002Fppw-2008-continuity-monitor-slides",[],{"id":2585,"title":2586,"titles":2587,"content":45,"level":9},"\u002Fpugs","PUGS",[],{"id":2589,"title":2590,"titles":2591,"content":2592,"level":15},"\u002Fpugs#random-notes","Random Notes",[2586],"How to \"prove\" a single test\n\u003C autrijus> HARNESS_PERL=.\u002Fpugs\n\u003C autrijus> PERL6LIB=ext\u002FTest\u002Flib\n\u003C autrijus> prove t\u002Ffoo\u002Fbar.t",{"id":2594,"title":2489,"titles":2595,"content":2596,"level":9},"\u002Fperl",[],"I love Perl.",{"id":2598,"title":2599,"titles":2600,"content":2601,"level":9},"\u002Fperl-6-use-libs-from-ruby","Perl_6_Use_Libs_From_Ruby",[],"Github project: https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fp6-Inline-Ruby This is part of my overall quest, Module Level Polyglot.",{"id":2603,"title":2604,"titles":2605,"content":2606,"level":9},"\u002Fperl-6-adverbly","Perl_6,_Adverbly",[],"Work-In-Progress There are a lot of things that Perl 6 adopted from other languages. Besides a lot of Perl 5 influence, Haskell in particular can be pointed to as strongly influential. There are, however, a few language features which I've not seen in other languages. One I've mentioned is the Whatever Star. Another is \"adverbs\". First let's talk about Pair. A Pair is exactly what it sounds -- a data structure that contains two things. In this case a Pair has a key and a value: Pairs are very common, so they have some literal syntax to build them. The most common is \"=>\", sometimes called the \"fat arrow\", which is a binary operator that builds a Pair -- key on the left, value on the right: Notice that \"age\" wasn't put in quotes. The pair constructor auto-quotes the thing on the left, again to optimize for this common case. You can wrap the left in ()'s to force it to be a value. Colon-Pair notation is another literal syntax for declaring a Pair, and here is where things start to get different: The basic idea is you have a key that comes after the colon, and a value that comes in parenthesis or brackets after that. Unlike \"=>\" notation, this has a DEFAULT value of True. It also allows you to auto-quote the value side by using bracket notation (like you can do with Hashes). Next: Declaring functions with named parametersCalling functions with named parametersCalling functions with adverb-syntax for named parametersCalling operators, which are really functions, with adverb-syntax named parametersShow the de-sugared version of an infix operator with adverb-syntax named parameters",{"id":2608,"title":2609,"titles":2610,"content":2611,"level":9},"\u002Fperl-htmlunit","Perl_HtmlUnit",[],"This is a perl interface to the HtmlUnit library. This is kinda like WWW::Mechanize, in that it is a library that acts as a browser. HtmlUnit, however, includes quite complete javascript support. This implementation is a very straightforward use of Inline::Java.",{"id":2613,"title":261,"titles":2614,"content":2615,"level":15},"\u002Fperl-htmlunit#code",[2609],"HtmlUnit on CPANdarcs get http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002FWWW-HtmlUnit Recent Changes:\n\u003Crss http:\u002F\u002Fthelackthereof.org\u002Fdarcs-rss\u002Ffeed\u002Fperl-WWW-HtmlUnit.rss>",{"id":2617,"title":2618,"titles":2619,"content":2620,"level":9},"\u002Fperl-hashref-iteration-example","Perl_hashref_iteration_example",[],"Here is an example of iterating over a nested hashref datastructure in Perl. Which outputs: Fun, eh?",{"id":2622,"title":2623,"titles":2624,"content":2625,"level":9},"\u002Fperl6-colons","Perl6_Colons",[],"I'm collecting all the ways you can use : in Perl 6. Larry's 1st Law of Language Redesign: Everyone wants the colon\nLarry's 2nd Law of Language Redesign: Larry gets the colon A lot of these are variations on a theme, especially the theme of \"colon-pair\" syntax. Where two uses of the colon look different or are in a different usage context, even if they are technically the same, I'd prefer to illustrate them both.",{"id":2627,"title":2628,"titles":2629,"content":45,"level":56},"\u002Fperl6-colons#namespace","Namespace",[2623],{"id":2631,"title":2632,"titles":2633,"content":45,"level":56},"\u002Fperl6-colons#binding","Binding",[2623],{"id":2635,"title":2636,"titles":2637,"content":45,"level":56},"\u002Fperl6-colons#colon-pair-syntax","Colon-Pair Syntax",[2623],{"id":2639,"title":2070,"titles":2640,"content":45,"level":56},"\u002Fperl6-colons#types",[2623],{"id":2642,"title":2643,"titles":2644,"content":45,"level":56},"\u002Fperl6-colons#signature","Signature",[2623],{"id":2646,"title":2647,"titles":2648,"content":45,"level":56},"\u002Fperl6-colons#operators-as-methods","Operators as Methods",[2623],{"id":2650,"title":2651,"titles":2652,"content":45,"level":56},"\u002Fperl6-colons#regex","Regex",[2623],{"id":2654,"title":2193,"titles":2655,"content":45,"level":56},"\u002Fperl6-colons#misc",[2623],{"id":2657,"title":2658,"titles":2659,"content":2660,"level":9},"\u002Fpi-girl","Pi_Girl",[],"Listen:  (download) Artists: Brock Wilcox and Jason Woys\nCopy and Share: under the terms of Creative Commons Attribution-NonCommercial license!",{"id":2662,"title":300,"titles":2663,"content":2664,"level":15},"\u002Fpi-girl#lyrics",[2658],"Girl with Pi tattoo\nI just wanna sit next to you\nOnly reason I stayed in school\nWas the girl with Pi tattoo Across the room\nI see you staring at me\nDepth of your eyes\nLike infinity You show that Pi is real\nAnd there's no end in sight\nI'm so impressed\nCan we study tonight? Girl with Pi tattoo\nI just wanna hang with you\nOnly reason I stayed in school\nWas the girl with Pi tattoo Final test\nWe study all night long\nAfter every proof\nAnother hit from the bong Did I write down\nOr was it all in my mind?\nSeeking truth\nIt's only answers I find Girl with Pi tattoo\nI just wanna go home with you\nOnly reason I stayed in school\nWas the girl with Pi tattoo Girl with Pi tattoo\nI just wanna make love with you\nOnly reason I stayed in school\nWas the girl with Pi tattoo",{"id":2666,"title":2667,"titles":2668,"content":2669,"level":9},"\u002Fpinpoint","Pinpoint",[],"Pinpoint is some pretty fun slide software that I like. Homepage: https:\u002F\u002Fwiki.gnome.org\u002FApps\u002FPinpoint",{"id":2671,"title":2672,"titles":2673,"content":2674,"level":15},"\u002Fpinpoint#my-slide-software-criteria","My Slide Software Criteria",[2667],"Mostly-live edit, ideally in vimSimple markup, ideally diffableBig word centered in screen by defaultNot too uglyExport to PDFOpen-source, duh. Ideally via apt-get Pinpoint additionally has: Associate\u002Frun a command for the current slidePresenter mode (though I don't use this often)Easy drop in videosCan record the time to help pace the presentation Pinpoint workflow: Copy over a simple .pin file to start along with my boring blue fade backgroundStart pinpointEdit file. Saves jump to the first-edited-slideBefore I present, use pinpoint -o to export a PDF and email it to myselfPractice practice practice! There are quite a few setups that meet all these nowadays. But I like pinpoint anyway :)",{"id":2676,"title":2677,"titles":2678,"content":2679,"level":9},"\u002Fpizza-sauce","Pizza_Sauce",[],"1 (15 ounce) can tomato sauce1 (6 ounce) can tomato paste3 cloves minced garlic3 pinches red pepper flakes1 teaspoon ground paprika1 teaspoon Italian seasoning In a medium bowl, Mix together tomato sauce and tomato paste until smooth. Stir in the rest! Warm it up a bit if you like.",{"id":2681,"title":2682,"titles":2683,"content":2684,"level":9},"\u002Fpocket-operator-po-33","Pocket_Operator_PO-33",[],"The Pocket Operator PO-33 Knock-Out is a super fun sampler and step-sequencer made by Teenage Engineering! I got one in August 2019, and am using it to play around with sample-based music. See also Music Gear and Setup In 2019 I got a Pocket Operator PO-33, part of the \"Metal\" series of devices from Teenage Engineering. This is a sampler and step-sequencer in a pocket-calculator-esq form factor. Very fun! These are some notes. Resources: Reddit - r\u002Fpocketoperators - very active community Data Sound 1-8, \"Melodic\"\nSingle sound per buttonSound 9-16, \"Drum\"\n16 sound-slices per buttonEach slice is an independent thing Controls: \"sound\" button\"pattern\" button\"bpm\" buttonRotator-A (left)Rotator-B (right)\"record\" button\"FX\" button\"play\" button\"write\" buttonMelodic buttons\nButton-1Button-2Button-3Button-4Button-5Button-6Button-7Button-8Drum buttons\nButton-9Button-10Button-11Button-12Button-13Button-14Button-15Button-16 Map of modes and inputs and displays: Current selections\nYou currently have one sound selected\nPress \"sound\" -- assigned sounds are dim-lit, current sound is flashing bright-litYou currently have one active pattern, though you may be in part of a pattern-chain\nPress \"pattern\" -- assigned patterns are dim-lit, patterns in the current pattern-chain are bright-lit, current pattern is flashing bright-litYou currently have one FX selected\n\"FLT\" - Filter\nDisplays \"?\" on the screen below feedback area (upper-right)Rotator A (left) LPF, noF, HPFRotator B (right) Res (Resonance)\"tri\" - Trim\nNo trim-mode indicatorDisplay at bottom of screen indicates start\u002Flength of sliceRotator A (left) - slice start offsetRotator B (right) - slice length\"ton\" - Tone\nDisplays \"!\" in a quote-bubble below feedback area (upper-right) when in tone-modeRotator A (left) - Display \"Ptc\", indicates slow-down or speed-up of sample, amount indicated on bottom scaleRotator B (right) - Display \"UoL\" for \"volume\", indicates volume level of sample, amount indicated on bottom scalePerform mode \"PrF\" (default)\nButton-1 through Button-16 -- Trigger sound\nIf current sound is melodic, pitch will change based on which button you pressIf current sound is drum, each button 1-16 will trigger one of the drum slicesEdit mode (press\u002Frelease \"write\", record-icon displayed when in edit mode)\nButtons will be dim-lit on each of the 16 steps that are assigned for the current soundButtons will be bright-lit on each of the 16 steps with the current sound-tone or sound-sliceLong-press a dim-lit button to switch the current slice to that buttonPlay Mode\nPress the \"play\" button to start\u002Fstop play-modePlay (right-triangle) indicator appears on the screen to the left of the clockDuring play-mode the 1-16 buttons will bright-lit on each stepEach step also flashes the play-button on the beatThe entire pattern-chain will playThe current pattern number is displayed, like \"P-1\" through \"P-16\"\nDuring chains it will change from one pattern to the next as it playsWrite+(1..16) - add the current sound (melodic note or drum-trigger) at the current stepHold down \"FX\"\nCurrent step switches from bright-lit to dim-litCurrent effect (1-16) is bright-litNo-effect (16) is bright-lit by defaultPlay+Edit ModePlay+Perform Mode\nSound bright-lit blink when triggered\nIf a drum is on button-10, then every time ANY drum on button-10 is triggered then button-10 will light upRecord Mode\nHold down the \"record\" buttonBlinks \"rEc\"Displays monitor scale of volume level of inputAdditionally hold down 1-16 to record to a soundIf the target sound is a drum (9-16), at the end of the recording the sound will be sliced\nSlicing is done based on \"transients\", bits of silenceRecord+Sound -> Delete current sound\nDisplays \"dEL\" during deletion, which can take a second or twoRecord+Pattern -> Clear the current pattern\nDisplays \"cLr\" during clearing, which can take a second or twoClears only the current pattern in the pattern chain, keeps the chain sequenceBackup Mode\nPress write+sound+playCancel by pressing any buttonRestore Mode\nPress write+sound+recordCancel by pressing any button",{"id":2686,"title":2687,"titles":2688,"content":2689,"level":9},"\u002Fpolly","Polly",[],"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. You can get it at: http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fpolly\u002F Features: Plays ogg's and mp3's!Can shuffle the list of songsCan do the mpg123 trick of hitting ^C to go to the next song, or ^C^C to haltPlaylist can come from STDIN if you likeExtendable! :)",{"id":2691,"title":2692,"titles":2693,"content":2694,"level":9},"\u002Fpredict-and-control","Predict_And_Control",[],"Abstract: I present here a model of Free Will which aims to be of practical use both within one's own life and for understanding and having compassion for other entities. The model is built on defining Free Will as accurate prediction combined with accurate control. Because we can predict and control with varying accuracy about a topic, Free Will becomes a sort of probability field which can be strong or weak for an entity and dimension of will. Finally, I advocate for us each to seek ways of increasing our own Free Will. In Predicting the Future, I put forth the idea that predicting the future is the embodiment of Free Will. I think that can be refined. There are various ways that people attempt to measure intelligence, IQ being the most famous, though of course having many advocates and enemies. Another framework for intelligence is the \"multiple intelligences\", which breaks the notion down into a set of categories, each with some independent (perhaps non-numerical) measure. Either way, they both bracket out one's abilities and limits into various categories. I wish to instead take a step back toward a more general definition of intelligence, one which overlaps with some of the categories presented in other measures of intelligence. Namely, I propose that \"intelligence\" is equivalent to \"ability to accurately predict the future\". A lot of things can be used to predict the future, and there are a lot of different types of predictions that you can make. So you might be able to predict where a thrown ball will land based on some very quick parabolic curve heuristics. Or you might predict what emotion a written story will have on a reader. And there are several degrees of accuracy in predictions. The most obvious is how far into the future you can predict. Another is how fine-grained is the prediction itself - there is a big difference between predicting that tomorrow it will be hotter than today, and predicting that it will be 5.21 degrees hotter. The tools that we use to predict the future are talked about a lot in intelligence tests. Typically, IQ will be broken down into short\u002Flong term memory, quantitative reasoning, spatial reasoning, and so on. Ultimately it is the prediction itself that matters though. Next we contemplate the concept of control. Being able to control something is often called \"will\". Now of course all will comes down to controlling yourself - whether it be pronouncing a death sentence or grasping and turning a doorknob. But we can abstract that away a bit, and just think in terms of giving orders or opening doors. Either way, we are attempting to control something. Often we fail to exert control. The order is counter-manded, the door is locked. So perhaps we could call this attempt to control. \"Free Will\", then, is the combination of these two things, Prediction and Control, in a feedback loop. We can think of measuring prediction by seeing how accurate and how far into the future you can predict. We can think of measuring control by seeing whether your actions accomplished their immediate task. Thus, we can think of measuring potential Free Will by a combination of these two -- looking at how accurate and far you predict, and how you successfully control based on those predictions. Finally, we can think about Kinetic (or Active) Free Will, which is when you actually exert free will by predicting and controlling the future.",{"id":2696,"title":2697,"titles":2698,"content":2699,"level":15},"\u002Fpredict-and-control#a-call-to-arms","A Call To Arms",[2692],"You have before you several tasks of betterment available, based on the above definitions. Ultimately, the idea is to increase your Kinetic Free Will. Improve your ability to predict\nLearn how to learnLearn skillsUse the scientific method -- it is at it's root all about predictingThese days it's all about using models to predict. Learn about that.Improve your ability to control\nPractice!Increase the number of variables at your disposal (number of knobs to tune)Feedback into your predictionsEliminate nondeterminism wherever possible (and beneficial?)Put your Potential Free Will into action\nActually make some predictions and apply control",{"id":2701,"title":2702,"titles":2703,"content":2704,"level":9},"\u002Fpredicting-the-future","Predicting_the_Future",[],"Science is really the art of predicting the future. What we consider \"free will\" is itself the same thing... our ability to predict the future. Therefore science is the mechanism through which we increase our ability to predict the future and thereby increase our free-will. Let's consider the \"scientific method\" itself. Here is the scientific method in four steps (from this site), along with some commentary: # Observation and description of a phenomenon or group of phenomena.\n# Formulation of an hypothesis to explain the phenomena. In physics, the hypothesis often takes the form of a causal mechanism or a mathematical relation.\n# Use of the hypothesis to predict the existence of other phenomena, or to predict quantitatively the results of new observations.\n# Performance of experimental tests of the predictions by several independent experimenters and properly performed experiments.\n\nIf the experiments bear out the hypothesis it may come to be regarded as a theory or law of nature (more on the concepts of hypothesis, model, theory and law below). If the experiments do not bear out the hypothesis, it must be rejected or modified. What is key in the description of the scientific method just given is the predictive power (the ability to get more out of the theory than you put in; see Barrow, 1991) of the hypothesis or theory, as tested by experiment. It is often said in science that theories can never be proved, only disproved. There is always the possibility that a new observation or a new experiment will conflict with a long-standing theory. \nHere the emphasis is on creating a model of the world, but I'd like to drive home that creating the model is merely the means to the end -- predicting the future.",{"id":2706,"title":2707,"titles":2708,"content":2709,"level":9},"\u002Fprogramming-languages","Programming_Languages",[],"http:\u002F\u002Fwww.perl.com\u002Fpub\u002Fa\u002F2000\u002F12\u002Fadvocacy.html",{"id":2711,"title":2712,"titles":2713,"content":2714,"level":9},"\u002Fproject-goe","Project_-_GOE",[],"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.",{"id":2716,"title":2717,"titles":2718,"content":2719,"level":9},"\u002Fproject-goe-(abstract)","Project_-_GOE_(abstract)",[],"GOE - Goe Object Environment, see Project - GOE This is a perl project relying heavily on Perl's reflexive nature. The idea is to build a smalltalk-like environment for Perl.",{"id":2721,"title":2722,"titles":2723,"content":2714,"level":9},"\u002Fproject-abstract-goe","Project_Abstract_-_GOE",[],{"id":2725,"title":2726,"titles":2727,"content":2728,"level":9},"\u002Fproject-ideas","Project_Ideas",[],"Get simplecov results from a single test or execution. Create a copy of the codebase where you delete all uncovered code and then reformat the remaining code -- a minimal codebase to do whatever your test needed.Annotate p6 roast and docs so you can have roast coverage metric for docsCreate some examples of Inline::Python from p6 that use scipyLook for ways to make Inline::* socially acceptable in p6 land\nEspecially making it work really really easilyIntegrate Jupyter protocol into an LREP middlewareImplement REPL.here for rakudo, like binding.pryUse rakudo-js to wrap reactMagic workflow (like nREPL, figwheel, reagent, ...) for rakudoReverse-coverage lookup tool. Given a line of code, list all the tests that cover it\nDid a POC of this, collected coverage into elasticsearch. Needs to be formalized and have a standard query so we can do cross-lang and cli interfaceShould be able to invoke from the cli or my editor (same thing with vim)Use RNN on source code or revision history. What can we learn?Write a simple Amazon Lambda service to see what it is likePerl 5 and Rakudo plugins for asdf version managerQuickCheck or clojure\u002Fspec for Perl 6",{"id":2730,"title":2731,"titles":2732,"content":2733,"level":9},"\u002Fprojects","Projects",[],"I present here a very incomplete list of programming-related projects, and the tools and languages I might use to create them. Also see the awwaiid github repo for more projects!",{"id":2735,"title":2736,"titles":2737,"content":2738,"level":15},"\u002Fprojects#current-projects","Current Projects",[2731],"If you were to ask me what I'm working on right now, I might say one of these. Rotae Versantur - Norns Monome+Arc based four track recorderGhostwriter - Use the reMarkable2 as an interface to vision-LLMs. Ghost in the machine!Human Essentials - Part of the Ruby For Good organization; inventory control for diaper and period-supply banksREPL Looper - Making music with a code consoleFairy Lights - Programming decorative LED lights in my living room and Christmas treeChompie - Chomp a codebase down to the boneMETL - Research around extracting and using Formal Models from an existing codebaseMeta TLT - Messing around with this website or tooling",{"id":2740,"title":2741,"titles":2742,"content":2743,"level":15},"\u002Fprojects#backburner","Backburner",[2731],"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. Mizik - A game of memory, sound, shapeGremllm - Put a monster into your codebaseTask Seeder - Interactively rank your tasks using different tournament and sorting algorithms",{"id":2745,"title":2746,"titles":2747,"content":2748,"level":15},"\u002Fprojects#inactive","Inactive",[2731],"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! An Introduction to Programming via PerlCGI Inspect - Inspect running CGI appsCaravan - OCaml implementation of the sequential data mining algorithmsCensus Data Extraction - Small project to help a researcher correlate some dataContinuity - Continuation-based web-application framework for PerlContize - Provide a perl object with a way to fake continuations (complete and abandoned)Covid Can I Do It - An interactive harm-reduction dataset built during the COVID pandemicDHTML Combo - A combo box made using DHTML\u002FJavascriptDot2html - Convert graphviz files to HTML and JavascriptEPFarms Panel - A control panel for hosting clientsGOE - Smalltalk-like environment for PerlGecko-based html2ps - Render html -> postscript using the geckoGraph Module - OddMuse plugin to make GraphViz graphs (complete)JQuery Autoindent - I've always wanted a textbox that auto-indentsLLM Token Tree Visualization - Visualize LLM token selectionMHTML - An HTML (XML?) Macro language (complete? old)MobileFS - Fuse filesystem to cache files for mobile readingModule Level Polyglot - Advocacy and projects, sharing libs between langsNoiseGen - Playing with PortAudio and generatorsOCaml Eval - Evaluate OCaml code dynamically (complete, old)OCaml GrabBag - Datastructure for a random-retrieval collection (complete)OGPF - OCaml Genetic Programming FrameworkOddMuse Pingback - A pingback server for oddmuse comment pages (abandoned)Oddmuse EditSection - Edit things on a per-section basis in oddmuseOddmuse Editfile - Edit a file (especially perl) through oddmuseOddmuse Ref Links - Module for a sidebar list of incoming links for a pageOddmuse Search Tags - Module for a simple tagging mechanismOpenmoko - Customizing the Open PhonePerl 6 Use Libs From Ruby - Perl 6 to Ruby bridgePerl HtmlUnit - A perl interface to the java HtmlUnit libraryPolly - A very simple perl wrapper around some command-line audio playersRubiks Cube Solver - I finally got my very own Rubik's Cube!Scrutiny Debugger - PSGI\u002FPlack Middleware providing a debuggerSetDB - A set-theoretical database interfaceSkechiki - A Perl\u002FGTK sketchbook for small touch-screen devicesSport Logo Quiz Game - Test your knowledge of sport team logos!The Fridge - A javascript\u002Fphp refrigerator (complete)Untyped Lambda Calculus in OCaml - Exactly what it sounds like (complete? old)Use Everywhere - Use a perl module all over the placeVladimirBot - Personal assistant botWayV - Building on Mike Bennett's gesture recognition appWeb Board Games - Web based 2D board gamesWhite Elephant Gift Selector - Web app to pick the perfect gift!Zend Hacking - Feeling my way around (abandoned)",{"id":2750,"title":1634,"titles":2751,"content":2752,"level":15},"\u002Fprojects#tools",[2731],"I love Vim - my preferred IDESee a Screenshot on 2003.10.17Darcs - revision\u002Fbranch management. It's fun.",{"id":2754,"title":2755,"titles":2756,"content":2757,"level":9},"\u002Fquestionasker-extension","QuestionAsker_Extension",[],"If you attempt to edit the pages of this wiki, you must answer a question before the save will be processed. Why is this, you ask? I'll tell you. Robots and underpaid chinamen. Thats why. It all comes down to content control -- specifically the desire to eliminate SPAM. For quite a while, and increasingly, I was getting junk put onto this site. Most of it was in japanese or chinese, so I couldn't actually read it... but the nonsensical nature and the links to porn make it obvious. I didn't want this stuff on my site so I began to contemplate getting rid of it in a permanent manner. The most common way to deal with this in the wiki world is the introduction of Banned Content. Its easy, you create a page or a file with a list of things which cannot appear on any wiki page. Then, when you get spammed, you grab the links or text they put on your page, ban it all, and you can never get that spam again. Lately some sites have taken it a step further by sharing their banned-content lists, so that the spam gets blocked on the whole group of wikis.",{"id":2759,"title":2760,"titles":2761,"content":2762,"level":9},"\u002Frepl-looper","REPL Looper",[],"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! See https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Frepl-looper for the code, documentation, and a journal of development.",{"id":2764,"title":2765,"titles":2766,"content":2767,"level":9},"\u002Frest-ajax-and-continuations","REST_AJAX_and_Continuations",[],"Summary: The three amigos are a perfect match for one another, each making up for the other's weaknesses. REST gives us nice URLs, AJAX (and javascript as a whole) gives us more client-power, and continuations turns the world inside-out on the server side.",{"id":2769,"title":2770,"titles":2771,"content":2772,"level":15},"\u002Frest-ajax-and-continuations#the-three-amigos","The three amigos.",[2765],"Each of the three have aspects I'm interested in, along with giant cans of worms I don't care about for the present discussion. REST - Representational State Transfer\nThe part I care about: Each request is mostly-stateless (I except authentication). A URL refers to a noun -- a thing (or list of things) you are viewing or manipulating. AJAX - Asynchronous JavaScript And XML\nThe part I care about: Fetch stuff from the server and display the result in the current page without going to another page. Change the minor-state but not the major-state of the page. Continuations\nThe part I care about: Re-Inversion of control... make it so that the server-side is an ongoing process instead of one that terminates between each request. Effectively stop programming state machines though explicit lists of states and transfers. Instead use the language's built-in control structures.",{"id":2774,"title":2775,"titles":2776,"content":2777,"level":15},"\u002Frest-ajax-and-continuations#desires-and-goals","Desires and goals.",[2765],"I want simple, memorable, URLs which reflect the current state of the application and a linkable jump-point. I'd like for the back button to go back to the most recent linkable spot. I used to try to make every link on the page secretly be a button. That way when you navigated away from the page the webapp would get the chance to say \"wait a second! Are you sure?\" if it so desired. But that's a horrible way to do it -- well, if nothing else because its ugly. But the point is that I want that functionality; if someone is in the middle of a complex process but then navigates to the front-page I want to make sure they get the chance to save their work (or at least that their work is transparently saved).",{"id":2779,"title":2780,"titles":2781,"content":2782,"level":15},"\u002Frest-ajax-and-continuations#progressive-enhancement","Progressive enhancement.",[2765],"Let's start with the base case -- lynx with no javascript. We have two basic things here. First we have RESTful URLs to things. Second we have POST forms for complex processes. Each page gets a PageID, so we can detect if they are trying to re-post a form (and either deal with it or abort). Generally we POST back to the current URL. Next let's add in the ability to execute some basic javascript. We'll add onclick events to all the links on the page. When the link is clicked we'll actually POST the form, changing its action to the href from the link. This gives us the ability to intercept navigation requests when we are in the middle of a complex interaction. We can save the current user data and then decide what to do, either giving them the page they request or insisting that they complete or abort the current process. Finally we add in complex javascript (AJAX). We divide requests into two types, simple and complex. A simple request does a full-page refresh and possibly changes the URL. A complex request does a background fetch and only updates part of the page. You shouldn't be able to link to step-3 in a 5 step wizard, so we don't update the URL for it. Instead you get a url like http:\u002F\u002Fapp.com\u002Fadd\u002Fwizard. Some of this was inspired by a talk by Anton van Straaten at LL4.",{"id":2784,"title":2785,"titles":2786,"content":2787,"level":9},"\u002Frpm-challenge-2026","RPM Challenge 2026",[],"Mostly using Rotae Versantur (download) - You and Me and The Devil",{"id":2789,"title":2790,"titles":2791,"content":2792,"level":15},"\u002Frpm-challenge-2026#things-to-say-you-and-me","Things to Say (You and Me)",[2785],"I've been rolling the chorus-bits around for a few years, now trying to figure out how to glue it together. With the four-track I first sang it a bit, then doot-da-doot a bit, then sing it better, then add some bass. (download) Next ... I might start over :)",{"id":2794,"title":2795,"titles":2796,"content":2797,"level":9},"\u002Frandomnewpage","RandomNewPage",[],"Describe the new page here. This page edit gave me the same test question (2 + 4) as before. Well there are only like 4 questions. You could try shift+reload or something. Sometimes they seem to stick and I have no idea why! :) (brock)",{"id":2799,"title":2800,"titles":2801,"content":2802,"level":9},"\u002Frandori","Randori",[],"\"Pair Programming Musical Chairs\" Apparently a  is a form of martial arts training where the students take turns sparring with the instructor. In the context of programming, it's a form of pair programming where the pairs rotate every few minutes, and everyone is working on the same problem together. It's a great way to learn from others, and to teach others, and to get a feel for how different people approach problems. Also it is SUPER FUN!!!",{"id":2804,"title":2805,"titles":2806,"content":2807,"level":15},"\u002Frandori#roles","Roles",[2800],"Driver -- One person at the keyboard. Don't think, just type (maybe syntax-level -- write a function, extract a method, if they know the language). Only does what the Navigator tells them to do.Navigator -- Sit next to the driver and direct them. Can also ask the choir\u002Fqueue for advice, especially if they aren't familiar with the technology being usedChoir -- Everyone else, watching and kibitzing as appropriate and helpful to the NavigatorAudience -- Passive watchers who aren't actively participating. Ideally used if you run out of space in the Choir, and ideally they keep their thoughts to themselves until they join the Choir :)Bonus role: Guide -- this person knows the tech and guides the current Navigator, teaching the whole group through the guidance",{"id":2809,"title":2810,"titles":2811,"content":2812,"level":15},"\u002Frandori#physical-setup","Physical setup",[2800],"A screen that everyone can see that is projecting from a computerComputer on a table with two chairs, off to the side. This is where the Driver and Navigator sit, so they can see the screen and the Choir-Queue can hear them.Row of chairs for the Choir-Queue, facing the screenMore chairs behind that for the general passive audience",{"id":2814,"title":2815,"titles":2816,"content":2817,"level":15},"\u002Frandori#process","Process",[2800],"Group picks a problem with specific goals \u002F strategy (or one is provided by moderator)After a fixed amount of time (3-5mins) or event (red\u002Fgreen\u002Frefactor) everyone ROTATES!Joyously shout \"ROTATE!\"Everyone stands upDriver heads over to the end of the Choir-QueueNavigator becomes DriverFirst chair in the Choir-Queue becomes NavigatorEveryone in Choir moves down a chair, making room for the previous Driver!Do this for a while (1-2 hours maybe, or a nice stopping point) and then everyone reviewsThis works well with toy problems and small challenges. I've done it with command-line games especially, but other things also like going through a tutorial or one time we built a Christmas Tree out of pure CSS and a few divs.",{"id":2819,"title":2820,"titles":2821,"content":2822,"level":15},"\u002Frandori#questions","Questions",[2800],"What if I have a lot of participants?\nSince each rotation is 3-5 minutes, this starts running out of scale at 8-10 participants. You can additionally have an audience, folks sitting in the back who are passive watchers learning and observing. You could leave an empty seat in the choir for people to join\u002Fdepart. The longer the Randori the more people can participate, of course, but it can't last forever :)What if I have some people who are shy, who don't want to program publicly?\nThat's ok! It's cool to hang out in the audience and watch from afarSet the tone of friendly enthusiasm and you will find it to be contagious :)Remember to let folks know that they are NEVER alone, and at no point are they solely responsible for what is happening; the overall hive mind is working together",{"id":2824,"title":2825,"titles":2826,"content":45,"level":9},"\u002Frecent-changes","Recent_Changes",[],{"id":2828,"title":2829,"titles":2830,"content":2831,"level":9},"\u002Frecurse-2024","Recurse 2024",[],"I'm attending The Recurse Center for 6 weeks from March 25 - May 3. TLT - 2024.01.31 - Recurse Setup",{"id":2833,"title":2834,"titles":2835,"content":2836,"level":15},"\u002Frecurse-2024#project-idea","Project Idea",[2829],"I'm going to explore the intersection of Alloy+LLM+Rails, or more generally how to leverage LLMs to bring \"formal methods\" into the Real World. My general hypothesis is that (a) Formal Methods (such as model checking) are valuable, (b) they are too costly to use IRL, and (c) LLMs can help bridge that gap. We'll see :)",{"id":2838,"title":2839,"titles":2840,"content":2841,"level":15},"\u002Frecurse-2024#layered-timeline","Layered timeline",[2829],"I'm thinking of having a rough schedule that will be default way to decide \"what should I be working on\". 6 weeks\nWork as an iteration for each weekSet a goal, make a set of tasks, burn them down5 days a week6 hours a day",{"id":2843,"title":2844,"titles":2845,"content":2846,"level":9},"\u002Freflex-vs-anyevent","Reflex_vs_AnyEvent",[],"Title: POE\u002FReflex vs Coro\u002FAnyEvent Abstract:\nA head-to-head comparison of two disparate concurrency management systems in Perl5. Strengths? Weaknesses? Cats? Dogs? You decide. Current plan: nperez will represent POE\u002FReflex, awwaiid will represent Coro\u002FAnyEvent. Each will get 15 minutes to introduce background concepts, and will then do some direct comparisons with feedback from the audience! Comments to organizers:\nJoint talk with nperez. I believe we are open to editorial suggestions!",{"id":2848,"title":2849,"titles":2850,"content":2851,"level":9},"\u002Fresponse-to-richard-epstein-article","Response_to_Richard_Epstein_Article",[],"Response to Epstein, Richard: Why open source is unsustainable This article had some misinformation which struck a bad cord in my head... for some reason I feel compelled to convince this guy that he is incorrect on many of his points. Hence this page. For now this will be random notes but it may eventually take the form of a full response. \"Rather, like the “copyleft” movement in general, the GPL often supplies, as with Linux, an all-enveloping ownership structure by which a central committee decides whether to incorporate proposed changes into the basic public program. (Anyone can keep whatever version he likes for personal use.)\" This is the first or second blatantly wrong and misleading thing which Epstein states. The GPL does not dictate the structure of a software development community, such as the Linux kernel developers. Ownership is a concept which becomes very difficult to follow in situations such as this, and using the term \"leadership\" here is a much more accurate view. Linus is the leader of kernel development, not the owner of the kernel. Certainly leadership does imply a degree of control, and control is indeed the central tenet of ownership. The degree of control in place when we discuss leadership is, however, less than that of actual ownership. Linus does not have the ability to suddenly stop all kernel development and distribution, as he would if he were the owner. In fact nobody has this ability, and hence nobody owns the linux kernel. It is true that the leadership of a project get to decide what does and does not go into their shared version of the software. It is, on the other hand, misleading to say that \"Anyone can keep whatever version he likes for personal use,\". The statement taken alone is true, but in the larger context there is important inaccuracies... the scope of the statement can be modified. It can an should instead read: Anyone can keep, modify, ''and distribute as another project'' (ie, fork) whatever version he\u002Fshe likes, period. This is the essence of competition in open source software development -- you must be competitive in leadership and code. If you are not doing a good job another can usurp you, becoming the new commonly used version of the software. It is surprising that someone with as impressive credentials as Epstein could have such a strong misunderstanding of the GPL and the free software movement. At points he nearly contradicts himself even, for example, \"No cash compensation is paid to the self-selected improvers, who either work for the love of the game, or because they are supported by some third party payers, either in universities or industry, who want to keep this alternative platform alive.\" Certainly I can see that most people who do it for the love-of-the-game are not monetarily compensated, but money is the exact sort of support provided by \"third party players, either in universities or industry.\" Epstein claims that one weakness of the GPL is that \"It does not in so many words specify the appropriate remedy when some portion of the open source code is incorporated into an otherwise proprietary program.\" This, again, is false. I hate to just say things are false, it is much more interesting to find flaws in nearly correct pieces of text, but alas. From the GPL: \"If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all.\" This is a far cry from not specifying a remedy, rather the remedy is spelled out very clearly. You must comply either by altering the overall license or by removing the GPLed code from the product. It has been often said that the GPL is infectious, yet here it is clear that the default is to ''not'' \"infect\" other programs, but instead to leave them alone. It is much more of a defensive measure to make sure encumbered code does not infect the GPLed code. I'm tired of this. I have only gotten about halfway through the article, and only cited every other blatantly wrong item. It is bullshit. I'd love to hear a response on these topics, but don't expect one. Epstein, as I said, has a very impressive background... and it is very disappointing that such an awful piece could come out of such a person.",{"id":2853,"title":2854,"titles":2855,"content":2856,"level":9},"\u002Fresume","Resume",[],"=== Brock Wilcox - Programmer == I not actively seeking employment at this time. Here is my resume in several formats (in order of preference): TLT:docs\u002Fresume\u002Fcurrent\u002Fbrockwilcox-resume.pdf PDF FormatTLT:docs\u002Fresume\u002Fcurrent\u002Fbrockwilcox-resume.html HTML FormatTLT:docs\u002Fresume\u002Fcurrent\u002Fbrockwilcox-resume.sxw OpenOffice FormatTLT:docs\u002Fresume\u002Fcurrent\u002Fbrockwilcox-resume.txt Text Format Contact Information:",{"id":2858,"title":2859,"titles":2860,"content":2861,"level":9},"\u002Fright-way","Right_Way",[],"The way things should be. The way of the Tao. Perhaps otherwise unnameable... perhaps indescribable. When something is the Right Way, you ''just know''.",{"id":2863,"title":2864,"titles":2865,"content":2866,"level":9},"\u002Frnado-human","Rnado Human",[],"(summary)",{"id":2868,"title":2869,"titles":2870,"content":2871,"level":15},"\u002Frnado-human#section","Section",[2864],"content",{"id":2873,"title":2874,"titles":2875,"content":2876,"level":9},"\u002Frobits","Robits",[],"== Intelligent Robots and Programs==\nIn our current internet society the word 'Bot' has been used for software robots. At some point I decided that I didn't want to end up like the Sirius Cybernetics Corporation employees - \"a bunch of mindless jerks who were the first against the wall when the revolution came.\" So I think that, when they arrive, we should refer to intelligent robots as \"Robits\" so we don't hurt their feelings by implying that a robot is a robot is a robot. I figure we should start now before it becomes a problem!",{"id":2878,"title":2879,"titles":2880,"content":2881,"level":9},"\u002Frotae-versantur","Rotae Versantur",[],"The Wheels Turn. A monome norns+arc four track inspired recorder.",{"id":2883,"title":2884,"titles":2885,"content":2886,"level":15},"\u002Frotae-versantur#concept","Concept",[2879],"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). See the project on github Equipment:Monome Norns (though I technically have the Monome Norns Shield) Monome Arc",{"id":2888,"title":2889,"titles":2890,"content":2891,"level":15},"\u002Frotae-versantur#instructions","Instructions",[2879],"Use the Arc to visualize and control a four-track recording and playback machineButton release\nToggle Rolling vs StoppedTurn a Wheel\nSet MODE for that trackAmp, Pan, Reverb, ToneButton + Wheel 1\nSeekButton + Wheel 2\nSet MODEAmp, Pan, Reverb, ToneButton + Wheel 3\nSelect recording trackButton + Wheel 4\nSelect bounced tracks, they then feed recording",{"id":2893,"title":2894,"titles":2895,"content":2896,"level":15},"\u002Frotae-versantur#thoughts","Thoughts",[2879],"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?",{"id":2898,"title":2899,"titles":2900,"content":2901,"level":9},"\u002Frubiks-cube-solver","Rubik's_Cube_Solver",[],"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. 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. 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.",{"id":2903,"title":2904,"titles":2905,"content":2906,"level":9},"\u002Fruby","Ruby",[],"Ruby is a lot like perl, except everything has been done on purpose.",{"id":2908,"title":2909,"titles":2910,"content":2911,"level":9},"\u002Fruby-perl-rosetta-stone","Ruby_Perl_Rosetta_Stone",[],"A map from Ruby to Perl tools, narrowed to ones that I use or recommend. || Thing                                                    || Ruby            || Perl                                        ||\n|| Normalize\u002FLayer HTTP request chain from app to webserver || Rack            || Plack\u002FPSGI                                  ||\n|| Preforking webserver                                     || unicorn         || starman                                     ||\n|| Nonblocking-IO webserver                                 || thin            || twiggy                                      ||\n|| Full web MVC stack                                       || Rails           || Catalyst                                    ||\n|| Lightweight RESTful stack                                || Sinatra         || Dancer, Mojolicious                         ||\n|| Package\u002Fdependency installer                             || gem             || cpanm                                       ||\n|| Dependency tracker                                       || bundler         || carton                                      ||\n|| Event-driven architecture, async-IO                      || EventMachine    || AnyEvent, IO::Async                         ||\n|| Common templating                                        || erb, haml       || Template::Toolkit, Text::HAML               ||\n|| Testing framework                                        || rspec, cucumber || Test::More, Test::Spec, Test::TDD::Cucumber ||\n|| REPL                                                     || Pry             || Devel::REPL                                 ||",{"id":2913,"title":2914,"titles":2915,"content":2916,"level":9},"\u002Fruby-vs-perl6","Ruby_vs_Perl6",[],"In Digging Into Ruby Symbols, Steve Yegge talks about dynamic code generation in Ruby. He says that Ruby doesn't go far enough in giving you access to the language itself. My understanding of Perl6 is that this sort of thing will be embraced and encouraged. i think that Ruby culture might see such things as scary, whereas the Perl culture is ripe with the proven desire to jump at the opportunity. Put well in a journal entry by Mike Keighton Fisher.",{"id":2918,"title":2919,"titles":2920,"content":2921,"level":9},"\u002Fsamsung-galaxy-s-ii","Samsung_Galaxy_S_II",[],"Just got me a SGS2 from T-Mobile only to quickly discover that the T-Mobile version is actually a slightly different phone than the unlocked SGS2... not necessarily a bad thing since the max 4G speed is higher and the screen is a bit bigger. But very irritating when I went to drop Cyanogenmod on it. T-Mobile model is \"SGH-T989\" (instead of I9100)Alpha Cyanogenmod from KangSummary of ROMs available for T-Mobile SGS2",{"id":2923,"title":2924,"titles":2925,"content":2926,"level":15},"\u002Fsamsung-galaxy-s-ii#apps","Apps",[2919],"Wifi Tether - Nice GPL tethering",{"id":2928,"title":2929,"titles":2930,"content":2931,"level":9},"\u002Fscience-vs-mathematics","Science_vs_Mathematics",[],"(originally written up at TLT - 2005.04.25) I've been thinking about Science and Mathematics lately, and how they interact. There was a very interesting paper mentioned on http:\u002F\u002Flambda-the-ultimate.org\u002F, The Unreasonable Effectiveness of Mathematics in the Natural Sciences, which is a great read. This and a few other random encounters have led me to contemplate the relationship between mathematics and science. One thing, which I cannot repeat often enough, is a simple yet profound difference between the process of the two disciplines. Mathematics is about proof, while science is about disproof. This has surely been written elsewhere, but it is nice to contemplate the idea on its own. In mathematics you come up with a theorem, and then attempt to prove that the theorem is correct or incorrect though logical argument. In experimental science, on the other hand, you come up with a theory which explains all known data points. You then try to collect further data points or make a logical argument in an attempt to disprove the theory. That framework in mind, let's turn our attention to the concept of completeness in mathematics. From Goedel we have the incompleteness theorem, which states that (in our current system) there are truths of mathematics which are not reachable by logical argument from existing truths. That is -- there are some statements which we cannot prove nor disprove, but for which there is no situation in which the statement is false. In other words, there are true statements of mathematics which cannot be proved. Now let's turn our attention to science. Are there, then, statements of science which cannot be disproved, in a corresponding way? The most direct instance of such a concept is that of God. God is here defined as something completely outside our physical system, yet which exists nonetheless. Existence without physical manifestation seems like something we surely cannot disprove. This seems to put the question outside the reach of science. Yet we have one more bit of thought from the mathematicians which can be borrowed. How did they react to the incompleteness theorem? They kept right on trying to prove everything under the sun. Even with problems which took years and years to solve, they continued. Even with the threat that these problems may in fact be un-provable. Many of these problems have yielded great results and even proofs... but others are left unsolved. When do we give up? Now apply this question to science.",{"id":2933,"title":2934,"titles":2935,"content":45,"level":9},"\u002Fscreenshot-on-2003.10.17","Screenshot on 2003.10.17",[],{"id":2937,"title":2938,"titles":2939,"content":2940,"level":9},"\u002Fscrutiny-debugger","Scrutiny_Debugger",[],"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. This project is an experiment to bring a debugging tool into a popular perl application chain - Plack\u002FPSGI middleware. Code: git clone http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002FPlack-Middleware-Scrutiny\u002F.git",{"id":2942,"title":2943,"titles":2944,"content":1482,"level":9},"\u002Fsegfault","Segfault",[],{"id":2946,"title":300,"titles":2947,"content":2948,"level":15},"\u002Fsegfault#lyrics",[2943],"There's a little gremlin\nLiving in my code\nIt sneaks a line in here and there\nTo make it all explode I try to make it happy\nI try to treat it right\nDon't drop it into water\nDon't feed it at midnight And yet it still awakes\nRemoving malloc here and there\nIt tries to make me crazy\nAnd to pull out all my hair Who's fault is my segfault?\nWho's fault is my segfault?\nWho's fault is my segfault?\nWho's fault is my segfault? Tell me is that memory\nYours or is it mine?\nDid I just miss a malloc?\nIs it something more divine? Who's fault is my segfault?\nWho's fault is my segfault? Sometimes I think I see it\nIn the corner of my eye\nAll the hairs stand up on my neck\nWhen the gremlin is nearby I know it came in the night\nAnd messed with all my code\nCause it worked just fine yesterday\nAnd now it will not load Now I'm waiting for the moment\nI know it will come soon\nWhen everything is working swell\nAnd then it all goes boom! Who's fault is my segfault?\nWho's fault is my segfault?\nWho's fault is my segfault? Tell me is that memory\nYours or is it mine?\nDid I just miss a malloc?\nIs it something more divine? Who's fault is my segfault?\nWho's fault is my segfault?",{"id":2950,"title":2951,"titles":2952,"content":45,"level":9},"\u002Fsetdb","SetDB",[],{"id":2954,"title":2955,"titles":2956,"content":2957,"level":56},"\u002Fsetdb#a-set-theoretical-database-interface","A Set-Theoretical Database Interface",[2951],"There have been quite a few RDBMS->OO Mappers (see http:\u002F\u002Fpoop.sourceforge.net\u002F) 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. SetDB is a work in progress and the state of the project reflects that fact. Just a warning!",{"id":2959,"title":2960,"titles":2961,"content":2962,"level":56},"\u002Fsetdb#vocabulary","Vocabulary",[2951],"''Values'' are things like names or phone numbers or zip codes or such.A ''tuple'' holds a bunch of values.A ''set'' contains a bunch of same-structured tuples.Each table is a ''simple set''.Sets relate to one another through references (pointers).A ''schema'' is a description of simple sets, their tuples, the tuples' values, and the references between these sets.''Compound sets'' are sets which can have other sets as values.Doing \"$everyone = $db->newSet(person, address);\" is really creating a compound set.",{"id":2964,"title":2965,"titles":2966,"content":2967,"level":56},"\u002Fsetdb#things-that-are-done","Things that are done",[2951],"See SetDB Code ExamplesInferring connecting tablesSets with simple childsetsSets with multiple simple childsetsSimple tuple updatesInternal simple filters",{"id":2969,"title":2970,"titles":2971,"content":2972,"level":56},"\u002Fsetdb#things-to-be-done","Things to be done",[2951],"Sets with complex childsets (like path information)Adding new tuplesAdvanced tuple updates (updating complex childsets)Tuple filtersRelationship filtersSet aliasesSet operations (union, minus, intersection)",{"id":2974,"title":2975,"titles":2976,"content":2977,"level":56},"\u002Fsetdb#inferring-connecting-tables","Inferring Connecting Tables",[2951],"Translating \"(person, 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.",{"id":2979,"title":2980,"titles":2981,"content":2982,"level":56},"\u002Fsetdb#desired-code-features","Desired Code Features",[2951],"Here is some proposed stuff I want to work:",{"id":2984,"title":870,"titles":2985,"content":2986,"level":56},"\u002Fsetdb#see-also",[2951],"TLT:projects\u002Fperl\u002Fsetdb\u002F for currentish codedo \"darcs get http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fsetdb\" to join development (see Darcs)Thoughts and issues with web-based DB programmingSetDB Philosophy for a more abstract discussion of SetDBRelated \u002F Similar \u002F Cool modules\nhttp:\u002F\u002Fpoop.sourceforge.net\u002F for a list of RDBMS \u003C--> OO mapperscpan:DBIx::Recordsetcpan:Class::DBIcpan:Class::Tablescpan:Tie::DBIcpan:AnyData",{"id":2988,"title":2989,"titles":2990,"content":2991,"level":56},"\u002Fsetdb#on-adding-records","On Adding Records",[2951],"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:\ndigraph {\n\"has_book\" -> \"person\";\n\"has_book\" -> \"book\";\n\"place_published\" -> \"book\";\n\"place_published\" -> \"location\";\n} Set Structure:\n(person, book, location) \u003C==> (person, has_book, book, place_published, location)Path:\nperson --> has_book --> book --> place_published --> locationSo 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.Things would be different, however, if we were using: (person, 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.Actually... When we refer to (person, book) this is equivalent to (person, 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...Take (person, publisher) -> (person, 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.",{"id":2993,"title":2994,"titles":2995,"content":2996,"level":9},"\u002Fsetdb-code-examples","SetDB_Code_Examples",[],"Here is some actual working code from SetDB 0.2:use strict;\nuse DBI;\nuse SetDB; Here is some actual working code from SetDB 0.2:",{"id":2998,"title":2999,"titles":3000,"content":45,"level":9},"\u002Fsetdb-philosophy","SetDB_Philosophy",[],{"id":3002,"title":3003,"titles":3004,"content":3005,"level":56},"\u002Fsetdb-philosophy#the-problem","The Problem",[2999],"I've never quite been satisfied as a programmer of databases... when wearing my database designer hat I get to think in terms of relational set theory. When I put on my programmer hat I get to think in terms of rows. No fun at all. I decided that it would be Cool to let my programmer-hat-person get a better view of the database.",{"id":3007,"title":3008,"titles":3009,"content":3010,"level":56},"\u002Fsetdb-philosophy#database-design-theory","Database Design Theory",[2999],"First we must get our database theory in line. Relational databases are powerful tools which can be understood in a variety of ways. Having a mathematical background, I prefer to think of a database as sets (or multisets in some cases) and functions relating one set to another. Most folks with a background in programming datastructures see them as nodes and pointers, and I sometimes slip into this tendency. Various JOIN syntaxes: MySQL - http:\u002F\u002Fwww.mysql.com\u002Fdoc\u002Fen\u002FJOIN.htmlOracle 9i - http:\u002F\u002Fotn.oracle.com\u002Foramag\u002Foracle\u002F01-nov\u002Fo61sql.htmlSQL-92 - http:\u002F\u002Fwww.contrib.andrew.cmu.edu\u002F~shadow\u002Fsql\u002Fsql1992.txt (full spec) (02:49:42) TheOrbTwo: It looks pretty cool, though I'm still not sure abou that stuff on line 9.\n(02:50:45) awwaiid: you mean \"my $people = $db->newSet(person, book);\" ?\n(02:50:47) TheOrbTwo: It'd be highly nifty to guess the schema from a dbh.\n(02:50:48) TheOrbTwo: Yeah.\n(02:50:55) awwaiid: thats the magic part :)\n(02:51:01) TheOrbTwo: Right...\n(02:51:09) TheOrbTwo: Some pod would be nice.\n(02:51:19) awwaiid: it means give me a set of people, and for each of those people attach to them a set of their books\n(02:52:04) awwaiid: you can see the result with the nested while loops\n(02:53:19) awwaiid: oh, missed the 'use DBI' line. grr.\n(02:53:43) TheOrbTwo: Heh, it's always nice to test the code before you post it...\n(02:54:22) awwaiid: well I had this exact thing, then decided I should chop some since nobody could use this without going and getting the rest of the modules anyway, and then you talked me into adding back the chopped bits :)\n(02:56:02) TheOrbTwo: Hm, I read the code in \u002Fprojects\u002Fperl\u002Fsetdb, and am left with two thoughts: Where do those magic subs come from, and where's the rest of it?  It seems too simple.\n(02:56:24) awwaiid: that uses SetDB::Set and SetDB::Tuple\n(02:56:32) awwaiid: most of the work is in SetDB::Set\n(02:56:43) awwaiid: and its ugly stuff, mind you. This is proof-of-concept code :)\n(02:57:10) awwaiid: so check out the SetDB subdir\n(02:57:37) TheOrbTwo: Ahh!\n(02:57:49) TheOrbTwo: The \"no strict 'subs'\" is one of the bits you cut!\n(02:57:52) awwaiid: heh. I'm looking at my code now and have already spotted some crusty stuff that isn't even used :)\n(02:57:54) TheOrbTwo: That's cheating!\n(02:58:02) awwaiid: I put it back!\n(02:58:08) TheOrbTwo: OK then.\n(02:59:23) TheOrbTwo: This looks seriously cool, man.\n(02:59:45) TheOrbTwo: And your horribly crufty code is better then my \"I'm trying to keep this clean\" code often looks.\n(03:00:10) TheOrbTwo: Though that relationship tracing code feels like a problem waiting to happen, I suspect you really do know what you're doing.\n(03:00:22) awwaiid: thats very comforting, actually. I haven't shown any code off in a long time\n(03:00:57) TheOrbTwo: Hm, say I have a tree structure, with parent pointers... any way to easily get a tree out of that?\n(03:01:06) awwaiid: I know what I'm doing sure but you are right -- that code is problematic. Right now this simple example is the most complicated example that actually works... more complicated and little buggies break stuff.\n(03:01:33) TheOrbTwo: $db->newSet('note', 'note')?\n(03:01:36) awwaiid: a tree structure with parent pointers?\n(03:01:39) awwaiid: oh\n(03:01:52) awwaiid: wonderful question.\n(03:02:03) awwaiid: hmm\n(03:02:36) awwaiid: you would have to filter the top level one -- and filtering is not implemented :)\n(03:02:58) awwaiid: otherwise your top-level loop would get all the nodes, not just top-level nodes.\n(03:03:19) TheOrbTwo: And followup: What happens when note gets both a parent pointer and a root pointer, so note relates to itself twice -- how do I specify which pointer I want to trace up?\n(03:03:22) TheOrbTwo: Ah, OK.\n(03:04:07) awwaiid: so maybe\n$notes = $db->(note, note);\n$notes->filter('level = 0', note);\n(03:04:09) awwaiid: or something\n(03:05:17) awwaiid: self referential tables are confusing, so it makes sense that the code which manipulates them would be confusing too. For example, the 'note' in the second line there refers to the first 'note' in (note, note)\n(03:05:36) awwaiid: (though this is all theoretical since, as I said, I have not actually implemented filters yet)\n(03:06:21) TheOrbTwo: Oh, I was thinking more in terms of \"give me the tree underneath note ID $n\": $tree = $db->newSet('note', {id=>$n}, 'note' => 'parent_note');\n(03:06:40) TheOrbTwo: BTW, the questions are from PM's database organization.\n(03:07:48) TheOrbTwo: (Where that hashref specifies what's required of the 'note' preceeding it, and the inner arrayref specifies the path used to get to a note from a note.\n(03:07:59) awwaiid: I was thinking of reserving hash-refs for table renaming. so $db->newSet(person, has_book, book, wrote_book, {person => author});\n(03:08:00) awwaiid: :)\n(03:08:35) awwaiid: in this schema explicitly stating has_book and wrote_book disambiguates the connection between person and book\n(03:09:07) TheOrbTwo: Hm, hashes seem like a pretty natural way to write WHERE clauses.\n(03:09:16) awwaiid: so this would be the set of people, each with (the set of books they own, each with (the set of authors))\n(03:09:45) awwaiid: I suppose the table alias could be done elsewhere\n(03:10:51) TheOrbTwo: Hm, I think we're talking a bit at cross purposes -- often when I'm talking to a DB, I want to say \"give me the suchandsuch object, fully inflated\".\n(03:11:23) TheOrbTwo: Class::DBI is almost what I want there, but it has horrible support for 1:N and N:M relationships with helper tables\n(03:12:03) TheOrbTwo: Your module does that wonderfuly, but doesn't seem to have a way to put WHERE clauses in; it's highly focused on JOINs.\n(03:12:12) awwaiid: ya\n(03:13:31) awwaiid: I imagine the where clauses being a filter. this is a very functional-programming oriented thingie. relationships (not-empty for example) would also have filters\n(03:14:08) TheOrbTwo: Hm.\n(03:14:27) TheOrbTwo: I could see that, but can it be smart enough to use SQL to implement them where it can?\n(03:14:28) awwaiid: so you would say, Here is the set of people and their books and such, now give me a New Set of people based on this one except only those who's name starts with 'W' or who have at least one book\n(03:14:34) TheOrbTwo: And can the syntax be general enough, but not get in the way?\n(03:14:42) awwaiid: that is the goal :)\n(03:14:48) TheOrbTwo: Cool.\n(03:15:06) awwaiid: okay, well... I should go write a paper now.\n(03:15:19) awwaiid: It's been lovely, thanks for the brainpower :)\n(03:15:37) TheOrbTwo: I was thinking in term of field => filter, where filter can be a simple string, a qr() ref, or a coderef.\n(03:15:48) TheOrbTwo: But that fails when your coderef operates on more then one field.\n(03:16:10) TheOrbTwo: This sounds like it could become really interesting -- hope to hear more on it.\n(03:16:19) awwaiid: or if you want SQL greater-than or like or other relationships\n(03:16:25) awwaiid: thanks",{"id":3012,"title":3013,"titles":3014,"content":45,"level":9},"\u002Fsing-sing-sing","Sing_Sing_Sing",[],{"id":3016,"title":1198,"titles":3017,"content":3018,"level":15},"\u002Fsing-sing-sing#songs",[3013],"UmbrellasZombie LoveImmaterial ThingsGot One ShoeTalking DC Vote BluesCode On My MindMarie LaveauCDOLTM",{"id":3020,"title":3021,"titles":3022,"content":3023,"level":15},"\u002Fsing-sing-sing#eriks-music","Erik's Music",[3013],"See his site, http:\u002F\u002Fe2thex.org\u002Fmusic\u002F",{"id":3025,"title":3026,"titles":3027,"content":3028,"level":56},"\u002Fsing-sing-sing#eriks-music-feed","Erik's Music Feed",[3013,3021],"\u003Crss \"http:\u002F\u002Fe2thex.org\u002Fmusic\u002Frecordings\u002Ffeed\">",{"id":3030,"title":3031,"titles":3032,"content":45,"level":9},"\u002Fskechiki","Skechiki",[],{"id":3034,"title":1322,"titles":3035,"content":3036,"level":15},"\u002Fskechiki#goal",[3031],"Ultimately the goal is to digitalize my long-time usage of a 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: Quickly get to where I can start making a new sketch\nWhen 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.Quickly get to a recent sketchUse a stylus (or finger) to accurately sketch\nI should be able to sketch an actual picture, or write in a normal small fontFlip through not-so-recent sketchesHave enough room to generally avoid scrolling\nI never had to scroll with my Moleskine! And some things that my Moleskine couldn't do: Undo\u002FRedoObject-based deleteObject-based move\u002FresizeBackups!Tag or name sketchesSearch sketches\nBy tag, name, or date at leastBy sketching would be cool :)Link pages\nThis is where the wiki bit comes in!Zoom?\nNot sure I want this",{"id":3038,"title":261,"titles":3039,"content":3040,"level":15},"\u002Fskechiki#code",[3031],"I've gotten a huge head start on this by building on Gournal, a Perl\u002FGTK application by Chris Debenham. Chris was targeting a much larger tablet, whereas my immediate target is the n900 (and originally the Openmoko), 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. Things I've done so far: Make all the icons smallerMove the sideways tabbar to the topSwitch to goocanvas\nThis will make it easier to do linking and other stuff, I thinkSwitch to cpan:SVG::Parser instead of cpan:XML::Mini::Document\nGot a significant speedup! Get the code: darcs get http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fskechiki\u002F",{"id":3042,"title":3043,"titles":3044,"content":3045,"level":15},"\u002Fskechiki#resources","Resources",[3031],"https:\u002F\u002Fwiki.ubuntu.com\u002FMeetingLogs\u002FOpWeek1003\u002FGooey",{"id":3047,"title":3048,"titles":3049,"content":45,"level":9},"\u002Fsoftware-toolbox","Software_Toolbox",[],{"id":3051,"title":3052,"titles":3053,"content":3054,"level":15},"\u002Fsoftware-toolbox#operating-system","Operating System",[3048],"Debian (usually unstable)UbuntuMaemo :)Windows in a VM for testing stuffSomeday I'll set up MacOS in a VM too :)",{"id":3056,"title":3057,"titles":3058,"content":3059,"level":15},"\u002Fsoftware-toolbox#desktop","\"Desktop\"",[3048],"MuttirssipidginurxvtxmonadpianobarpollyOpenOffice",{"id":3061,"title":3062,"titles":3063,"content":3064,"level":15},"\u002Fsoftware-toolbox#editing-files","Editing Files",[3048],"Vim!perl -piecat | sort | uniq | wc -l",{"id":3066,"title":3067,"titles":3068,"content":3069,"level":15},"\u002Fsoftware-toolbox#revision-control","Revision Control",[3048],"DarcsGitMercurial",{"id":3071,"title":3072,"titles":3073,"content":3074,"level":15},"\u002Fsoftware-toolbox#websites-webapps-webstuff","Websites \u002F Webapps \u002F Webstuff",[3048],"OddmuseJQueryWget \u002F CurlVimperator",{"id":3076,"title":2154,"titles":3077,"content":3078,"level":15},"\u002Fsoftware-toolbox#music",[3048],"AudacityJackd \u002F qjackctlHydrogen",{"id":3080,"title":3081,"titles":3082,"content":3083,"level":15},"\u002Fsoftware-toolbox#graphics","Graphics",[3048],"GimpInkscapegqview",{"id":3085,"title":3086,"titles":3087,"content":3088,"level":15},"\u002Fsoftware-toolbox#searching","Searching",[3048],"AckRecoll",{"id":3090,"title":3091,"titles":3092,"content":3093,"level":15},"\u002Fsoftware-toolbox#misc-tools","Misc Tools",[3048],"GNU ScreenUnisonrsyncssh -XCmysqlApache",{"id":3095,"title":3096,"titles":3097,"content":3098,"level":9},"\u002Fsphinx-notes","Sphinx_Notes",[],"These are just some collection of notes about getting Sphinx to do what I want it to do. Wish me luck.",{"id":3100,"title":3101,"titles":3102,"content":3103,"level":15},"\u002Fsphinx-notes#_20041006","2004.10.06",[3096],"Working on using the hub4 regression test to make this thing work. I converted a voicemail to a raw audio file with sox bethmom-packet8_voiceMessage.au -r 16000 -w -s -x bethmom2.raw the trickiest part to figure out was the -x to switch endianness. I'm running through another example now to see how well it works, then I'll run the above through. It is certainly not fast the way I have it set up now.",{"id":3105,"title":3106,"titles":3107,"content":3108,"level":15},"\u002Fsphinx-notes#component-overview","Component overview",[3096],"(From http:\u002F\u002Fharvee.org\u002Fpipermail\u002Fossri\u002F2004-September\u002F000826.html) There are a number of components that play a role here.\nIn practice, we care about the following: The phone set defines the sub-word units that will be modeled\nby the acoustic model.  These sub-word units can be things\nsuch as phonemes (e.g., \"ah\", \"ch,\" \"k\", ...), word dependent\nphonemes (e.g., the \"t\" in the word \"eight\"), syllables, and\nso on. Conceptually, the acoustic model essentially maps acoustic\nobservations to the phone set.  The acoustic model can contain\nentries for context independent elements from the phone set\n(i.e., I don't care where the phone occurs) as well as\ncontext dependent elements from the phone set (e.g., the\n\"ah\" that occurs between \"b\" and \"r\" and is at the beginning\nof a word). The pronunciation lexicon maps words to sequences of elements\nfrom the phone set.  For example, a phoneme-based system\nmay give a pronunciation for \"eight\" as \"EY T\", whereas a\none that uses word dependent phones may give the pronunciation\nas \"EY_eight T_eight\". The language model defines the allowable set of words that\nwill be recognized and provides probability information about\nsequences of words.  The language model can be complex\n(e.g., a stochastic n-gram model) or simple (e.g., a simple\nJSGF grammar).  For your application, I'd guess a JSGF\ngrammar that you write would be the better way to go. If you have knowledge of the domain ahead of time, you can\ntailor the individual components to the task, providing\nincreased recognition accuracy.  Creating an acoustic model\nfor the specific task can yield great accuracy, but is\ndifficult to do because it requires lots of training data. We have several acoustic models for Sphinx-4.  The TIDIGITS\nmodel (has word dependent phones just for digits) almost\nmeets your requirements and gives GREAT continuous digits\nrecognition, but doesn't have yes\u002Fno built in, so it probably\nwill not suffice.  The WSJ model is a much more general\nmodel, and will give you coverage for your task.  Since it\nis much more general, however, it may perform slightly\npoorer in accuracy for your specific task.",{"id":3110,"title":870,"titles":3111,"content":3112,"level":15},"\u002Fsphinx-notes#see-also",[3096],"http:\u002F\u002Fcmusphinx.sourceforge.net\u002Fsphinx4\u002F - Sphinx4 Main Pagehttp:\u002F\u002Fharvee.org\u002Fpipermail\u002Fossri\u002F2004-September\u002F000826.html - Overview of major Sphinx4 components",{"id":3114,"title":1533,"titles":3115,"content":1533,"level":9},"\u002Fsport-logo-quiz-game",[],{"id":3117,"title":3118,"titles":3119,"content":3120,"level":9},"\u002Fstate-scope","State_Scope",[],"The idea here is that you can group the state of an application into levels or \"scopes\". Variables themselves already have a scope that is used (conceptualized) in structuring programs. When dealing with web apps scope can be complex. Between invocations of a web (CGI) app, even global variables are lost. State is instead kept outside the app, either in a filesystem or database, or in client-based communication (cookies or query params). In order to better conceptualize the state of a program in the face of such complexity we introduce the idea of State Scope based on a zoomed-out understanding of the state change flow. We consider scope not in terms of program syntax structure, but rather in any place we can identify continuously existing state through the running (or even between runs) of the app. Note that this reminds me of delimited continuations, but those are still only within an app's code structure. State scope is an especially important concept when it comes to understanding and structuring continuations-based web applications. These programs straddle the fence between traditional CGI apps and continuously running desktop (command line) apps, allowing the app architect to shift at will between the two state-management mindsets. The State Scope concept helps structure the relationship between these techniques. digraph {\n  graph [truecolor bgcolor=\"#333333\"]\n  node [\n    style=filled\n    fillcolor=\"#666666\"\n    shape=box\n    fontcolor=\"#ffffff\"\n    fontname=\"Helvetica\"\n    color=\"#888888\"\n    fontsize=10]\n  edge [ color=\"#FFFFFF\" ]\n\"Long Term\" -> \"App Instance\";\n\"App Instance\" -> \"Session\";\n\"Session\" -> \"URL\";\n\"URL\" -> \"View Port\";\n\"View Port\" -> \"View Component\";node \nstyle=filled\nfillcolor=\"#514a9b\"\nshape=box\nfontcolor=\"#ffffff\"\ncolor=\"#888888\"\nfontname=\"Helvetica\"\nfontsize=10\"MySQL\" -> \"Server Instance 1\";\n\"MySQL\" -> \"Server Instance 2\";\n\"Server Instance 1\" -> \"Session - User 1\";\n\"Server Instance 1\" -> \"Session - User 2\";\n\"Server Instance 1\" -> \"Session - User 3\";\n\"Session - User 2\" -> \"URL \u002Flogin\";\n\"Session - User 2\" -> \"URL \u002Fregister\";\n\"Session - User 1\" -> \"URL \u002Fprofile\";\n\"URL \u002Fprofile\" -> \"Window 1\";\n\"URL \u002Fprofile\" -> \"Window 2\";\n\"Window 2\" -> \"Common Header Widget\";\n\"Window 2\" -> \"User Details Widget\";\n\"User Details Widget\" -> \"Reset Password Widget\";\n}",{"id":3122,"title":3123,"titles":3124,"content":3125,"level":9},"\u002Fstudy-of-hobbs-leviathan","Study_of_Hobbes'_Leviathan",[],"Moved to http:\u002F\u002Faspbc.42t.org\u002FBrock We've started a book club to study political philosophy, and are starting with Hobbes. Here are some random notes.",{"id":3127,"title":3128,"titles":3129,"content":3130,"level":15},"\u002Fstudy-of-hobbs-leviathan#part-i","Part I",[3123],"Mostly setup I think.",{"id":3132,"title":3133,"titles":3134,"content":3135,"level":56},"\u002Fstudy-of-hobbs-leviathan#chapter-6","Chapter 6",[3123,3128],"Defines lots of vocabulary, including Good and Evil. Starts to build a language to talk about the state of nature.",{"id":3137,"title":3138,"titles":3139,"content":3140,"level":56},"\u002Fstudy-of-hobbs-leviathan#chapter-7","Chapter 7",[3123,3128],"About the goals of discourse. Science vs Opinion. Even opinion has some structure, but science has more.",{"id":3142,"title":3143,"titles":3144,"content":3145,"level":56},"\u002Fstudy-of-hobbs-leviathan#chapter-8","Chapter 8",[3123,3128],"Goes on and on about madness. One interesting thing is he talks about group-think -- a nation which is mad where the individuals are only a little mad.",{"id":3147,"title":3148,"titles":3149,"content":3150,"level":56},"\u002Fstudy-of-hobbs-leviathan#chapter-9","Chapter 9",[3123,3128],"Breaks down the areas of knowledge.",{"id":3152,"title":3153,"titles":3154,"content":3155,"level":56},"\u002Fstudy-of-hobbs-leviathan#chapter-10","Chapter 10",[3123,3128],"Power is based on the ability to control people. Which is driven based on the people being controlled -- their willingness to be controlled.",{"id":3157,"title":3158,"titles":3159,"content":203,"level":9},"\u002Ftlt-2003.11.15.23.52","TLT_-_2003.11.15.23.52",[],{"id":3161,"title":3162,"titles":3163,"content":3164,"level":9},"\u002Ftlt-2004.02.19","TLT_-_2004.02.19",[],"More fun with my website. I renamed Brock's Journal to TLT, like I used to call it. I'm not sure if I should call my log that or not. Just calling it my 'log' is boring, I think... suggestions? I should be working on a paper right now... but I'm not. It was due last thursday. Fun. 22:24 - a day later I can't decide what timezone I should post things on... UTC? Local? My previous standard was local... but that always annoyed me for after-midnight posts. UTC is even more annoying, separating day posts from night posts. For now I will stick to local time, but I might eventually change to sunrise = new-day mode. I was right, I should have been working on that paper. I ended up skipping my first class and working on it then. Turned it turned out OK. Now I'm doing it again studying for my math test tomorrow. Here are some theorems for you: Sylow E: $$ Syl_(G) \\ne 0 \\mbox{ if } p | (|G|) $$ Sylow C: $$ Syl_(G) $$ consists of a single conjugacy class. ; Cor: $$ P \\in Syl_(G) $$ $$ P G \\mbox{ iff } Syl_(G) = {P} $$",{"id":3166,"title":3167,"titles":3168,"content":3169,"level":9},"\u002Ftlt-2004.02.20","TLT_-_2004.02.20",[],"I'm finishing up at work. Played around with some CSS with mandies and also worked with Aaron on evil MSAccess. The other day I noticed http:\u002F\u002Fmda This is Mandies, on the twenty-third of the great month of February. Brock left this open on my machine, and I take that as an invitation to finish the entry for him. As much as I hate wikis, I have to admit that Brock's done a \"decent\" thing with his. (That's the highest compliment you'll ever hear me give toward a wiki in their current implementation, by the way, and you should be honored.) I love Brock and Beth. I'm going to follow them around like a puppy dog. That is all.",{"id":3171,"title":3172,"titles":3173,"content":3174,"level":9},"\u002Ftlt-2004.02.21","TLT_-_2004.02.21",[],"Well I changed the calendar to highlight the day in my local time. I might subtract 6 more hours so that it is still \"today\" even after midnight. The jury of my mind is still out on that one. I had too much soda on wedneday, thursday, and friday. Then today I had none (till a few minutes ago) and I've felt pretty bad since thursday. I answered about half the questions on my test in Abstract Algebra yesterday. I figure that since it is one of the hardest undergraduate courses in mathematics available and since there are only 7 people in the class that I am actually doing pretty well. None of the other people are answering every question perfectly as if it were cake or anything... and I can understand everything after I've read it over a few times. Mandie and I went to work together on Friday, which was great since I don't particularly want her to get fired (for lack of attendance) and I don't think she wants to get fired either. We hung out, she ate dinner with Beth and I at Cafe Ole, and then Mandies and I went and watched the third Matrix. Movie wasn't awful -- in fact Mandie's giddiness at how cliche so many parts of the were made it quite enjoyable. I'm working on SetDB today and yesterday. Made progress... can now do two (or more) childsets. Haven't tried more deeply nested childsets yet, so I don't know if they work. I started to work on adding new records and then realized how hard this actually is. The main problem is that when adding a book to a view that looks like 'person -> owns_book -> book' I also have to create an owns_book record and then connect it to the right person. This gets even trickier when I want to add a book and have specified the path, as in ('person', 'owns_book', 'book'). The childset is an interpolation of the owns_book record and the book record, with the owns_book record coming first and thus (as of right now) being listed as the primary table for the childset. Now that I'm thinking about it, another tricky spot I need to keep an eye on is connecting preexisting records together. So if I grab book that one person owns and want to add it to another person it too must add the connecting table. I'm sure all of this can be done... and I'm still sticking to my design-forthe-programmer motto. It is just a matter of figuring out how.",{"id":3176,"title":3177,"titles":3178,"content":3179,"level":9},"\u002Ftlt-2004.02.23","TLT_-_2004.02.23",[],"Work work work. Chris isn't here... I hope he didn't break a leg skiing. Snow abounds so maybe he is just stuck on the other side of some mountain. More importantly -- MY PLANT HAS BEEN STOLEN! I think KC took it over the weekend. It is sad! I want my plant back! Thank mandies for finishing the TLT - 2004.02.20 entry. I think I actually started this entry at work earlier so we will see what happens when two different versions are saved at once... should work magic-like pretty much. While sitting in deep contemplation of The Buddha today in class I realized some things about SetDB which should give me the structure needed to add new data. Basically I realized that 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 this one-link away is in the undirected graph sense, not the complex-set specification sense. So... the schema would be: +--------+      +----------+      +------+      +-----------------+      +----------+\n| person | \u003C--- | has_book | ---> | book | \u003C--- | place_published | ---> | location |\n+--------+      +----------+      +------+      +-----------------+      +----------+ Set Structure:\n(person, book, location) \u003C==> (person, has_book, book, place_published, location) Path:\nperson --> has_book --> book --> place_published --> location 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. Things would be different, however, if we were using: (person, book, location). Here we are interpolating the book and its location into single tuples (so we would possibly have repeated books). More thoughts needed.",{"id":3181,"title":3182,"titles":3183,"content":3184,"level":9},"\u002Ftlt-2004.02.24","TLT_-_2004.02.24",[],"Had people over for Mardi Gras. Was OK though I didn't drink much at all so I wasn't quite as in the spirit as everyone else. I must find a ride to phoenix for the conference and I don't care to take the bus. grr.",{"id":3186,"title":3187,"titles":3188,"content":3189,"level":9},"\u002Ftlt-2004.03.03","TLT_-_2004.03.03",[],"Should be working on Buddha essay. Had a great weekend at the AMUC. Ended up presenting on Sunday instead of Saturday, which was good (when another guy needed to trade times so he could leave early and I volunteered the organizer even said \"must be good karma.\" hmm... brb. OK, got a draft going which Beth is proofing for me (thanks Beth!). She and I have quite different essay-writing styles, mine being quite informal while hers are very well structured, and Dr. Sullivan likes her style a lot more than he likes my style. I'm feeling anxious about getting a job -- IBM turned me down. Back on AMUC. I got to introduce the keynote speaker on Saturday, and that went well.",{"id":3191,"title":3192,"titles":3193,"content":3194,"level":9},"\u002Ftlt-2004.03.06","TLT_-_2004.03.06",[],"Today I got a new CD\u002FMP3 player which I'm having fun with. A long time ago I backed up about 30 gigs of mp3s to CDR disks which have been sitting on my desk ever since, so I had some MP3 cds ready to play with. I just now checked on the net and there are some wonderfully bad reviews of this player and how it breaks very quickly, but also it seems there are two revisions and that I have the second one. So we'll see I guess. You can see the specs if you like. We also saw Starsky and Hutch today. Not as good or funny as Zoolander, sadly. Oh well. It was fun anyway. AND I had an eye doctor appointment and ordered new glasses and contacts. Busy day, eh? I've been working on the Eggplant Farms Panel application. I'm trying to put together ideas I mention in Thoughts and issues with web-based DB programming, though this is not just a web-based DB app. So far it is going swimmingly, as you can see at http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fepfarms-panel\u002F. It is nice to have a project so that I can put some of my ideas into code.",{"id":3196,"title":3197,"titles":3198,"content":3199,"level":9},"\u002Ftlt-2004.03.08","TLT_-_2004.03.08",[],"Flagstaff is so beautiful. I wandered around today trying to take it all in but couldn't. Hmm... time to eat. So Mandie tells me that she reads this sometimes. So mandie... Add a comment! I don't know what to say. I feel myself switching gears as far as what I'm programming goes. This happens every month or so I think. I'm turning my attention once again to Genetic Programming. Ahh yes.",{"id":3201,"title":3202,"titles":3203,"content":3204,"level":9},"\u002Ftlt-2004.03.09","TLT_-_2004.03.09",[],"I noticed a link on Lambda talking about multi language development. That is mixing and matching programming languages in one large project. My nature says \"yeah!\" and that I'm all for it. But then I hesitate... So my two favorite languages, as you may know, are OCaml and Perl. I have on occasion thought about using both of these languages in a single project. This has never happened, however, and for a good reason. These languages are at very opposite ends of the world. Perl is flexible and dynamic and weakly typed. Ocaml is strict and static and strongly typed. Why I like these two languages is another story (see Why I love Perl and OCaml). The point I'm trying to drive here is that it doesn't make sense to me to combine them directly. What ''does'' make sense is to join them in a more abstract way. For example, one of the planned features of OGPF is a remote perl-based user interface for monitoring and controlling the system. This is a different sort of language mixing, and one which I suppose is being addressed more directly in the above article. There are packages such as cpan:Perl::Inline which do the sort of direct mixing I speak of, however. Well... I'm not sure where I am going with this. I'll get back to you.",{"id":3206,"title":3207,"titles":3208,"content":3209,"level":9},"\u002Ftlt-2004.03.11","TLT_-_2004.03.11",[],"I just noticed cpan:SuperPython and am greatly entertained. To really get it you need to look at both the source and the examples! So yesterday I was reading this paper from Tina Yu and noticed a section on Cartesian Genetic Programming. This is an interesting genotype\u002Fphenotype representation using a fixed length integer list as a genotype and a tree as phenotypes. When translating from genotype to phenotype some of the numbers in the integer string don't get used (this is a slight simplification) which makes these points invisible to the fitness test and thus ripe for Neutral Evolution. The main reason this caught my eye is that I thought of something very like this not long ago which has a similar affect. Instead of using an integer string for the genotype I use another tree\u002Fgraph representation with redundant nodes. I almost had myself convinced for a while there that what I had was no better than several genotypes put on top of each other (and that they may as well have been separate). Fortunately I've unconvinced myself and am now thinking of reproducing Tina's (et al) experiment using my own representation. After thinking about it a bit I've realized that my representation (as I remember it anyway) isn't much better than CGP. The biggest difference is that mine leads to a dynamic length of a program whereas CGP has a maximum upper limit. I don't particularly like upper-limits and would much rather put a fitness weight in favor of smaller programs than actually limit length. I'm going to email Tina and ask for clarification regarding the \"type safety\" of the CGP phenotype\u002Fgenotypes esp whether there can be loops of any kind. The one additional advantage of my network-based genotype is overlapping subtrees (which would then get unrolled in the genotype)... though they are probably not so useful in the simple tests she did in her paper.",{"id":3211,"title":3212,"titles":3213,"content":3214,"level":9},"\u002Ftlt-2004.03.12","TLT_-_2004.03.12",[],"Well I'm going to reboot now. Wish me luck! Well from 128mb ram to 576mb. Not bad. Seems ok so far! (famous last words)",{"id":3216,"title":3217,"titles":3218,"content":3219,"level":9},"\u002Ftlt-2004.03.13","TLT_-_2004.03.13",[],"Liz and Jason are visiting. We just returned from a bit of stargazing. Jason and I are going to attempt using Hugin (http:\u002F\u002Fhugin.sf.net\u002F) to make a panorama of the stars. But first I must make it compile. Must sleep.",{"id":3221,"title":3222,"titles":3223,"content":3224,"level":9},"\u002Ftlt-2004.03.16","TLT_-_2004.03.16",[],"Chris called this morning because Mr. T wasn't streaming. Turns out that, besides being turned off, the ethernet was unplugged. The work-gnomes strike again!",{"id":3226,"title":3227,"titles":3228,"content":3229,"level":9},"\u002Ftlt-2004.03.17","TLT_-_2004.03.17",[],"I think I'm lactose intolerant.",{"id":3231,"title":3232,"titles":3233,"content":3234,"level":9},"\u002Ftlt-2004.03.18","TLT_-_2004.03.18",[],"I added a new module for the wiki which tells how many comments have been made on a page. It works by adding text to the actual comments_on_ page and then parsing this. I should, perhaps, be using the actual storage of a page or something for speed... but this seems fast enough to me. I should make sure it works for journal listings... It does! Woo Hoo!",{"id":3236,"title":3237,"titles":3238,"content":3239,"level":9},"\u002Ftlt-2004.03.19","TLT_-_2004.03.19",[],"Today was the 1-year anniversary of the Iraq Invasion. Let's do a compare and contrast exercise. See the following two articles: http:\u002F\u002Fwww.whitehouse.gov\u002Fnews\u002Freleases\u002F2004\u002F03\u002Fprint\u002F20040319-3.htmlhttp:\u002F\u002Fwww.johnkerry.com\u002Fpressroom\u002Freleases\u002Fpr_2004_0319.html The most interesting thing is that Bush focuses on all of the terrorism that we've stopped by invading Iraq. He has also taken to using the word \"Killers\" instead of terrorists, especially when speaking about the recent bombing in Spain. They way he words it one might conclude that the world's center of terrorism was Iraq (which is false). Kerry, on the other hand, is backpedaling. He voted for the war and now he is trying to get out of it... “He misled the American people in his own State of the Union Address about Saddam’s nuclear program and WMD’s, and refused – and continues to refuse – to level with the American people about the cost of the war. Simply put, this President didn't tell the truth about the war for the beginning. And our country is paying the price.\" This does not redeem his vote in my mind, however. It seems like it was a bad idea even when we were being misinformed. 00:12 Well spring break is almost over. Very sad... I've been enjoying my freedom. The senioritis bug is nibbling at my toes (though i'm trying very hard to beat it back) and I am looking forward to taking a break from school. After 18 years (if you include kindergarten) I think I deserve a bit of a break. But school is not over yet. So tomorrow my plan is to go over all my books and study a bit. Make sure I don't have any homework due and such. Productive like. We're also going to go see a movie I think... probably just Beth and I which will be nice. I added a pingback module for oddmuse (see OddMuse Pingback) which is fun and all but now I realize that nobody uses pingback. They hardly use trakback. How sad... they are such good technologies. sigh Time for bed!",{"id":3241,"title":3242,"titles":3243,"content":3244,"level":9},"\u002Ftlt-2004.03.20","TLT_-_2004.03.20",[],"Only one more day of spring break remains :(",{"id":3246,"title":3247,"titles":3248,"content":3249,"level":9},"\u002Ftlt-2004.03.21","TLT_-_2004.03.21",[],"I. Don't. Want. To. Go. To. School. But I will anyway. Tomorrow.",{"id":3251,"title":3252,"titles":3253,"content":3254,"level":9},"\u002Ftlt-2004.03.23","TLT_-_2004.03.23",[],"http:\u002F\u002Fnews.bbc.co.uk\u002F2\u002Fhi\u002Famericas\u002F3561165.stm Sheesh. 12:32 Just got back from my Women's Studies (WST) course. Very depressing. We talked about \"comfort women\" in Japan... Korean and other women who were sex slaves to the men on the front line (against their will). Not to say that Japan is the only ones to do this, of course. We watched a movie which turned my stomach. 20:51 We went to the store and got food stuff. While there I saw one of those lighters with the long necks and decided to get it... we have candles which end up being pretty deep and it would be easier with such a tool. But then when we got home and I tried it out I realized that I had purchased a flame thrower! I think this is an anti-wind thing, but it is pressurized and makes a hissing sound as it wooshes the flame to a sharp point several inches away from the tip of the lighter. It is very scary!",{"id":3256,"title":3257,"titles":3258,"content":3259,"level":9},"\u002Ftlt-2004.03.24","TLT_-_2004.03.24",[],"LOL. From http:\u002F\u002Ffreshmeat.net\u002Fprojects\u002Fsnowpath Snow Path Formation Simulator 0.5.2 (Default) by Matthew Strait\nSnow Path Formation Simulator is a program that models the process of people forming very distinct, and yet not always altogether logical looking, paths in the snow as they walk across open spaces. The evolving condition of the snow is displayed graphically. This project may eventually mature into a screensaver.\n(Emphasis added). I should put that last line at the end of all of my projects!",{"id":3261,"title":3262,"titles":3263,"content":3264,"level":9},"\u002Ftlt-2004.03.25","TLT_-_2004.03.25",[],"Here is a lovely document: Microsoft on OpenOffice.",{"id":3266,"title":3267,"titles":3268,"content":3269,"level":9},"\u002Ftlt-2004.03.30","TLT_-_2004.03.30",[],"Happy Birthday, Chris! We (Brock, Beth, David) are over at Chris' to sing happy birthday and watch \"The OS Revolution.\" Wireless in the kitchen.",{"id":3271,"title":3272,"titles":3273,"content":3274,"level":9},"\u002Ftlt-2004.04.01","TLT_-_2004.04.01",[],"It's raining... smells so nice. Beth is gone already and I will be joining her tomorrow. Mike is back from Iraq and we are going to Phoenix to visit him and welcome him home. I think I'll do some meditation and then go to bed. Long day tomorrow.",{"id":3276,"title":3277,"titles":3278,"content":3279,"level":9},"\u002Ftlt-2004.04.02","TLT_-_2004.04.02",[],"I think I've finally figured out how to get a 'recent songs' list for http:\u002F\u002Fwww.kjack.org\u002F. The software they use doesn't have this feature, but it does have an error log which will mention what file name was just played. Unfortunately this filename is something like MUS00032.MTS, which scary and says nothing about the artist or anything. Fortunately these files are mp3s. Unfortunately they do not have id3 tags. Fortunately I found their DB which stores the translation guide -- the artist and title to the filename. Unfortunately it is a proprietary format. Fortunately I can read it without too much trouble. Unfortunately all this crap is on the wrong computer And finally -- the breakthrough that I just realized -- I am fortunate enough to completely control the server now. Which means that I can do such whacky things as mount samba shares! So all I have to do is share the right couple spots of the drive over samba and then I can have a script rip out the appropriate bits from the two files. Neato, eh?",{"id":3281,"title":3282,"titles":3283,"content":3284,"level":9},"\u002Ftlt-2004.04.05","TLT_-_2004.04.05",[],"See http:\u002F\u002Fdaringfireball.net\u002F2004\u002F04\u002Fspray_on_usability This is a great article which brings to mind several important and good thoughts. John Gruber There’s an old engineering adage: “Fast, good, cheap: pick two.” (Where “fast” regards development time, not performance.) Desktop Linux software is cheap (free) and fast (release early, release often), but it’s not good.\nOr, perhaps one could argue that it is cheap, and eventually it’s going to be good, but it’s getting there very slowly.",{"id":3286,"title":3287,"titles":3288,"content":3289,"level":9},"\u002Ftlt-2004.04.14","TLT_-_2004.04.14",[],"Before I forget... the coolest thing I've learned in my math history class is that $$\\sin\\left(\\frac{\\pi}{2} - \\ln(\\sqrt{3} + 2) \\cdot i\\right) = 2$$. Please see for yourself on your TI-89 (and I'm sure others... I tried the 83+ and it couldn't hang with the complex input to sin). I'm working on a take-home mathtest. Notes and the test. Fun stuff, eh?",{"id":3291,"title":3292,"titles":3293,"content":3294,"level":9},"\u002Ftlt-2004.04.18","TLT_-_2004.04.18",[],"And who says perl error messages are not accurate? Time::HiRes::sleep(-0.185915): negative time not invented yet So today I am still working on my math test (and a Buddha essay too, actually). It's kind of stressful because I'm not quite halfway done yet and am additionally feeling kind of ill. But I trudge on! Talked to the Principal Software Engineer over at Open Ratings about their \"Data Processing Algorithm Developer\" position. I'm really excited about it because I'd get to do one of my favorite things -- develop algorithms and APIs the way that ''should'' be done. I might even fly out there for an interview soon. Oh My God. I just now decided I should learn more about the latest fad, \"Aspect Oriented Programming\" (AOP). I started with http:\u002F\u002Fwww.onjava.com\u002Fpub\u002Fa\u002Fonjava\u002F2004\u002F01\u002F14\u002Faop.html which seems like a reasonable introduction. Let me give you a summary... AOP is a giant HACK (and not in a Right Thing sort of way). They invent some vocabulary which, so far as I can tell at this point, inserts hooks into pre-existing code. That way you can run some ''new'' code at the entrance or exit of a method... or insert a new initializer or destructor. Again, from what I understand, it does this at the JVM level (for java, anyway) so that you can do this in pre-compiled code if you so desire. The argument for AOP is that you can add orthogonal functionality to programs transparently. In the article above, for example, they mention being able to add a nice logging facility to existing code. The code itself shouldn't have to deal with logging as that is not its purpose, so they create these sort of hooks to add that functionality without cluttering code. Such functionality could also be added in a matter of minutes instead of the hours it might take to insert this code into the actual flow. I would now like to take this time to say that THIS IS THE STUPIDEST THING OF WHICH I HAVE EVER HEARD! I cannot imagine that this could possibly lead to ''better'' programs... instead I imagine programs which become harder and harder to follow and understand and debug. Harder then spreadsheets even! This is simply a very very bad idea. If there is anyone out there who can shed some light on why anyone might actually want to use this evil crap please let me know! I am very curious!",{"id":3296,"title":3297,"titles":3298,"content":3299,"level":9},"\u002Ftlt-2004.04.21","TLT_-_2004.04.21",[],"So I got a response back from Dmitry (Dima) from http:\u002F\u002Fopenratings.com. He asked me to solve a little problem so he could get a feel for my background -- decide whether a given datastructure is a proper BST (Binary Search Tree). He preferred C but said another language would be OK. So here is my solution in C and here is my version written in OCaml. The OCaml version took me all of 5 minutes (if that), but the C version took me longer to get all my pointers and such correct... I guess if you don't use it you lose it. Feedback is welcome. I am quite rusty on my C!",{"id":3301,"title":3302,"titles":3303,"content":3304,"level":9},"\u002Ftlt-2004.04.26","TLT_-_2004.04.26",[],"http:\u002F\u002Fmagnatune.com\u002F - \"We're a record label. But we're not evil.\" I like their motto.",{"id":3306,"title":3307,"titles":3308,"content":3309,"level":9},"\u002Ftlt-2004.04.27","TLT_-_2004.04.27",[],"If you want a few minutes of fun, go to froogle.com Now hit refresh. Then hit it again. and again. As you hit refresh be awed by the list \"A few of the items recently found with Froogle:\" ... it is amazing what people are looking for.",{"id":3311,"title":3312,"titles":3313,"content":3314,"level":9},"\u002Ftlt-2004.04.30","TLT_-_2004.04.30",[],"This is a partial journal page test. -- cut -- And this should not be displayed on the summary (journal) page!",{"id":3316,"title":3317,"titles":3318,"content":3319,"level":9},"\u002Ftlt-2004.05.01","TLT_-_2004.05.01",[],"Well I set Jill up to be my primary computer and turned off Feline. All part of getting ready for the move. So now that I have no music I decided to turn KJACK into my personal jukebox (thank god for VNC). Got a bunch of boxes for books, so we're almost done with that. Liz is visiting. She and Jason are fighting but she has a bunch of schoolwork to do so she stole his car and came up here. Adam will be here soon to visit (for the week pretty much). We are going to hike the canyon a bit on Monday together, which I'm looking forward to. The most important things that I have left are: Abstract Algebra Test. Abstract Algebra Essay. Abstract Algebra Homework. Human Rights Research. Light study for Buddha test. Study for Math History test. Not bad.",{"id":3321,"title":3322,"titles":3323,"content":3324,"level":9},"\u002Ftlt-2004.05.04","TLT_-_2004.05.04",[],"If you've ever wondered about Fedora (the Redhat derivative), Adam found the perfect explanation: http:\u002F\u002Fwww.redhat.com\u002Farchives\u002Ffedora-devel-list\u002F2004-May\u002Fmsg00104.html I'm studying for my Buddha test. Liz asked me what sort of religious or spiritual beliefs I have, especially in regard to Buddhism and Taoism. I started to explain a bit and inadvertently came up with a new concept of 'soul' -- that souls are really just a person's Gravitons. Adam encouraged me a bit. So now  I'm developing a new philo-religion based on this concept. See Gravitonism.",{"id":3326,"title":3327,"titles":3328,"content":3329,"level":9},"\u002Ftlt-2004.05.05","TLT_-_2004.05.05",[],"Here is a nice quote I picked up from http:\u002F\u002Fwww.bagley.org\u002F~doug\u002Focaml\u002FNotes\u002Fokoans.shtml. Michel Mauny was giving a guest lecture to new computer science students. After the students were seated, Michel pronounced \"Today's lecture will be about Lazy Evaluation\", he paused for a moment then concluded with, \"Are there any questions?\"",{"id":3331,"title":3332,"titles":3333,"content":3334,"level":9},"\u002Ftlt-2004.05.10","TLT_-_2004.05.10",[],"Well, I'm in Worcester (at Beth's Brother's house), MA. It's beautiful here. Tons of green. My flight was uneventful, so generally good. Kinda mad at travelocity since they let me choose which seat I wanted for the flight when reserving the ticket, but then I got a completely different seat on check-in. Rob (aka Bob) and Patty picked me up at the Boston airport. Went by shuttle then by subway to downtown Boston. Patty does not like subways. From there we walked to the car and drove the scenic route along highway (route, road, whatever) 9. Like I said, tons of green. They live in a two-story condo, two bedrooms and two bathrooms on the bottom, livingroom, den, kitchen on the top. Worcester is a little more spread out than Boston itself, but we are in a spot where we can walk to a few things. Today I walked for 45 minutes to a bookstore, where I bought a Dan Brown book (not to be confused with Dan Bern), Digital Fortress, ISBN 0312263120, which is good so far. The real exciting stuff starts tomorrow. I will pick up a rental car early in the morning, and then my interview for http:\u002F\u002Fopenratings.com is at 2pm. I must also add that I'm renting from Budget Rent A Car. All the others wouldn't rent to me. Dan Bern was right! I miss Beth, and she misses me... but we haven been talking to each other regularly so it is going good so far. I look forward to her joining me though.",{"id":3336,"title":3337,"titles":3338,"content":3339,"level":9},"\u002Ftlt-2004.05.15","TLT_-_2004.05.15",[],"I'm having great fun with the Graph Module. Now I can do things like this.\ndigraph {\n\"Wake up\" -> \"Get dressed\";\n\"Get dressed\" -> \"Go eat\";\n\"Go eat\" -> \"Look for job\";\n\"Look for job\" -> \"Get job\";\n\"Get job\" -> \"CELEBRATE!\";\n}\nWhich is probably more fun than you imagine. Unfortunately this particular flow chart has not yet come to fruition. I have another part of the interview next week, I think with Stan but I'm not sure. I've continued to apply at other places but so far nobody is jumping out of the dark corners begging me to come work for them. Yet. It's very nice here. Green and slightly humid. You should join me.",{"id":3341,"title":3342,"titles":3343,"content":3344,"level":9},"\u002Ftlt-2004.05.17","TLT_-_2004.05.17",[],"Today is Beth and my 1-year anniversary! Sort of sad since we aren't together today... but we will be together soon and celebrate :) No word back from Dima yet... I hope to interview ASAP so that this can be final (one way or another). Today I'm hitting the job applications extra hard as a backup plan. As Rena or Adam or someone said... it's easier to not have a job or have a job than to be looking for a job. While I was searching I ran across the Worcester Computer Co-Op (http:\u002F\u002Fwww.worcestercoop.org\u002Findex.html) which I think is super-cool. If I ended up around here I would definitely donate some time there. They even use debian :) So there is a post on Craig's list, http:\u002F\u002Fboston.craigslist.org\u002Feng\u002F31160135.html, and I am trying to decide whether it is serious or not. It's for a web developer -- PHP expert and knows lots of other things like C++. Then it says \"The job is full-time. You’ll spend approximately 20 to 30 hours a week as a developer and the remainder of your time filling out other critical roles within the organization: mail room, running errands, answering phones, light cleaning, etc.\" hmmm....",{"id":3346,"title":3347,"titles":3348,"content":3349,"level":9},"\u002Ftlt-2004.05.19","TLT_-_2004.05.19",[],"Heard back from Dima - he says it is crazy around there and he will hopefully be able to tell me (tell me when I can come meet, I assume) on Friday. Though perhaps he meant he can tell me if I have the job. Wouldn't that be nice? I've been applying for lots of Jobs... full customized cover letters and everything. I'm very tired of it. I miss Beth. I'm lonely without her, even though I have people here to hang out with. Lightyears away from being the same as having Beth. :(",{"id":3351,"title":3352,"titles":3353,"content":3354,"level":9},"\u002Ftlt-2004.05.22","TLT_-_2004.05.22",[],"Today was OK. Hung out with Rob which was nice. But I miss Beth.",{"id":3356,"title":3357,"titles":3358,"content":3359,"level":9},"\u002Ftlt-2004.05.24","TLT_-_2004.05.24",[],"Here is today's JAPH: I am very pleased about it. Probably version-dependent... it's trick is to use Perl's error messages as data to transform.",{"id":3361,"title":3362,"titles":3363,"content":3364,"level":9},"\u002Ftlt-2004.05.25","TLT_-_2004.05.25",[],"Deep Thoughts of the day: What will they call paperwork when there is no more paper? Finally communicated with Dima today. Said he would be able to tell me something definitive on Friday. Good news... having a timeline is good. Hopefully he will hire me and then Beth can come out and we can get going. I feel like I'm in purgatory... hard to do since the Catholics threw it out. Everything Zen. I'm trying out the EditCSS extension for FireFox and would just like to say that IT ROCKS. Oh... and this is the 42nd TLT-wiki entry! It's a magical day!",{"id":3366,"title":3367,"titles":3368,"content":3369,"level":9},"\u002Ftlt-2004.05.27","TLT_-_2004.05.27",[],"The new battery that Chris bought me as a graduation present came yesterday. It is slightly bigger than I expected (2600mAh instead of the 1400mAh which I had before). I charged it up all night and then tested it this morning. I ran at full LCD brightness and a pretty steady 25% CPU load from fully charged to completely dead (I let Jill die). I began the test at 6:13 and the battery died at 8:28... 2 hours and 15 minutes. This is WAY better than I imagined! Once it is charged up again I'm going to do a low-brightness and low-cpu test. Oh, and the USB netgear MA111 wireless card which I got to work is randomly making the machine lock up when switching from wall-power to battery-power (unrelated to the new battery). 13:11 I wish I could tell how much a specific device drains the battery. I am wondering if I should run my test with the USB-wireless disconnected. Hmm. 21:49 And here I am outside of Rob & Patty's house. This battery lasts almost 3 hours under normal usage is my conclusion. I'm a happy duck! I talked to Dima and I am going in tomorrow afternoon to talk about an offer they will give me. Very good news.",{"id":3371,"title":3372,"titles":3373,"content":3374,"level":9},"\u002Ftlt-2004.05.28","TLT_-_2004.05.28",[],"Well I got the job at http:\u002F\u002Fopenratings.com\u002F -- a very good thing since now I can actually be here permanently and have beth and the rabbit come out and all that. I'm VERY HAPPY! I went in earlier today and talked to Dima, looked around the place and all that. They should send out the official offer letter soon, and I should start on June 7th. Happy days! Now I can spend the next week doing nothing and enjoying it. Well... finding a place to live and a way to get to work and all that. But still. I can already feel myself typing faster.",{"id":3376,"title":3377,"titles":3378,"content":3379,"level":9},"\u002Ftlt-2004.05.29","TLT_-_2004.05.29",[],"I had a great idea today. Remember Quantum Leap? Well... I think that all of the shows that are on now, everything from malcom in the middle to The Sopranos to The Simpsons, should have a special 'Quantum Leap' episode in which one of the main characters gets leapt-into! Rob and I went to Waltham (pronounced wall-thahm (ah like apple)) today looking for apartments for me and Beth. They were all pretty expensive and none of them had any immediate openings for what we wanted. But then we were driving down one street and saw a house with a rent sign. One of those houses where there are multiple apartments in the place. Well I went ahead and called and it was within the price range and bigger (two-bedroom) than I expected. So Rob and I got the guy to meet us there and took a tour. It is no fun to take a tour of a place when there are already people living there... especially when they are moving out so their stuff is all over the place. The place has a lot of character in that it is quite maze-like. This is a plus in my eyes. Maybe I'll draw you a diagram later. The whole place is 3 stories high, and our apartment would be spread across the 2nd and 3rd stories -- I imagine taking up one side of the building or so. In fact I'm trying to even picture it now and I can't quite describe it. Well in any case the kitchen, living room, and a bathroom are on the 2nd floor. Then above that, on the third floor, is two bedrooms, another bathroom, and a strange sort of storage room. The place seemed a bit on the worn side, but I think that impression was at least partially due to the current occupants. Well, that was the best place we found so we're going to take it. Tomorrow afternoon Rob'll take me over and I'll sign paperwork and give him a last-month deposit. He is going to re-paint the place this week and I'll move in next weekend. I start work that week and hopefully Beth will join me the following weekend. Exciting!",{"id":3381,"title":3382,"titles":3383,"content":3384,"level":9},"\u002Ftlt-2004.05.30","TLT_-_2004.05.30",[],"Signed the paperwork and everything looks good. I'll move in next Sunday. I'm looking forward to our life at 59 Bacon :)",{"id":3386,"title":3387,"titles":3388,"content":3389,"level":9},"\u002Ftlt-2004.06.02","TLT_-_2004.06.02",[],"Just spent the afternoon wandering down to the Tatnuck Bookseller, about two miles away. Pretty nice place... though no free wireless. I think they had paid wireless. Don't know enough to hack it... looked like a borked IP grabbing trick. So today is Wednesday... then Thurs, Fri, Sat, then I move in to my new place, then I start my new job. It's getting close. Worked on SetDB while I was there. Finished up my graph module integration which clarified the code quite a bit. Now I need to clean some other existing code. I'm working on adds... I had them going once but only simple ones. I think I know how to do complex adds now. Then I will go back to EPFarms Panel development and perhaps write a SetDB::WebWidget module... this would act like the dbform stuff I did for PHP. Except better.",{"id":3391,"title":3392,"titles":3393,"content":3394,"level":9},"\u002Ftlt-2004.06.05","TLT_-_2004.06.05",[],"Yesterday went to Harvard with Patty and today went with Patty and Rob to the Aquarium. Both were nice little trips, and I got some photos (which I will put up someday). Oh, and yesterday we went by 59 Bacon and I got some [Man smashes town with homemade tank](http:\u002F\u002Fthelackthereof.org\u002F [http:\u002F\u002Fwww.washingtonpost.com\u002Fwp-dyn\u002Farticles\u002FA18948-2004Jun5.html) is a great article. Basically this guy lived in a small town and was mad at a bunch of people. This was mostly due to a zoning issue -- they built a concrete plant across the street from his small business against his vote. So a few years later he had lost his business, was in significant debt, and then his house burned down taking his snowmobile with it... he just snapped. Fortunately for him he happened to have a bunch of metal plating and a 53-ton Caterpillar D9 bulldozer... he put two and two together and got a tank. Then he drove through the cement factory, through city hall, completely leveled the newspaper building, and finally smashed into the department store. The department store had a basement or something which the front end of his tank fell into, getting him stuck. That was 4:30 on Friday... cops worked all night with welders and small explosives to open the tank and when they finally did it appears he had committed suicide. A sad end to a sad day. Adam set me up on lj as a syndication! See (or add) http:\u002F\u002Fwww.livejournal.com\u002Fusers\u002Ftlt_feed\u002F.",{"id":3396,"title":3397,"titles":3398,"content":3399,"level":9},"\u002Ftlt-2004.06.06","TLT_-_2004.06.06",[],"Moved in to 59 Bacon today -- discovered that a neighbor in a nearby house has open wireless :) The place has now been painted and cleaned and all the junk that was in here last time is gone... and now it is fantastic. It has a sun-roof in the bedroom and hardwood floors in parts and a dishwasher and a freaky-room and all sorts of things. And then to top it all off I discovered the wireless. I'm a happy duck!",{"id":3401,"title":3402,"titles":3403,"content":3404,"level":9},"\u002Ftlt-2004.06.07","TLT_-_2004.06.07",[],"Just had a lovely time on http:\u002F\u002Fperlmonks.org\u002F reliving redneck moments while listening to BootLiquor (House Of Mercy Band - Sunny Georgia). Today I went with Judy to the harvard area. We ate and wandered and hung out and talked. Before that she came over here and saw our new place, which she liked. Very good day. Road the train\u002FT and wandered around local Waltham a bit more. Still haven't gone to the library (will do that tomorrow). Oh, and while on perlmonks saw the greatest haiku: Warm and humid night\nHole in the screen; my cat and\nI - both chasing bugs. It's just beautiful.",{"id":3406,"title":3407,"titles":3408,"content":3409,"level":9},"\u002Ftlt-2004.06.10","TLT_-_2004.06.10",[],"Well... bad news. I had to abort the mission here in Boston. Yesterday Giorgos called me and said that they will no longer be hiring me. This was quite shocking of course (I'm still in shock a day later)... but it had very serious implications about my ability to maintain financial stability. My choices boiled down to two things -- either stay, Beth joining me, get a job as quickly as possible (which almost definitely means a crappy job, same for beth), and make just enough money to pay rent and eat. Sustain. Perhaps I would find a better job than expected, or more likely I would continue looking for a good job while I worked at the crappy one. Second plan is to pull back completely, get out of my lease and go back to Tempe (Beth's parents' house) where we will be more financially stable and I could then begin searching again. Most likely I'd spread my search to be nationwide, or at least bigger than just-boston. A sub-part of this plan would be to stay at Rob&Patty's house and continue a job hunt locally... but this is nearly equivalent to going to Tempe except without Beth (and I miss her!). Actually it would also mean continuing to spread Beth and my finances between two locations. After talking to Beth and friends and family we decided to go for the second plan. Thus an abort-mission was called... I talked to Paul, my landlord, and he was very understanding and let me out of my lease. Beth is not going to fly out here on Saturday, instead she is going to get airline credit and I will fly back to Phoenix this weekend or next. I've already put myself back on the job market via Adam and Andrew (and am now re-subscribing to some job hunt mailing lists). My reluctance to purchase a car seems to have paid off yet again.... no need to worry about that. I'm very very very VERY disappointed... besides the slowness (and apparent financial instability) of Open Ratings, I was really looking forward to that job. It was a wonderful match for both of us and I sincerely hope that one day they realize what a great programmer they have now lost :). So what happened is this: They recently acquired Gentia (a similar company based in the UK). Gential's sales turn out to be a third of what they thought. So they transferred one of the programmers from that organization into the position I was going to fill. I technically had only a verbal agreement with them, so they dropped me. They've effectively cost me around $1500 cash and who knows what in lost time... and certainly some emotional trauma (Adam said he'd never heard me so angry). But I'm far from crushed. If any of you have a lead on a job for which I am applicable (I can do any type of programming there is, though of course there are some types which I am currently stronger with) let me know!",{"id":3411,"title":3412,"titles":3413,"content":3414,"level":9},"\u002Ftlt-2004.06.13","TLT_-_2004.06.13",[],"Well the abort-mission was really fast. I am now in Beth's house in Tempe, using the wireless her dad installed for me. I'm feeling a lot better... not so angry anymore. My job search continues. I will miss 59 Bacon though!",{"id":3416,"title":3417,"titles":3418,"content":3419,"level":9},"\u002Ftlt-2004.06.17","TLT_-_2004.06.17",[],"And here I am back in Tempe. Job hunting.",{"id":3421,"title":3422,"titles":3423,"content":3424,"level":9},"\u002Ftlt-2004.06.22","TLT_-_2004.06.22",[],"Well openratings reimbursed me for my plane flight and car rental, which was nice of them (though a bit short of the $1200 rent I wouldn't mind them covering). I have leads with VMWare, LLNL, and ''maybe'' Novell... in addition to a bunch of other applications. So things on that front are going pretty well. I need to pop over and see Rena (and Mario! and Carlos!) but I keep getting distracted. She is probably pretty busy anyway though.",{"id":3426,"title":3427,"titles":3428,"content":3429,"level":9},"\u002Ftlt-2004.07.01","TLT_-_2004.07.01",[],"I posted this to http:\u002F\u002Fperlmonks.org, but nobody seems to have read it. So I thought I'd put it here too. It was in the context of a discussion on breaking code into subroutines, http:\u002F\u002Fwww.perlmonks.org\u002Findex.pl?node_id=368279. There are many more reasons to separate code into subroutines (and modules) than what you have listed. In fact, it sounds like both of your points are actually the same thing -- the chunk of code in question is going to be called multiple times or somehow used in multiple ways (by \"re-use\" I'm guessing you mean in other projects... so perhaps describing that as being used in multiple ways is a stretch... but bear with me here). I believe that this might be the reason subs were invented in the first place, but very soon afterward the ancients became aware of yet another purpose for subs. Thus were discovered the offering of Organization and Structure to the Gods. A good program reads like a good book. A good book has a nicely structured table of contents, footnotes and references to other works, and references to other sections in the book itself (and a good index!). There is a certain balance to be struck when dealing with references, however. Too many and it will be a dry read with a footnote after every third word. Too few and some connections will be lost upon the reader. Sometimes, however, it is not appropriate to refer to other pieces of the book. It may not be appropriate to call some organizational subroutines in your code more than once. The table of contents is still very important, however, and breaking your big sub into many smaller subs (or even modules) will not only appease the gods, but it will also make your program a better read. Your big sub should become the table of contents, and reading the little subs you create from it is the text itself. I would say that a run-on subroutine suffers from the same disease as a book with no table-of-contents... something which no number of comments in the code can fix (unless of course the comments themselves break things into sections and lay them out like a table of contents... but as an ancient once said, \"Do not say something in a comment which you can say clearly in code.\")",{"id":3431,"title":3432,"titles":3433,"content":3434,"level":9},"\u002Ftlt-2004.07.06","TLT_-_2004.07.06",[],"So I keep wanting a shorter domain name... but keep putting it off. Well today Beth's mom took beth@thelackthereof.org off of Beth's resume because it looked \"unprofessional\" so I've decided to bite the bullet. Here are some ideas: tlt42.org42t.orgtao42.org",{"id":3436,"title":3437,"titles":3438,"content":3439,"level":9},"\u002Ftlt-2004.07.14","TLT_-_2004.07.14",[],"Well Mirabel's harddrive went down a bit so we had to move all of her services to pointless. Not fun. But amazingly here I am... tlt is back up and running already (once DNS reaches you). I lost two pages but no real work (some stuff about Contize). David and I stayed up late last night moving things. It's probably not perfect but it seems to be a wonderful temporary solution. Good Comments on TLT - 2004.07.01 by Filmil. So PHP5 was released this morning, and after a very brief investigation I found that Contize can be implemented for it using the new __call method for objects... looks like it will have to be a proxy object thingie just like the perl one (intercepting method invocations, doing some magic caching, all that jazz). Pointless (machine we are using instead of Mirabel) is a slow but steady beast. We got just about everything running on it now. Looks like it's harddrive failure, so we will get a new one, reinstall here, and then send it to the colo, and they will put it in the box for us. They're quite nice.",{"id":3441,"title":3442,"titles":3443,"content":3444,"level":9},"\u002Ftlt-2004.07.15","TLT_-_2004.07.15",[],"I'm having a wonderful time with friends!",{"id":3446,"title":3447,"titles":3448,"content":3449,"level":9},"\u002Ftlt-2004.07.19","TLT_-_2004.07.19",[],"(Extracted from an email to David) So I've been thinking about doing web programming using the new\napplication-oriented technique (Contize). One thing that I have to deal\nwith is breadcrumbs. In their current incarnation, and as they are used\non most sites, breadcrumbs embrace the idea of state management, in\naddition to being useful navigation guides. What I've realized is that\nby clicking on a breadcrumb item you are in effect doing two things.\nFirst you are canceling the current operation, and second you are\nreturning to a previous state. I think that I will try to make it more apparent that this is happening.\nImagine that you are in the accounting module, in a person's details,\nediting a transaction for that person. Your breadcrumb looks like: Main -> Accounting -> User (awwaiid) -> Transaction (#1175) and you click on \"Main\". What I suggest is that this implies not just\njumping to the main page, but also 'exit'ing all of intermediate stages.\nThis is the whole 'goto considered harmful' thing I believe... instead\nof just doing a GOTO Main I want to do a 'exit until you get to main'. The implication is, however, that any of the intermediate stages of the\nexit could take control. They could, for example, prompt for a\nconfirmation to cancel changes. If the user then chooses not to cancel\nthen the request to exit to the Main area is ceased. Each intermediate\nstage doesn't really care that we want to go back to Main, rather they\ncare that you want to exit them and they must take care of that request. As I've mentioned elsewhere... wrapping my head around this \"simplified\" method of web development is difficult and fun.",{"id":3451,"title":3452,"titles":3453,"content":3454,"level":9},"\u002Ftlt-2004.07.26","TLT_-_2004.07.26",[],"I'm very excited... I got my first module on CPAN, cpan:Contize I've also gained tons of ground on the EPFarms Panel. I've been very productive.",{"id":3456,"title":3457,"titles":3458,"content":3459,"level":9},"\u002Ftlt-2004.07.29","TLT_-_2004.07.29",[],"Hanging out in Livermore, interviewing. Great fun. Free LAN at the hotel :) Mirabel is back! And the panel is in beta-testing and will soon be in production  (for at least some of the modules). Everybody thank david.",{"id":3461,"title":3462,"titles":3463,"content":3464,"level":9},"\u002Ftlt-2004.08.14","TLT_-_2004.08.14",[],"I'm still alive. Doing some contract work for http:\u002F\u002Fwww.norchemlab.com\u002F in Perl which is fun. More details on my life to come soon as I get back into the habit of posting here. OK, let's consider the web framework that I've put together for the panel. First of all it is Model-View-Controller. The Model is based on Class::DBI, which I hope to someday have some lovely SetDB wrapper. The View is a thin wrapper around cpan:Embperl. And finally, the Controller is straight perl programming with the aid of Contize. Right now all three are separate, and I like it that way, but I am starting to think of ways to blend them together more efficiently. So, for example, I wrote a lovely method called dispTemplate which is used like this: Actually I am using two helper methods here -- dispTemplate displays a template and returns the query string, and saveRecord extracts the appropriate variables from $f to put into $person. There are a lot of advantages to this style, from readability in code to editability for the template. Another thought I have is using OCaml instead of Perl as the language. OCaml has continuations, and we can certainly implement high-level DB and templating techniques there too. Perhaps all the pieces aren't in place yet... but let's imagine what it will look like once they are all in place. This code would be even prettier if OCaml had a better hash syntax, like f{\"action\"} instead of Hashtbl.find f \"action\". But whatever. Here you can see that the actual code which makes up the controller aren't all that different between the two languages. I'd also make a template language which is identical to my current Embperl solution. It would be HTML (or whatever plaintext-based stuff you want) with two types of markup. * ... ocaml code ... * for raw code, and + expression + for inserting the result of an expression. Though I suppose I'd have to take typing into account. grr. Which is why I'm doing it in Perl, not OCaml. Well. Though I am on some sort of a roll, typing-wise, I think it is best if I go to bed now. Besides, I might get carried away here and stay up all night... which would be fine if we weren't going to breakfast with the Kleizers and also visiting Beth's Grandma tomorrow. Doot do doo.",{"id":3466,"title":3467,"titles":3468,"content":3469,"level":9},"\u002Ftlt-2004.08.16","TLT_-_2004.08.16",[],"Hm. Don't mind me, I'm just working on an email TLT poster.",{"id":3471,"title":3472,"titles":3473,"content":3474,"level":9},"\u002Ftlt-2004.08.19","TLT_-_2004.08.19",[],"Everything Perl. http:\u002F\u002Fwww.timetravelfund.com\u002F -- makes a great gift!",{"id":3476,"title":3477,"titles":3478,"content":3479,"level":9},"\u002Ftlt-2004.08.22","TLT_-_2004.08.22",[],"So I'm learning about Answer Set Programming and some other prolog-like things... my thought is that I might be able to teach Vladimir a thing or two about logical deduction :). I feel like I'm way behind on this material, but no time to start like the present. http:\u002F\u002Fwww.tcs.hut.fi\u002FSoftware\u002Fsmodels\u002Fhttp:\u002F\u002Fwasp.unime.it\u002F",{"id":3481,"title":3482,"titles":3483,"content":3484,"level":9},"\u002Ftlt-2004.08.23","TLT_-_2004.08.23",[],"A friend once told me that you can put a person into one of two categories -- a Beetles Man or an Elvis Man. I told him that this was stupid and that he couldn't force me to choose one or the other and that it wasn't right to put people into such categories. The topic has come up from time to time since then (Brock's First Law and all)... and each time I pretty much say the same thing. Just now I was listening to http:\u002F\u002Fwww.bootliquor.com\u002F radio, and something suddenly became very clear to me. I am an Elvis Man.",{"id":3486,"title":3487,"titles":3488,"content":3489,"level":9},"\u002Ftlt-2004.08.27","TLT_-_2004.08.27",[],"I've said it before and I'll say it again, I love the Yucca Tap Room. We went over there last night... figure that it would be our last evening spent here while not packing for a while. Jason, Liz, Beth, and I. Played shuffleboard and drank cheap beer... live band after a bit. First this one guy played alone, good player but made some awful comments and jokes. Then a full band got on and played some nice loud rock stuff. It's the kind of bar I'd hang out in if I was an alcoholic or was always avoiding my wife.",{"id":3491,"title":3492,"titles":3493,"content":3494,"level":9},"\u002Ftlt-2004.09.13","TLT_-_2004.09.13",[],"Howdy. I'm back! We're all moved to Flagstaff and in our new apartment. Things are going wonderfully... workin and playin and all that. I got a VOIP phone from http:\u002F\u002Fpacket8.net which is fun to play with. Ended up doing some QOS and I will post the method here sometime. Just a brief update.",{"id":3496,"title":3497,"titles":3498,"content":3499,"level":9},"\u002Ftlt-2004.09.20","TLT_-_2004.09.20",[],"So as I may have mentioned we got VOIP service instead of a landline from http:\u002F\u002Fpacket8.net. So far it's been satisfactory, but we've had two outages. The first was because of the cable internet company -- messed up their DB of MAC addresses, but is fixed now. The second was tonight and was definitely Packet8's fault. The outage wasn't for long, and I called up the tech support using the cellphone to make sure that it wasn't our fault. As usual they answered fairly soon and told me that it was indeed a network outage on their end (even their website was down at this time). Said it would be up in about half and hour and indeed it was. But while I was thinking about it I thought I'd push on with my research into the details of their system. Once their webpage came back I noticed that they had a firmware upgrade available, so I went for it. They produce their own phone --> ethernet gateway, the DTA-310, which comes as part of the service. I never noticed before (which is strange), but it has a simple little web interface. The firmware can be upgraded either through a windows executable (ick) or through a lovely http upload. I did the latter and in no time had new firmware with a couple new features, including some more statistics measurements for call quality. Well while I was in there poking around I noticed an Advanced Configuration section, which is blocked off by a password unbeknownst to me. Search on the net so far says that nobody knows it, or at least nobody is talking. BUT Wait! I have a lovely .bin for the firmware! So I open that up in a hex editor, as someone else mentioned doing, and see lots of lovely gibberish and strings from their webpages and settings. No plaintext password unfortunately, but I wasn't expecting one. Other research has led me to believe that they are programming everything in C... which should be perfectly de-compileable. Now I just have to find out what chip I'm decompiling for. Next step... pop the top. Stay tuned.",{"id":3501,"title":3502,"titles":3503,"content":3504,"level":9},"\u002Ftlt-2004.09.21","TLT_-_2004.09.21",[],"I just noticed http:\u002F\u002Fwww.hostingsoftware.net\u002F, which is a direct competitor to http:\u002F\u002Feggplantfarms.org's own system of custom scripts and EPFarms Panel. I'll probably go ahead and install it to see what it's all about, but from the description it is definitely not an abandon-ship worthy project. Sounds like there are a couple core design decisions that we decided upon differently. Interesting none the less. I'm very excited about the new Mirabel! Pieces have already started to arrive in the mail. The only one that seems like it will be slow in getting here is the powersupply. Time to wake up Beth.",{"id":3506,"title":3507,"titles":3508,"content":3509,"level":9},"\u002Ftlt-2004.09.27","TLT_-_2004.09.27",[],"Just chugging along here. Practicing my harmonica to whatever comes on -- went form \"Bad Moon Rising\" to \"I'm Too Sexy\" for an interesting transition. Curtis has returned to work after a weeklong vacation.., no meltdowns while he was gone which we are all happy about. Work is still going very well. Mirabel is frustrating, as usual. We put her together on thursday\u002Ffriday, but of course she didn't work. David and I figure it is probably the motherboard, but we are going to try to get a second opinion in-town before we send it back to http:\u002F\u002Fnewegg.com. Wish us luck! I'm really looking forward  to getting it all working and sent off to Florida-land. Beth and I went down to Phoenix this weekend to send Jason off, he'll be leaving next weekend for DC. We'll go visit him next summer or so I hope, him and Erik et al. I've never been to DC, so I'm looking forward to it. Oh, and speaking of trips we're contemplating going to Idaho to visit my family for Thanksgiving. Doo dah... too sexy for my cat...",{"id":3511,"title":3512,"titles":3513,"content":3514,"level":9},"\u002Ftlt-2004.10.04","TLT_-_2004.10.04",[],"Welcome to October! I really should fix my SimpleChanges thingie... I didn't realize how much I used that until it was gone. But I'm too busy working right now. Working to use http:\u002F\u002Fegroupware.org which is going OK. I even get flashes sometimes where I consider using it for eggplant farms. But then it passes. I was just checking out http:\u002F\u002Fwww.kjack.org\u002F and noticed some subtle but quite good changes that David made. I like it. Snow mentioned to him that he'd like a re-design, something... using Frontpage. ick. What a horrible idea that is. You should have seen it before I started... nnaaaasssttyyyy. The problem is that Snow doesn't see it getting utilized, so he believes that a redesign will somehow fix it. Truth be told, however, the trick is in advertising, not in its look. The site is clean and works well, and people use the shout-box quite a bit actually. But they have no motivation to use any other part of the site. Soon DJ's will start putting up their own pages, which will help. Anyway. bah. Back to work I think.",{"id":3516,"title":3517,"titles":3518,"content":3519,"level":9},"\u002Ftlt-2004.10.07","TLT_-_2004.10.07",[],"See http:\u002F\u002Fwww.livejournal.com\u002Fusers\u002Fmidendian\u002F369842.html?thread=750258#t750258",{"id":3521,"title":3522,"titles":3523,"content":45,"level":9},"\u002Ftlt-2004.10.11","TLT_-_2004.10.11",[],{"id":3525,"title":3526,"titles":3527,"content":3528,"level":9},"\u002Ftlt-2004.10.17","TLT_-_2004.10.17",[],"Interesting weekend. Among other things I got a new release of Contize out to CPAN, with some minor changes all toward getting Continuity to work. And today I released cpan:Continuity, which I'm very pleased about :) Now I'm trying to drum up some people to push me into furthering this project. So far no such luck. I'll make a couple more example programs, as I need them, to show how the thing can be used. If you build it they will come?",{"id":3530,"title":3531,"titles":3532,"content":3533,"level":9},"\u002Ftlt-2004.10.23","TLT_-_2004.10.23",[],"Hanging out in phoenix at Liz's. Red Sox won... I was recruited as a Red Sox fan while in the Boston area in the early summer. Perhaps the addition of one more fan has been just enough to raise the curse? We'll see soon enough. Liz has a neighbor below her who plays very loud deep mexican um-pa music, and he just started it. Considering that it is just getting to be 1:30AM, even the usual flexible, let people do their own thing ideology I have weakens and I have the urge to stomp or go down and yell at him. Liz asked the apartment people to talk to him, but that hasn't helped yet. Maybe he should move his bass away from the wall a bit or something. So. Yeah.",{"id":3535,"title":3536,"titles":3537,"content":3538,"level":9},"\u002Ftlt-2004.11.05","TLT_-_2004.11.05",[],"Been quite busy with work. In a good way though. Tonight did some crazy DB field resizing under pretty serious time-constraint... went acceptably I'd say. Beth said something at dinner which has gotten me to think a bit about GP and the current status of OGPF. I left off at the spot where I was implementing some of Koza's examples. I didn't get very far because it really isn't very interesting to implement someone else's ideas... but I really do think that is the next step that I should do. After that I can move to the work Tinu Yu did on lambda-calculus as a genotype. And then, FINALLY, I can work on my own ideas about typed l-calc with various genotype-phenotype mappings. Other than general results from evolving typed l-calc stuff, I think that one of the most promising directions that GP can take is optimizing pre-existing programs. Actually I'd like to clarify -- by \"optimize\" I mean either simplify algorithms or improve performance, but I expect that the GP will have to focus on one type of optimization or the other. Though of course the solution spaces for either overlap quite a bit, I'd guess. We'll see! So I think I'll program until Beth is ready for bed.",{"id":3540,"title":3541,"titles":3542,"content":3543,"level":9},"\u002Ftlt-2004.11.10","TLT_-_2004.11.10",[],"Sometimes when I'm programming it's a lot like being in a dream. This is most apparent when something interrupts me, pulling me out of the dream world. I'm groggy at first, unsure of what is really happening. Slowly I adjust, addressing the interruption. Then, when the interruption is over, I try to go back. But you don't always dream the same dream, and I can't always remember where I was and what I was doing in the program. I have to ease myself back into it until I finally let go and once again lose myself.",{"id":3545,"title":3546,"titles":3547,"content":3548,"level":9},"\u002Ftlt-2004.11.17","TLT_-_2004.11.17",[],"Well it turns out the stupid motherboard we got for the New Mirable does in fact REQUIRE registered RAM! EVIL!! David picked up a stick last weekend and we tested it last night and at last we have a working machine. It'll still be a while before it is live -- have to order all new ram now, and then of course we have to send it back to Florida. But I'm very excited and soon will be recruiting new members all over the place. Saturate this machine and then buy another! That would be great :)",{"id":3550,"title":3551,"titles":3552,"content":3553,"level":9},"\u002Ftlt-2004.11.24","TLT_-_2004.11.24",[],"Time for my weekly log entry :) Adam is staying with us for the last day or so. Tonight we will go down to Tempe for Thanksgiving. Beth and I will hang out, no specific plans yet. The real fun is Fri-Sun, we will be going to Exotic Yuma! (if I haven't mentioned that before).To take Hammie to a dog show. Beth's mom is in MA visiting Rob&Patty.",{"id":3555,"title":3556,"titles":3557,"content":3558,"level":9},"\u002Ftlt-2004.12.05","TLT_-_2004.12.05",[],"This weekend was too short. Probably just because the last one was so long. Still... I feel dissatisfied. And see the bottom of this for a lovely koan.",{"id":3560,"title":3561,"titles":3562,"content":3563,"level":9},"\u002Ftlt-2004.12.10","TLT_-_2004.12.10",[],"Arrg. Whole lot of wiki-spam over the last few days. I need to fix my RSS so that I will be notified of this sort of thing right away, first of all. Second of all... I must make it stop. For just a flicker of a second I thought \"fine then, nobody edits but me\"... but then I noticed in the change long that someone else actually fixed some spam for me :) The thing is, I'm not entirely sure how much of the junk is added by humans and how much is added by robots... hrm. Actually I just noticed that some of my referrers are obvious web-searches for the oddmuse footer text. Now I've repeated the search and found other peoples' pages which got attacked and fixed them. I'll figure something out to deal with this soon... Well my week was long and difficult... everything I touched at work turned to dust and that pretty much took up all my time. Here is an idea for the WikiSpam issue: You must answer a simple question to save a page. This is along the idea of \"what do you see in this image\" trick that some sites do now, except that it would be completely text-based. This has several advantages. First off, it is not so server-intense. The image-based techniques either cache the images or generate them on the fly (usually the latter to at least some degree). They must make the image un-readable by OCR but readable by people. Secondly, and more importantly, I can ask arbitrary questions of an english-speaking (intelligent) audience. Sample questions: What is the first letter of this question?How many letters are in the word \"dog\"?What is 2 + 2?Why is a raven like a writing desk?",{"id":3565,"title":3566,"titles":3567,"content":3568,"level":9},"\u002Ftlt-2004.12.12","TLT_-_2004.12.12",[],"Woo hoo! I now have some anti-robot security. Stupid robots... Weekends sure are short these days. I think thanksgiving was just soo long that all the rest are, well, half as big.",{"id":3570,"title":3571,"titles":3572,"content":3573,"level":9},"\u002Ftlt-2004.12.14","TLT_-_2004.12.14",[],"Happy birthday to me! Went and watched National Treasure... it was ok. Certainly no Davinci Code or anything... some frantic running (which adds points in my book). Now that RSS works again I'll have to re-start my cron job to notify me of changes to this site. No spam yet, but since they are most likely humans doing the spam (so I hear) the question-asker may not stop them. It was fun anyway though. I often feel that I should program in Smalltalk more, or at least a little. I think it goes back to my initial quest for an understanding of object-oriented programming. For something silly like a year and a half I read everything about OOP I could get my grubby hands on... books, papers, websites, anything. I just didn't get it. What, exactly, did OOP provide which I didn't already have using a modular style of programming, as was available to me in a language like Pascal? There must be something, I thought, or people wouldn't go on and on about it all the time. Finally I found Smalltalk. In its simplicity and beauty I had my answer... OOP is not better than other techniques, but it is different. Seeing the code for displaying a button on the screen, and realizing that the method which controlled the button's physical location was the same as the method which controlled the overall windows' location... that they were in fact the same exact method... I realized that this way of organizing code and relating it to the data it manipulates made sense and wasn't overly stupid. I didn't become an OOP fan per-se, but I did become a smalltalk fan. The hype of OOP in general did become pretty silly to me, however. I liked Adam's use of pointers-to-functions in C structs, in a lot of ways better than I liked C++'s real objects. Perl taught me that OOP may as well be equivalent to a fancy function calling convention and some hackery. OCaml\u002FML taught me that often what I really wanted was polymorphism and perhaps a powerful module system. But still... in the back of my mind is the powerful simplicity of Smalltalk. A couple times a year I'll grab Squeak and turn it on... but I never do anything with it.",{"id":3575,"title":3576,"titles":3577,"content":3578,"level":9},"\u002Ftlt-2004.12.16","TLT_-_2004.12.16",[],"Describe the new page here.\nHello.",{"id":3580,"title":3581,"titles":3582,"content":3583,"level":9},"\u002Ftlt-2004.12.21","TLT_-_2004.12.21",[],"Got a game going with Jason over at the Dragon Go Server, should be fun. Started some more work on OGPF last night. I keep going back and forth between using the untyped-lambda-calculus implementation and doing a full OCaml\u002FMetaOCaml method. I'm going with the lambda-calc (again). Implementing a tic-tac-toe competition. The immediate plan involves trying things like seeding the population or starting from scratch, trying different sizes of population, etc. The longer term is to create a disparity between the genotype and phenotype and start doing some neutral evolution.",{"id":3585,"title":3586,"titles":3587,"content":3588,"level":9},"\u002Ftlt-2005.01.03","TLT_-_2005.01.03",[],"Lots of snow today. It supposed to snow every day for a week (except for maybe thursday). I hope to go skiing on friday :)",{"id":3590,"title":3591,"titles":3592,"content":3593,"level":9},"\u002Ftlt-2005.01.13","TLT_-_2005.01.13",[],"At last Mirabel lives! Hopefully all my faithful readers have noticed the significant speed boost to the wiki. Feel free to enjoy it further by commenting on a page or something. So yeah. All sorts of fun!",{"id":3595,"title":3596,"titles":3597,"content":3598,"level":9},"\u002Ftlt-2005.01.28","TLT_-_2005.01.28",[],"So the folks over at IlliGAL started a genetic-programming blog, http:\u002F\u002Fwww.illigal.blogspot.com\u002F. I think it's super cool! In like one day they've generated more interesting GP tidbits than the mailing list has generated in quite a while. Unlike the mailing list, the detailed information in the blog actually makes me feel inspired to write down the thoughts inside of my own head. So i did something super cool the other day, I created a smalltalk-like browser for perl (see GOE) as a module in the EPFarms Panel. It was such a simple thing to do... and yet it seems to have so much potential. The first thing I want to get going is this: when you get an error now (a panel-module crashes for example), the system emails me. Well what I want it to do is to detect whether the person logged in is a developer, and if so give them a link to directly see the code which caused the error. I'm going to CodeCon in a few weeks, and I'm quite excited. One of the many interesting projects being presented is Wheatfarm, which was my inspiration for the above hack. It is a wiki\u002Fobject system\u002Fweb-based-programming-environment. Interesting... but I'll stick with Perl for now :)",{"id":3600,"title":3601,"titles":3602,"content":3603,"level":9},"\u002Ftlt-2005.01.31","TLT_-_2005.01.31",[],"Describe the new page here.",{"id":3605,"title":3606,"titles":3607,"content":3608,"level":15},"\u002Ftlt-2005.01.31#in-the-other-comments-section-of-an-nau-parking-services-survey","In the \"other comments\" section of an NAU parking services survey:",[3601],"Two crazy ideas: (1) Don't sell more parking stickers than you have parking spaces\n(2) Give everyone one single assigned spot And a bonus (in the case that you don't do the above, which I'm sure you won't):",{"id":3610,"title":3611,"titles":3612,"content":3613,"level":15},"\u002Ftlt-2005.01.31#_3-only-ticket-people-when-they-are-consuming-resources-in-a-way-that-limit-those-who-have-paid-in-other-words-dont-ticket-someone-who-is-parked-in-an-otherwise-empty-parking-lot-without-the-correct-sticker-the-only-reason-this-is-done-is-to-make-money-and-if-you-want-more-money-it-should-come-from-an-increase-in-tuition-not-an-evil-plot-to-suck-money-out-of-the-student-population-one-ticket-at-a-time-this-back-handed-way-of-getting-funding-is-ethically-wrong-and-you-should-be-ashamed-of-yourselves","(3) Only ticket people when they are consuming resources in a way that limit those who have paid. In other words, don't ticket someone who is parked in an otherwise empty parking lot without the correct sticker. The only reason this is done is to make money, and if you want more money it should come from an increase in tuition not an evil plot to suck money out of the student population one ticket at a time. This back-handed way of getting funding is ethically wrong and you should be ashamed of yourselves.",[3601],"I suspect they will ignore me. Hopefully they will get a good laugh out of it :) I should fix my comment pages. I broke them when I added my QuestionAsker extension. hrm.",{"id":3615,"title":3616,"titles":3617,"content":3618,"level":9},"\u002Ftlt-2005.02.04","TLT_-_2005.02.04",[],"I never could figure out what was wrong with my simple-changes sidebar thingie... so I've given up and just hacked around it. Also set up a demo issue-tracker, see Create Tracker Item and try it out. This whole wiki thing is such a powerful idea... it doesn't take much to make it do all sorts of things. I think I still need to fix my RSS feed though. hrm. Tomorrow is the LUNA installfest! I'm excited. Depending on who shows up and what they want to hear I might give a talk. Just an overview of the major software components in a typical desktop setup. Still fun though. Getting close to when I get to go to Codecon...",{"id":3620,"title":3621,"titles":3622,"content":3623,"level":9},"\u002Ftlt-2005.02.06","TLT_-_2005.02.06",[],"Arg. I turn my QuestionAsker extension off for less than two days and I get SPAMed! I'm turning it back on and fixing it so that people can add comments again. My previous idea was to allow comments without the question, but the recent spam was added to both my sidebar AND to the comment section on my sidebar. Evil. The thing is, that in general the question-asker is annoying. One idea I just had is to do a one-time question asker thingie... where the login for the Editor mode is the question, and thereafter (so long as you are logged in) you do not need to answer the question. This still isn't as easy as no question at all though... hrm. So I got the QuestionAsker Extension to work on comment pages, and I bypassed it for my tracker stuff. Grr.",{"id":3625,"title":3626,"titles":3627,"content":3628,"level":9},"\u002Ftlt-2005.02.07","TLT_-_2005.02.07",[],"hrm. bleh. Well, looks like the comment hack for the questionasker extension does something bad and sucks up tons of server memory. Until I fix it comments won't work... if you want to leave a comment (even on a comment page) just edit the page! I noticed it was broken last night, so I turned it off because I was showing a the wiki off and wanted all the features working. But turned the questionasker completely off... just between then and this morning I actually got more SPAM! Craziness. So far I have gotten zero spam when the QuestionAsker is turned on though... hrm.",{"id":3630,"title":3631,"titles":3632,"content":3633,"level":9},"\u002Ftlt-2005.02.09","TLT_-_2005.02.09",[],"I'm very excited... will be heading to SF for CodeCon tomorrow evening. I get to see mid off before he goes on his big trip. I'm getting jill all charged up, syncing everything. All kinds of fun.",{"id":3635,"title":3636,"titles":3637,"content":3638,"level":9},"\u002Ftlt-2005.02.13","TLT_-_2005.02.13",[],"CodeCon is fun, though different than other conferences I've attended. It's all nerds, but I've seen that at math conferences. It's hosted at a nightclub, and the lighting is set up about how you'd expect a night club to be done, which is to say that it is quite dark. This certainly makes it easy to see the ongoing presentation, and definitely adds a very hackeresq feel to the whole thing. Pretty good variety in the people, in both interests and talent. On Friday evening we went and hung out with Tim and his kids. His kids are great, they even did a skit for us right out of The Holy Grail. Tim and I got to talk about some of our pet projects, stuff that relates to Continuity mostly. His idea is that (basically) in an MVC system the entire View component should live on the person's desktop. Now, while I agree that this is how things '''should''' be, it is hard for me to believe that we have reached the point where it can actually be done. But he points to javascript in the browser allowing for rich client interaction... but my heart is still holding back. Neither of us are actually doing it that way yet at this point, but others are beginning. Today the presentation which I'm most looking forward to is WheatFarm. It's an interesting idea (though possibly already-been-done in a lot of ways). I'd like to know if they have any ideas for non-coolness uses for the thing.",{"id":3640,"title":3641,"titles":3642,"content":3643,"level":9},"\u002Ftlt-2005.02.15","TLT_-_2005.02.15",[],"Sheesh. I should go to bed. Well, in any case, I've just completed my initial run of work on Oddmuse EditSection. This extension makes sections have individual edit buttons, just like on http:\u002F\u002Fwikipedia.org\u002F. Sooooo fun! The nerds go hacking one by one!\nHurrah! Hurrah!\nThe nerds go hacking one by one!\nHurrah! Hurrah!\nThe nerds go hacking one by one, right until the night is done\nand they all-go-hack-ing\nDown.\nIn the dark.\nTo get out.\nOf this dream.",{"id":3645,"title":3646,"titles":3647,"content":3648,"level":9},"\u002Ftlt-2005.02.17","TLT_-_2005.02.17",[],"So you livejournal feed readers may have noticed that I finally fixed my feed. Now it sucks not just the subject but also the content including links. Since I now know that people might be listening I'll have to think of something useful to talk about... yeah right. So now we will experiment to see what happens if I change an entry after it has been sucked over to livejournal. Wish me luck. OK... this is a test of an updated entry!",{"id":3650,"title":3651,"titles":3652,"content":3653,"level":9},"\u002Ftlt-2005.02.17.11.09","TLT_-_2005.02.17.11.09",[],"Well, updating an existing entry doesn't work, because lj is nice and caches the entries. So now I have to explore getting around that. Hrm. Anyway. Midendian is on his way to the orient! I take it back, it did update! woo hoo! Well then, I guess I don't have to do anything special after all. I think it updated, anyway. Oh well... I'll just move forward with the assumption that it does update. Well, since I wasted this entry anyway, I might as well test out some stuff. Here is a image:Test Image. Here is a local link, Projects. Here is a web link, http:\u002F\u002Fwikipedia.org, and here is a named web link, wikipedia. Fun, eh?",{"id":3655,"title":3656,"titles":3657,"content":3658,"level":9},"\u002Ftlt-2005.02.18","TLT_-_2005.02.18",[],"digraph {\n    \"Build OGPF\" -> \"Research\";\n    \"Research\" -> \"Profit!\";\n  } Back on the other hand it isn't really worth abandoning. It certainly works, it's just that I'm not using it. I built a simple tree-based backend, and tested that. Then I built a untyped lambda calculus backend, but haven't really used it. Then I decided at CodeCon that it would be fun to do a Perl backend. Using Perl for the backend has several advantages over the lambda calculus, foremost being ease of interface with system constructs. But then I wonder what I would get out of Perl as compared to a typed lambda-calc (such as even dumping to a subset of OCaml\u002FML). See if I dumped to OCaml I would also solve my interface issue, while maintaining performance and a single-language system. On the other hand the programs themselves lose flexibility. Using Perl I get limited typing, which is more than none but less restrictive than full. This all brings me back to Lee Spector's Pushpop system. He has constructed a programming language\u002Fsystem specifically for evolutionary computation. In Pushpop the individuals in the population are responsible for their own reproduction which has some interesting implications, such as their building of abstractions to copy themselves also pushing them toward modularity of sorts. Providing a flexible environment means that programs can evolve to solve the problems in a natural way, not necessarily a human-logic way. Overall I am walking a thin line between flexibility for the GP individuals and simple interfacing with external systems (including humans). I'm just not sure where I fall on this issue and the only way I'll figure it out is through actual experimentation with a variety of systems... and if I never complete any of my backends then I'll never make progress. And time marches on.",{"id":3660,"title":3661,"titles":3662,"content":3663,"level":9},"\u002Ftlt-2005.02.19","TLT_-_2005.02.19",[],"Roman numerals annoy me. After some brief research on the internet (especially see Wikipedia:Roman Numerals), I've discovered that the way I've always considered \"standard\" is not necessarily so. Unfortunately the Superbowl does it the way I don't like... so I'm afraid the status will be committed forever! It comes down to this (from wikipedia): \"Some rules regarding Roman numerals state that a symbol representing 10x may not precede any symbol larger than 10x+1. For example, one should represent the number \"ninety-nine\" as XCIX, not IC. However, these rules are not universally followed.\" I would like to thus publicly state that I am one of those non-adopters of that stupid rule. As far as I'm concerned we recently had Superbowl IXL. And you just know it's all the fault of those marketing people because (1) they learned it the stupid way in school, and (2) MORE X's PEOPLE! Everyone loves X! X X X!!! Bloody Romans.",{"id":3665,"title":3666,"titles":3667,"content":3668,"level":9},"\u002Ftlt-2005.02.20","TLT_-_2005.02.20",[],"Made some progress on my Perl backend for OGPF. I keep thrashing though... still not feeling great about the whole structure. I keep thinking that I should just start over, yet it is quite clear that it would be a mistake. It works, and it works pretty darn well - just needs some tuning. Or better yet some feedback. What I really need is someone ELSE to actually use the thing. But the likelihood of anyone else using it in its convoluted state is pretty low. I suppose I should focus on how well it works for me :)",{"id":3670,"title":3671,"titles":3672,"content":3673,"level":9},"\u002Ftlt-2005.03.01","TLT_-_2005.03.01",[],"I wonder what the world would be like without the '@' symbol. I remember back when I had my first computer, an Apple ][e, which was when I first noticed the symbol. I hated it. I mean... who needs an abbreviation for 'at'? It's only two letters long as it is! I refused to use it, even when typing short-hand notes. But look at me now... I use '@' all the time. The first thing that comes to mind is email addresses. What would we use instead of '@'? Well they used random stuff before Ray started the '@' thing in '67, and would surely have gotten along just fine. So I cruise on over to wikipedia, and lowe-and-behold... italians. Yep... the '''ampersat''' very likely came out of the renaissance. If they only knew how much they were contributing to Perl!",{"id":3675,"title":3676,"titles":3677,"content":3678,"level":9},"\u002Ftlt-2005.03.03","TLT_-_2005.03.03",[],"Demonstration",{"id":3680,"title":3681,"titles":3682,"content":3683,"level":9},"\u002Ftlt-2005.03.07","TLT_-_2005.03.07",[],"Caffeine in my veins\nSoaring above world constraint\nThen come crashing down",{"id":3685,"title":3686,"titles":3687,"content":3688,"level":9},"\u002Ftlt-2005.03.09","TLT_-_2005.03.09",[],"I think that, in addition to xor, we should use \"ior\" to explicitly mean \"inclusive-or\". Yeah yeah... I know that \"or\" alone is implicitly an \"ior\"... but I just like the sound of ior :) Doh! I didn't notice that my little edit-todays-entry shortcut was messed up and didn't pad my dates with zeros... oh well. I've been trying to use KHTML instead of Gecko to do the magical html->ps rendering... and in some ways it's better and in some ways worse. First of all, it is pretty darn easy to get it going, and the KHTML widget is waaayyy easier to use than the mozilla one. But really we should be comparing the KHTML widget to the gtkmozembed widget... in which case they are much closer in ease-of-use. The KHTML widget, however, has no issues rendering to buffers unattached to the screen (so far). I just now have to get it to print without any screen interaction. The big drawback is that out-of-the-box it has to start all of freakin-KDE in order to do anything... which sucks. So I plow on!",{"id":3690,"title":3691,"titles":3692,"content":3693,"level":9},"\u002Ftlt-2005.03.10","TLT_-_2005.03.10",[],"New idea in mind\nCurrent idea neglected\nThe flood pushes past",{"id":3695,"title":3696,"titles":3697,"content":3698,"level":9},"\u002Ftlt-2005.03.18","TLT_-_2005.03.18",[],"I used to get Dr. Dobb's Journal, and the first thing I'd flip to was Swaine's Flames. They were simple, one-page articles, centering on some random thought from Michael Swaine. Like many of the stylistic articles I enjoy, he'd start on a topic, wander off for a while, and then bring it all back around to his point (if he had one). Enthralled with this, and wanting to spread my own memes throughout the world, I set out to emulate this style. In my head, anyway. So far it hasn't actually happened, even though I've tried a bit. Now and then I write something down, but it doesn't really come out the way I'd like. Primarily I try to use the TLT, but there are some issues. Biggest issue -- I don't spend enough time on any one entry. There is no editing or revision, no thought or consideration. Instead I write whatever comes into my mind at the moment and then hit the 'post' button and that's that. Thus here I am, unsatisfied, forced into a meta-discussion. Not that I don't enjoy meta-discussions. In fact, if you stick the meta- prefix onto just about anything there is a very good chance that I will be interested in it. Let's try... meta-programming. Meta-mathematics. Meta-cooking. Meta-taxes. All things I love! But I digress. So time and revisioning are definitely things which are slowing my progress. Of course, Swaine has the advantage of being paid to write his rants. Oh, and he actually has things to rant about. What do I have? Strange stories about how I think the neo-nazi party should have an image makeover centering around using 'Z' (with a little sideways z overlayed) as their new logo and name (\"We're the Z's!\"). Perhaps. Until you realize that Z's point the wrong direction to simulate an official swastika. Though it could still be their \"unofficial\" logo. Not that I want to encourage nazi-ism, mind you. It's just marketing. Point being that he gets to go on strange tangents whereas I do not. Thus I have in mind a solution which will be pleasing for everyone, especially me. All it takes is you... your donation could mean one more hour of thought will go into my next entry! Just imagine all of the high-quality articles which I might produce once your check arrives in my mailbox. Wouldn't it be wonderful?! I could even use the money to re-subscribe to Dr. Dobb's Journal so that I can read Swaine's Flames.",{"id":3700,"title":3701,"titles":3702,"content":3703,"level":9},"\u002Ftlt-2005.04.25","TLT_-_2005.04.25",[],"I'm not dead yet! Job search is going well. Surprisingly, jobs have started to come to me, via various contacts and Monster. All sorts of fun. I've been thinking about Science and Mathematics lately, and how they interact. There was a very interesting paper mentioned on http:\u002F\u002Flambda-the-ultimate.org\u002F, The Unreasonable Effectiveness of Mathematics in the Natural Sciences, which is a  great read. This and a few other random encounters have led me to contemplate the relationship between mathematics and science. One thing, which I cannot repeat often enough, is a simple yet profound difference between the process of the two disciplines. Mathematics is about proof, while science is about disproof. This has surely been written elsewhere, but it is nice to contemplate the idea on its own. In mathematics you come up with a theorem, and then attempt to prove that the theorem is correct or incorrect though logical argument. In experimental science, on the other hand, you come up with a theory which explains all known data points. You then try to collect further data points or make a logical argument in an attempt to disprove the theory. That framework in mind, let's turn our attention to the concept of completeness in mathematics. From Goedel we have the incompleteness theorem, which states that (in our current system) there are truths of mathematics which are not reachable by logical argument from existing truths. That is -- there are some statements which we cannot prove nor disprove, but for which there is no situation in which the statement is false. In other words, there are true statements of mathematics which cannot be proven. Now let's turn our attention to science. Are there, then, statements of science which cannot be disproven, in a corresponding way? The most direct instance of such a concept is that of God. God is here defined as something completely outside our physical system, yet which exists nonetheless. Existence without physical manifestation seems like something we surely cannot disprove. This seems to put the question outside the reach of science. Yet we have one more bit of thought from the mathematicians which can be borrowed. How did they react to the incompleteness theorem? They kept right on trying to prove everything under the sun. Even with problems which took years and years to solve, they continued. Even with the threat that these problems may in fact be un-provable. Many of these problems have yielded great results and even proofs... but others are left unsolved. When do we give up? Now apply this question to science.",{"id":3705,"title":3706,"titles":3707,"content":3708,"level":9},"\u002Ftlt-2005.05.10","TLT_-_2005.05.10",[],"Describe the new page here.\nSweet... the soundcard in my Vaio isn't broken after all! See http:\u002F\u002Fmodular.fas.harvard.edu\u002Fz505he.html, where they mention the issue. Basically the connector to the sound card, which sits about where my left hand rests, comes loose. First goes the speakers, then goes the headphones. Exactly my issue. In fact, now that I know about the problem I press down on the spot and my sound magically returns! Now I just need a clean table to take jill apart and she will be as good as new! I am now employed with SWCA, and so far so good. In-house PHP programming, building on some nice clean existing code. I'm very pleased with it so far!",{"id":3710,"title":3711,"titles":3712,"content":3713,"level":9},"\u002Ftlt-2005.06.06","TLT_-_2005.06.06",[],"Work at SWCA is going very well. I have a whiteboard and PowerBook and everything. I've done a port of Continuity, or at least the philosophical core, to PHP. Perhaps Steve will let me open source it... but right now I'm too busy using it to publish anything. Here is the summary of the world: Star Wars, Revenge of the Sith - SucksOngoing AJAX craze - interesting but scaryIntel Inside Apples - interesting but scaryMirabel down for a few hours today - sadDaily Show - goodMonk (TV Show) - makes me happySherlock Holmes - samePowerMac G4 - nice, especially the battery life... but I'll stick with JillRabbit - DRIVES ME CRAZY WHEN I'M TRYING TO SLEEP Stupid rabbit. Kept me up most of the night yesterday making chewing sounds. Grr. I woke up downright angry.",{"id":3715,"title":3716,"titles":3717,"content":3718,"level":9},"\u002Ftlt-2005.06.07","TLT_-_2005.06.07",[],"Yesterday I neglected to mention Sarge was released. One of Beth's complaints about linux is that I'm always changing things. So I've had her on testing for a while and now I'll move her over to stable. Then nothing will change for like 3 years! At work I'm working on this timesheet application. The structure was put into place previously, but I've made some significant alterations to the internals. Well now that I've got things worked around, once again it goes back to user interface design, which is always an interesting challenge -- even in what many would see as something mundane. The subtleties involved are numerous. Core to the struggle is the tradeoff between useability (with little to no training) and productivity. The goal is to have an intuitive interface which doesn't slow down the experienced users. People will be using this on a daily basis, so it's pretty important that they don't have to click through friendly messages reminding them of what they can and cannot do. Reflecting upon the solutions posed by others in the desktop application world, we see that there are a variety of methods to bridge the gap. First is a good help\u002Fdocumentation system. Every screen has a help button that will tell you all about the current part of the program, its features and limitations. Lovely little screenshots and links to more in-depth topics. Then there are tutorials. These go hand-in-hand with the help system, and often the tutorial is somewhere '''in''' the Help. There are of course many depths of tutorial... and if something much deeper than an overview of nuances of the system is required I'm not sure that this is the right idea. In other words, if the going through the tutorial is the only way to figure out the application, perhaps the application needs to move a bit toward the intuitive side of the gap. Besides, \"tutorial\" is another way of saying non-supervised training. Two more. Next is having a per-user set of preferences. Then you can have users and power-users. Or even just different ways of approaching the problem to be solved. I'll have to think about this more (in regard to the applications I work on). One thing I see in a lot of applications are first-time-usage messages. So the first time you run into the overtime issue extra documentation appears to let you know what is happening. These are all obvious things when it comes to desktop apps, but they are missing in a lot of web-based applications. I suppose I just need to continue letting go of the static-webpage ideology and embrace the application.",{"id":3720,"title":3721,"titles":3722,"content":3723,"level":9},"\u002Ftlt-2005.06.09","TLT_-_2005.06.09",[],"Check out The Fridge. Feel free to contribute your deep poetry and banal remarks. Sync often.",{"id":3725,"title":3726,"titles":3727,"content":3728,"level":9},"\u002Ftlt-2005.06.17","TLT_-_2005.06.17",[],"Moment of silence for Hammie We had him put down this morning, he had been suffering from heart failure. He was a magnificent Great Dane. A gentle giant. He was loved dearly and will be missed very much.",{"id":3730,"title":3731,"titles":3732,"content":3733,"level":9},"\u002Ftlt-2005.06.26","TLT_-_2005.06.26",[],"David and I are having all sorts of fun working on a cops-and-robbers game for the ICFP Contest 2005. Just thought I'd share.",{"id":3735,"title":3736,"titles":3737,"content":3738,"level":9},"\u002Ftlt-2005.07.06","TLT_-_2005.07.06",[],"You may have heard that NASA recently executed its Deep Impact mission in which it collided a spaceship (\"Impactor\" -- about the size of a coffee table) into a comet. At first I thought to myself hm, that's interesting. Then today I was reading an article on it which mentioned that this is the first time a man-made object has crashed into a comet. Suddenly the full irony of the situation hit... I mean... WE SMASHED A SPACESHIP INTO A COMET TO SEE WHAT WOULD HAPPEN!? NASA is damn cool. I can just see those guys sitting around a table discussing this six years ago. The intern in the corner was like \"I have an idea...\" Soon we won't be the ones fearing space debris. Rather, the space debris will be the ones fearing us.",{"id":3740,"title":3741,"titles":3742,"content":3743,"level":9},"\u002Ftlt-2005.07.08","TLT_-_2005.07.08",[],"You know how if you say a word over and over and over again sometimes it starts to sound very strange to the ears... altering the word into some sort of alien sound? Lately I've had a similar issue with my mouse pointer. When you place your pointer over a link, instead of an arrow or a text-cursor (the I-shaped thingie), you get a funny little hand pointing at the link. I noticed this hand icon when I first saw it, and thought it was ugly and stupid. Then, over the course of years of having it there, doing its thing, I forgot all about my weird feelings toward the pointy hand. Since I've been doing so much web stuff recently I once again noticed the pointer. I've also been switching back and forth between Mac, Windows, and X, which has probably made it more apparent. All of a sudden I feel transported back in time to when this whole \"pointer\" idea was craziness... and having more than one pointer was just revolutionary. Cursors used to turn all sorts of shapes, really, much less subtle than now. My favorite is\u002Fwas the bomb from xkill. Even so, I bet lots of people have the same reaction as I initially had and am now having daily. What's with the pointy little hand?",{"id":3745,"title":3746,"titles":3747,"content":3748,"level":9},"\u002Ftlt-2005.07.11","TLT_-_2005.07.11",[],"Reading The Turing Test (ISBN 0262692937), I have been filled with insights. The book is a collection of essays, including a few from Turing himself, concerning the Turing Test and more generally criteria for intelligence as a whole. I highly recommend the book if you are interested in that sort of thing even in the slightest. Insight of the moment: Let's say that we have a machine which can pass the Turing test. What makes us think we could convince it to actually participate? I imagine a funny little skit in which the machine and its creator have a conversation, in which the machine refuses to play the game, feeling it beneath itself and hurt that it wasn't obvious already how intelligent it was. Finally the machine creator puts the machine into the test against its wishes. The machine, being \"funny\", begins the conversation with \"Hello. I am ELIZA. How can I help you?\".",{"id":3750,"title":3751,"titles":3752,"content":3753,"level":9},"\u002Ftlt-2005.07.22","TLT_-_2005.07.22",[],"Today I invented an interesting analog to CSS selectors -- I apply the selector concept to code blocks and attributes instead of HTML. Specifically it is meant to be used in GUI components. See Code Selectors for some semblance of what I'm talking about.",{"id":3755,"title":3756,"titles":3757,"content":3758,"level":9},"\u002Ftlt-2005.08.05","TLT_-_2005.08.05",[],"Two things happened at work today. First off, and most importantly, I was productive. I have been in a rut lately, you see, running myself in circles but not getting any significant amount of progress out of it. Today I pushed through and am meeting milestones again. I think that I was kinda stressed about getting the new apartment (which we are in now) and such, so that was surely a factor. Soon Beth and I will have the office set up, and I can then tinker from home. Second thing, perhaps disturbing -- I've decided not to sweat the javascript requirement in my SWCA applications. Generally I avoid js whenever I can, and can get away with it pretty much everywhere. Unfortunately some of these \"getting away with it\" techniques increasingly fall within the range of \"hacks\". One abuse, for example, is in links. See -- you have this complex form with lots of inputs which is the user frequents. The site navigation bar, however, is always visible and at any point they can click to go to another section. Unfortunately with a plain link any input they just_did is lost. Easy enough... I just replace all the plain links with buttons! Throw a little CSS on there and they won't even know the difference. Unless, that is, they use safari. Safari's (and Konqueror's) Human Interface Guidelines dictate that buttons should look like buttons, not links. So I can't kill their borders or shape. So sad. Point being that I gave up and added some lovely onClick js to some normal links to make them submit() the form. Now they look and act like the links they are. I'll have to get some photos up of our new place, it's pretty nice. Liz and Jason are visiting this weekend, and my youngest brothers Levi and Garrett will be visiting sometime soon as well. So we moved in just in time :)",{"id":3760,"title":3761,"titles":3762,"content":3763,"level":9},"\u002Ftlt-2005.08.17","TLT_-_2005.08.17",[],"Had a nice visit with Levi last thursday and then Garrett on Friday. Then on Saturday (while returning Garrett to the Hiller House) I visited family all day, something I'd been meaning to do for a while now. Still knocking stuff off at work, had a tutorial session yesterday and this monday the entire phoenix office will start using the timesheet prog. Today I've been working on the export directly into the accounting system. All sorts of fun. Though I am on the verge of connecting my ODB and SetDB projects :) Now that Beth and I are in our new apartment I feel much more at-home. Not that living with the inlaws was bad or anything, it's just nice to have our own space and all our stuff set up. Got the internet, goes at about 6mbit. And the Vonage phone. And got our desks all set up. The craziest thing: Rabbits love stairs! Coco will climb the stairs, run a lap around the office, and then shoot back down to the livingroom. It is sooo cute. He likes the new apt too, apparently.",{"id":3765,"title":3766,"titles":3767,"content":3768,"level":9},"\u002Ftlt-2005.10.06","TLT_-_2005.10.06",[],"Wow, I missed a whole month! I don't actually have anything useful to say... but I'm saying it anyway. What shall I talk about? I hear that google is joining forces with Sun to push distribution of the google toolbar and the JVM. The following image comes to mind: You load google.com... and discover that it is now enhanced by being implemented as a large java applet!",{"id":3770,"title":3771,"titles":3772,"content":3773,"level":9},"\u002Ftlt-2005.10.29","TLT_-_2005.10.29",[],"I recently read a notable piece from Slashdot, Does Visual Studio Rot the Mind?. This was a talk given to the NYC's .NET Developer's Group by Charles Petzold, author of several Windows developer books. The style of the talk was entertaining in general, but the topic also caught my attention. Basically Petzold presenting a philosophical critique of Windows programming in Visual Studio, though the critique reaches more deeply into technology as a whole than just that. The point he makes is that the tools we use to help us program put pressure on our programming style. So, for example, IntelliSense forces us to program bottom-up, defining all our methods and variables before we use them. Because if we don't, it yells at us when trying to do auto-completion that such-and-such method is not defined. \"It’s not that IntelliSense is teaching us to program like a machine; it’s just that IntelliSense would be much happier if we did.\" The topics his talk touches overlap quite a bit with things I've been contemplating relating to Continuity, which is why I bring it up. I don't use Visual Studio at all, but it's clear that Visual Studio is not the only technology that tunes our approach to things. One example is a much-touted feature of Ruby On Rails -- code skeleton generation (a topic also mentioned in Petzold's talk). RoR has some handy tools which generate skeleton code for chunks of your class. This goes along with the general philosophy that if you are using RoR then you will be doing things the RoR way, and that's that. That's not the approach I'm going to take. When I sat in at the AzPHP meeting last month, one question asked was \"what is the difference between a framework and a library?\" My response was the simplistic \"Your program calls library code, whereas a framework calls your program's code instead.\" In other words, you use a library's API, and structure your program however you wish. But in a framework, you must conform to an API that the framework uses. There's a big difference there in your freedom to structure your program however you like. Another example of the tools you use influencing how you use them. This whole thing might seem like a \"duh\", but I do have a point. Libraries influence your coding style less than frameworks. Using Continuation-based Web Programming we get to invert the control of the HTTP session, letting us code how we wish. What I'd like to do with Continuity is continue that trend though higher levels of application design.",{"id":3775,"title":3776,"titles":3777,"content":3778,"level":9},"\u002Ftlt-2005.11.04","TLT_-_2005.11.04",[],"Went over and hung out with Scott (of Phoenix.PM) a bit, working with him on Continuity. Then came back and tinkered a bit. Now the server can support multiple apps and users at once! And my inventory demo is a full CRUD app. It's amazing what just a few lines of code can do. Last night I went to the PLUG Developer's Meeting. It's close enough to here that I'll try to go more often. More experienced, professional types there, as opposed to at AzPHP and Phoenix.PM where we have a larger variety. Hard to say that for sure, of course. Beth and I got a new pet! Woozle! Woozle is a Guinea Pig (looks like the one on the right a bit). So far Coco and Woozle don't care about each other much (though Coco is a bit territorial, and Woozle wants to escape from anything that moves in a misguided effort to return to his cage, not realizing that the only way back is to actually let me catch him). WOOZLE!",{"id":3780,"title":3781,"titles":3782,"content":3783,"level":9},"\u002Ftlt-2005.11.05","TLT_-_2005.11.05",[],"Lately on all the mailing lists and articles I note people doing language comparisons and leaving Perl out. This is quite frustrating, because often Perl exemplifies whatever it is they are discussing. Gar! I'm tempted to start replying each time I see that. Maybe I'll make a new username dontforgetperl or something specifically for that trolling. They are guilty of this a lot on slashdot (of course), but also over at Lambda The Ultimate. Eh... I'm just bitter.",{"id":3785,"title":3786,"titles":3787,"content":3788,"level":9},"\u002Ftlt-2005.11.19","TLT_-_2005.11.19",[],"I've been thinking about DabbleDB quite a bit lately -- Avi Bryant's approach to solving the super-spreadsheet problem. That is, the problem that small organizations often run into when utilizing spreadsheets. They start out good, but they don't scale to more complex relational data. Of course, the solution that is typically pointed at is a database. The solution is correct, but unfortunately databases are harder to do, and even more difficult to do them Right, than spreadsheets. So in a nutshell dabble seeks to make databases easy. Looking at their product it does some obvious things, making it easy to build a database. But I keep trying to figure out what does (or could, I haven't used it myself yet) make their product better than others. I believe that the answer is near-transparent refactoring. They make it easy to incrementally transform more free-form data into typed and structured data. So if you have a field with just a few different things you put in it, they make it easy to suck this out into a related table. Good idea :)",{"id":3790,"title":3791,"titles":3792,"content":3793,"level":9},"\u002Ftlt-2005.12.30","TLT_-_2005.12.30",[],"I've been reading Reddit quite a bit lately. It's another popularity-based list if user submitted links, basically. They seem to have a pretty good vote-based algorithm for floating interesting things to the top of their list. Though I'm a bit worried. Sometimes I feel that their list is too good. One thing that has been floating near the top recently is Reflections on Trusting Trust by Ken Thompson. I don't think I've mentioned it before, but this talk is damn cool, and one that I've enjoyed sharing with others. Yet here it is, right on the Reddit frontpage, for all the world to see! First of all, how am I supposed to judge how cool people are based on their knowledge of such arcane things when everyone can find them posted so widely? Secondly, how can I share this sort of super-cool thing with folks on a person-by-person basis if everyone already knows?! On the flip side are all the interesting things floating out there that I know nothing about. Maybe I'm finally getting in to this whole blog-o-rss thing or something.",{"id":3795,"title":3796,"titles":3797,"content":3798,"level":9},"\u002Ftlt-2006.01.12","TLT_-_2006.01.12",[],"A brief description of my journey (so far) through continuation-land in Perl. I talk about wanting continuations, faking them, using real ones, despairing at their non-first-class nature, and finally how I am coming out of my depression to create work-arounds. I love Continuation-based Web Programming. For the un-initiated let me give you the quick of it. A standard (CGI-style) web application is restarted for every single request that the user makes. Users of the app don't realize this, all they see is page 1 followed by page 2 and so on. But behind the scenes, each click the user makes that goes to the application must contain not only the click, but enough context so that the app knows that this user is on step 3. The application must use tricks to manage its own high-level state between user interactions. This is a bad thing. Or at least annoying. At the end of each state of the application it must explicitly decide what its next state will be. It's like having to having to program with GOTO instead of function calls. Continuations change all that. While I won't go into the details here, using continuations switches things around from the programmer's point of view. It's like you suddenly have a new function, display_html_and_wait_for_input(). Your program never exits, just like a desktop application. I didn't come up with this idea, google around a bit for further details. I wanted this for Perl. But Perl doesn't have continuations. The closest we have is cpan:Coro, which I was initially reluctant to use. Mostly because I wanted serializeable continuations... continuations which can be turned into a string and stuck into a file, which would enable me to run in a pure CGI environment. It seemed like a good idea at the time (and still is, but one I can live without). Rolling this goal around in my head for a while, I finally created Contize, a fake-continuation engine for Perl objects. Let me explain the thought process that got me there: An essential aspect of continuations is the ability to pick up where you left off. So if I exit my continuation on line 127 in the middle of a for-loop, when I resume the continuation I want to be on line 128. Can't just GOTO that line though -- all the local variables need to be exactly the same as before. So I'll cheat. I create an object which intercepts each and every method invocation of my application, saving the result. Later I re-run the code, and when I get to a method I've already visited, I just return the cached value instead of actually running the method. It's like I am recording the session, and then playing it back to get back to where I was previously. The sessions can be serialized, and anything that can be serialized can be duplicated, hence we have magical fake first-class continuations! But they are a bit inefficient and have a few side-effects. I've created a few full applications using this technique. The method works, and the overhead isn't actually that bad. The applications are very database heavy, and the database queries tends to be the limiting factor when it comes to performance. Still, loading and storing all the cached method call results does have an affect, and the longer the application runs the larger the impact (hey -- if nothing else it has to \"play back\" more and more code each time). After using Contize for about two years, I've gotten so used to the side-effects of the technique that I don't notice the work-arounds. But they are there. One example is that most of the code has to be side-effect free. If I do a database interaction I must put it into its own method so that it gets cached and then not run each time the application is invoked. Sometimes this is a bit unnatural. Another side-effect is due to the specific implementation. Contize, you see, caches things on an object-by-object basis. So if two objects call each other back and forth funky things happen. This could be fixed by making a global cache, but other complications would persist. Ever envious of scheme and other languages with built-in continuations, the appeal of using real, efficient, side-effect-free continuations continued to grow. One day I spent two hours on a bug that ended up being because of one of these side-effects. This pushed me over the edge. With Scott's encouragement, I finally began working in earnest on a real continuation server using cpan:Coro, which I call Continuity. The project was progressing nicely for a while. Continuity has its own HTTP server and several example apps. Scott and I were working on clean APIs for application developers, and planning other features. A fast real continuation server for Perl. Until one day I realized that these wondrous real continuations aren't first-class. First-class continuations allow us to copy an existing continuations, and all of the state that it contains. So, for example, we could create a copy at every point in the navigation of our web-app. Then the back button and browser forking is magically fixed! We just restore one of these saved continuations. No such luck with cpan:Coro. cpan:Coro does not provide real, first-class, continuations. It has a module, cpan:Coro::Cont, which gives \"continuations\", but these are really just a simplified interface into coroutines. Namely, I can't create a copy of a running continuation, no matter how I try. Has to do with duplicating the C stack. For a long time I was in denial, but now I've accepted it... unless I re-write Perl's core (hello Perl6!), I won't be getting first-class continuations anytime soon. I then became quite depressed. When people ask you why you are feeling down, and you explain to them that it's because Perl doesn't have first-class continuations... well people who know me pat me on the shoulders and say \"I'm sorry to hear that man\" and frown  in sympathy of sorts. People who don't look at me like I'm a weirdo. Maybe I am. Scott tried to cheer me up. He encouraged me to get on with my life -- to work with what I've got and to get some other things done. There is still a lot to do on the whole toolkit. Perl6 will have continuations, and maybe they will be first-class. So we just need to be patient. Realize where we are, be OK with that, and then move forward. Still, in order to create advanced yet usable applications I need to somehow manage the back button and browser forking now. So with the accepted state of affairs, I began to work on other methods to make things work the way I'd like. I'm still working on them, but there has been some progress. First comes the back button. A few people have suggested that the solution to the back button is to just disable it altogether. While this has been some temptation, I resist. Sure, there are times when the back button makes no sense, and then it should be disabled. But often I can think of something useful for it to do. But I digress. One answer has come in the way of Javascript and that whole AJAX craze. See, I can use Javascript to detect that I am viewing a cached page, and then do a background request to the server to let it know what is going on. The server can give back some stuff and I can use DHTML to display the result. In many ways I think that forked windows are more important than the Back button. We have multitasking operating systems, why not have multitasking applications? In fact, being able to fork a web application is one thing that sets it apart from, and perhaps above, desktop applications. Examining many different items at once in an online store, for example, is completely natural and useful. The solution to the forking-browser problem comes from the REST folks. People fork the browser by opening links in new windows\u002Ftabs. All that is needed is to make sure all the links like this can be deep-linked -- when they open it in a new window I will actually start a new continuation. Open it in the same window and I continue the existing continuation. And with that Continuity getting closer to where I want it. This piece of the web application toolkit, at least. Still have some more pieces to add.",{"id":3800,"title":3801,"titles":3802,"content":3803,"level":9},"\u002Ftlt-2006.01.18","TLT_-_2006.01.18",[],"I finally got a new PCI video card for Feline a few days ago. Now my dual-monitor configuration is actually usable. Previously I had a 4mb card, which isn't enough to actually display webpages in any sort of pretty way. The cheapest card that Fry's had was a 64meg card... which is better than my 'good' card :) I made some progress and a release on Continuity. Scott and I will be getting together soon and jamming on a couple things. My preferred interface is now stable enough that I'm going to start developing some actual applications, starting with an inventory manager for work. Hopefully I'll be able to even do some DOM Templates and AJAX stuff. Beth started school this week! So far so good. Looks like this semester is going to be much more enjoyable than last. I'm going to try setting her up with a wiki (or similar) to manage her notes. Being organized during the semester is going to help her lots.",{"id":3805,"title":3806,"titles":3807,"content":3808,"level":9},"\u002Ftlt-2006.01.26","TLT_-_2006.01.26",[],"I wrote my first useful stand-alone javascript thingie! I've always wanted a combo drop-down in HTML... and for one project I'm currently working on it was especially appropriate. Yet again I set out across the web to look for the perfect fit, but didn't find what I wanted. But I've been doing this whole Javascript thing quite a bit lately, so I thought I'd give it a whirl. Using behaviour.js to attach events cleanly, I whipped up my very own DHTML Combo. Then I realized that it didn't work quite right. Simple problem really. My combo is literally a textbox and a listbox. The listbox is normally hidden, but when the textbox gets focus I display the listbox. Then if you mess with the listbox it gets focus. Problem: when the list gets focus, the textbox loses focus first. Normally when the textbox loses focus I want to hide the list again. But not if they are actually trying to manipulate the list! No problem though, I did a quick little setTimeout timer to reverse the events. Now when the textbox loses focus it waits a bit and then checks to see if the list is the thing that got the focus. If not it hides the list. Seems to work pretty well. Using ies4linux to test (wine+ie all downloaded magically and working rocks) it even works in IE! Maybe I should put it on JSAN.",{"id":3810,"title":3811,"titles":3812,"content":3813,"level":9},"\u002Ftlt-2006.02.11","TLT_-_2006.02.11",[],"Hanging out in San Francico with Adam. Specifically I'm here attending CodeCon, which has been very enjoyable. It hasn't quite gotten me to suddenly produce tons of amazing code, but it has definitely been generally inspiring. And there's one more day!",{"id":3815,"title":3816,"titles":3817,"content":3818,"level":9},"\u002Ftlt-2006.02.24-blogified","TLT_-_2006.02.24_-_Blogified",[],"I've Blogified my site! Probably needs some tuning yet, but now when you go the the front-page you get a very blog-oriented view of things. My rough plan is to do what adam mentioned in an offhanded remark -- turn some things which I might ordinarily put into wiki pages into blog entries, and do some editing. So I'll probably be doing some fine-tuning. Speaking of which, I've done some slight touch-ups on the Phoenix.PM website. Looks quite a bit better already, and I'll add some more things soon. I haven't heard back from Ticketmaster about doing a presentation for us; I contacted them on Tuesday and expected to hear back by Wednesday, but no such luck. Monday I go to SLC for work, listening in on a meeting full of important people. Specifically monitoring the conversation to learn about secret web site and web application requirements that nobody knows to tell me about.",{"id":3820,"title":3821,"titles":3822,"content":3823,"level":9},"\u002Ftlt-2006.02.25-bad-brock","TLT_-_2006.02.25_-_Bad_Brock",[],"I'm sorry Livejournal People! I accidentally flooded your friends lists (all 4 of you) because I changed the naming scheme for the feed. I was afraid this might happen... stupid interweb. I'm sorry!",{"id":3825,"title":3826,"titles":3827,"content":3828,"level":9},"\u002Ftlt-2006.03.03-funky-function-filters","TLT_-_2006.03.03_-_Funky_Function_Filters",[],"Guido van Rossum Re-Posted a plea for advertisement of Python. Some of the Python folks are feeling the Ruby squeeze and feel like their leader might be able to make some noise. Anyway, in the course of the conversation Guido asked what the Ruby equivalent for this would be: Which is, of course, a completely useless piece of code demonstrating some lambda functionality. Someone posted the response: Which is quite similar. I thought I'd give it my hand for Perl5, which looks like this: Pretty ugly, if I do say so myself. The ugliness comes directly from the lack of a simple named parameter mechanism. The Python and Ruby versions look, like I said, very similar. All three are identical in algorithm... but for once it looks like Perl doesn't do so well on terseness. Now I have to figure out what this looks like in Perl6...",{"id":3830,"title":3831,"titles":3832,"content":3833,"level":9},"\u002Ftlt-2006.03.05-turing-award-innovation-lag","TLT_-_2006.03.05_-_Turing_Award_Innovation_Lag",[],"A few days ago I noticed that Peter Nuar was given the 2005 Turing Award. I thought to myself \"self, doesn't that name sound familiar?\" \"I believe it does,\" I replied. That is Peter Naur of Backus-Naur Form. That, in conjunction with his greater work on Agol 60, is why he got the award. Backus got his award in 1977, for inventing FORTRAN (which is, shall we say, significant). But why the lag between the work and the award? It's not like we just now noticed that BNF and Algol have been a huge contribution to software technology. Looking at the list I saw some others... Alan Kay wasn't recognised until 2003 for his early 1970's work; the RSA guys were recognised in 2002 for work from 1977. Maybe it's not a big deal -- it could be that it just takes a while to recognise the work. The early awards were given for more recent works because there weren't any older works. Maybe the Turing Award itself is lagging in quality or direction. But what if our rate of innovation has slowed? A rough look suggests that towards the beginning of the award it took up to 20 years between contribution and recognition. The more recent awards took more like 30 years. Such a small data set to be sure, but it does make me ponder.",{"id":3835,"title":3836,"titles":3837,"content":3838,"level":9},"\u002Ftlt-2006.03.17-unison-backup-setup","TLT_-_2006.03.17_-_Unison_Backup_Setup",[],"I use Unison to keep my important files synchronized between machines. This is a description of how I have it arranged and to some degree automated. I put all my important files into a directory called 'tlt'. This happens to exactly correspond with the root http directory of my website. Most things in the directory are fine to be on the web, but things that shouldn't be published are locked through file permissions and .htaccess files. I put this 'tlt' directory into my home directory: \u002Fhome\u002Fawwaiid\u002F\ntlt\u002F - my main directory, and the root of my website\nprivate\u002F - holds private files\nmail\u002F - holds my maildotfiles\u002F - holds my homedir .config filesprojects\u002F - all my own code projectsdocs\u002F - Various documents I then symlink a few key directories and files from my home directory into this folder. So, for example: \u002Fhome\u002Fawwaiid\u002Fmail -> \u002Fhome\u002Fawwaiid\u002Ftlt\u002Fprivate\u002Fmail\u002Fhome\u002Fawwaiid\u002F.muttrc -> \u002Fhome\u002Fawwaiid\u002Ftlt\u002Fprivate\u002Fdotfiles\u002F.muttrc\u002Fhome\u002Fawwaiid\u002Fprojects\u002F -> \u002Fhome\u002Fawwaiid\u002Ftlt\u002Fprojects\u002F And so on. So to get all my settings from one machine to another, I just need to get a copy of this 'tlt' directory and make a few key symlinks. To backup all my stuff I must back up this tlt directory. This is where unison comes in. Unison is kinda like rsync, except smarter. It keeps a database on each machine so that it can remember what the directories looked like during the most recent synchronization. So if you delete a file on one machine it knows, and if you delete it on one machine and modify it on another it can tell that there is a conflict which you must resolve by hand. After you've synchronized two hosts, resolving all conflicts, you have an identical set of files on each host. We use the notation host1->host2 meaning a synchronization between host1 and host2 initiated from host1. I have three machines on which I want an up-to-date copy of 'tlt'. They are my own computer (Feline), my website host (Mirabel), and my laptop (Jill). Generally I will sync Feline->Mirabel and Jill->Mirabel, but I could do other combinations (and often do Jill->Feline). Lets say I am using Feline and want to sync with Mirabel. If you simply run 'unison' it will interactively prompt you for the local and remote directory you wish to synchronize, and step you through the initial sync. It'll remember too, and when you re-run it will sync what it can and ask you about conflicts. Try it a couple times, its fun. It stores its settings in preference files inside of ~\u002F.unison\u002F. Here is the preference file I use for Feline->Mirabel. OK, here's another tip -- most of the time there aren't any conflicts. So there is a flag for unison which lets it run in batch mode. Guess what it is? This runs unison, from feline to mirabel, syncing my 'tlt' directory on each and skipping any conflicts and giving a report. This is exactly what we need for cron! Here is my entry in my own crontab on feline, along with some stuff to send me shorter email reports: Every now and then I will run unison without the -batch flag to resolve any outstanding conflicts. A conflict might happen if I edit a file on my laptop (jill) and on my desktop (feline) without bothering to synchronize inbetween. Resolution mode will let me see a diff and select which one I want to keep (or run a merge tool or or abort the sync or whatever I like). I tend to sync Jill by hand. Actually I have two other machines which automatically get synced, but that is just more of the same. (An up-to-date version of this will be kept at Unison Backup Setup.)",{"id":3840,"title":3841,"titles":3842,"content":3843,"level":9},"\u002Ftlt-2006.04.05-thank-god-for-backups","TLT_-_2006.04.05_-_Thank_God_For_Backups",[],"It's a good thing that I do my Unison Backup Setup... because today I need it. I awoke at 5:00AM to the pinging sound my computer makes when I get an email to my INBOX (past spamassasin and not a mailing list). Normally I can't hear the sound, but I must've had my speakers turned up to 11. Did I say \"the sound\"? Properly, I should say \"the ping ping ping Ping PING PING PING\" that kept penetrating deep into my head and driving me INSANE. That's what I meant. Dragging myself out of slumber, I lurched into the computer room and stared at my screen. Some sort of harddrive issue had caused my root partition to be remounted as read-only (generally better than writing more and more data to a broken disk). The sound, apparently, comes before an email is successfully written. It plays the sound, tries to write and fails, then decides to try fetching mail again. Oh joy! So my root drive is screwy. Not sure if it is dead yet, we'll see. For about 15 dreadful minutes I thought maybe I had actually lost my secondary drive, which holds all of my media-data and isn't backed up (because its a bit harder to back up 200 gigs than it is to back up 2 gigs). No problems though. The fsck on my root drive eliminated random libraries.... I was able to boot all the way into X, which quite surprised me, but after that random things didn't work.",{"id":3845,"title":3846,"titles":3847,"content":3848,"level":9},"\u002Ftlt-2006.04.18-sinking-into-ocaml-continuations-madness","TLT_-_2006.04.18_-_Sinking_Into_OCaml_Continuations_Madness",[],"A while back it was announced on the OCaml mailing list that someone had created a userland delimited continuations library for OCaml. I love OCaml, and I love Continuations... so I thought I'd give it a try. Ultimately going for the HTTP re-inversion trick, of course. Little did I know what sort of a rabbit hole I was going down with Delimited Continuations. On the surface it doesn't seem that that big of a deal -- they're a lot like \"normal\" continuations (using call\u002Fcc or whatnot), except better. Instead of secretly being a function invocation that never returns, they are secretly a continuation that does. At least that's what I've told myself. Unfortunately my brain doesn't like the explanations I've come across so far. It makes perfect sense when I stand back a bit, but once I start trying to pound this keyboard to produce some code nothing seems to make sense. The best introduction I found so far is a composable continuations tutorial on the Community Scheme Wiki. Some heavier readings (such as A Monadic Framework for Delimited Continuations, on which the OCaml library is based) are a bit too fast-paced. Individual sentences are fine... but taken as a whole I'm not getting it. Part of the problem is that when building Continuity (or its predecessor, Contize), I have actually been using coroutines rather than continuations, which simplify the situation a bit. So I haven't had to really deal with scheme's call\u002Fcc, let alone the various delimited versions such as shift\u002Freset. If it seems to you that I'm talking gibberish, perhaps you feel my pain. I am making a bit of progress though. With the above tutorial and a few other searches the concepts are slowly starting to sink in. Eventually I will be able to explain it all through lovely diagrams of call-stack manipulations. Basically that's all these texts are missing -- nice simple diagrams.",{"id":3850,"title":3851,"titles":3852,"content":3853,"level":9},"\u002Ftlt-2006.05.05-dom-template-fantasy","TLT_-_2006.05.05_-_DOM_Template_Fantasy",[],"I have this fantasy. You may have heard it before, it's pretty common. One day I'm designing this website for some people. Actually, I'm not designing it, I'm coding it -- I'm doing all the dynamic programming stuff. My partner in crime is a Designer (mainly graphic design, but also HTML, no programming) named Sarah, and she is doing the actual design. Together we talk to the client and she sketches some things that they like and I talk about the newest headlines showing up on their homepage, and so on. Sarah goes off and starts doing her thing and I set up a server and get my tools together and even build up an ugly prototype. Then Sarah brings over her HTML and graphics and such. Here is where the fantasy kicks in. Pay attention. She brings over her stuff and gives it to me. She points at the screen and says \"See that? That's where your headlines go\". Let's digress a bit. Many people in my position would, at this point, take her HTML file, rename it .php (or similar), rip out the HTML where she pointed and replace it with some inline code. Hopefully they wouldn't put database accesses and such there, but if nothing else they have maybe a loop that prints out each element in an array wrapped in some HTML tags. OK, un-digress. Pay attention again. I look at her HTML and see that the tag she points at is already labeled with an ID, #headlines. I need to grab the headlines from a database, but I already did that and now have them in an array. I close the HTML file she gave me. Back in my code I add this... ...and attain the desired affect. The headlines are turned into an HTML list and replace the content of the named tag. Later that day the client calls and tells us that they want the headlines on five other pages. Sarah makes the change, and gives me the HTML. I do nothing. Sarah has this cool navigation bar she set up for them... but it is tedious to add it to each page and even more tedious to differentiate each snippet so that the currently-viewed page is highlighted. \"No problem\", I tell her. \"Give me one page with the navigation bar as you like it,\" I say. A few more twitches of the keyboard and I make all the pages inherit the key piece of HTML. For highlighting the current page, I do something like: Sarah never looks at my code. She doesn't have to see it, doesn't have to dodge it or carefully copy\u002Fpaste it in her WYSIWYG designer. I don't have to cry over \u003C turned into &lt;. She removes some of the headlines, I do nothing. She adds a link to the navigation menu, I do nothing. It's not much of a fantasy because I've already implemented it. Taking inspiration from behaviour.js, along with the wonders that CPAN provides (namely cpan:HTML::TreeBuilder) it is not a very difficult task. Others, in fact, are already using DOM manipulation for templating systems (TAL and its relatives, cpan:HTML::Seamstress)... but none quite this way.",{"id":3855,"title":3856,"titles":3857,"content":3858,"level":9},"\u002Ftlt-2006.06.27-djabberd-ad-authen","TLT_-_2006.06.27_-_DJabberd_AD_Authen",[],"Tags: Perl, Code, SWCA, DJabberd, AD On Tuesdays I work from home for SWCA (my current employer). This gives me a chance to do code without being interrupted every 15 minutes by random things. Lately I've been working on the code behind our website re-design, which is pretty interesting. Today, however, I took an hour or two to set up a better Jabber server. Up until now we've been using the more or less \"default\" jabber server provided by jabber.org. It is horrible to configure... I can generally figure out how to make things work, but couldn't for the life of me get conferencing going. Then bright and early this morning I gave DJabberd another try. A previous half-hearted attempt had failed, but this time it worked wonderfully! I started with SixApart's example server, and then tweaked from there. It authenticates off of our Active Directory, and automatically adds all users who have logged in once to everyone else's buddy list. Now I only need to get the SSL certs working. So I'm now doing Active Directory authentication in a couple places. I've made use of the cpan:Authen::Simple::ActiveDirectory module, which is fantastic. Authentication is as easy as: Perhaps even cooler is that the minimal interface to cpan:Authen::Simple makes it simple to swap out other authentication methods.",{"id":3860,"title":3861,"titles":3862,"content":3863,"level":9},"\u002Ftlt-2006.06.28-renew-all","TLT_-_2006.06.28_-_Renew_All",[],"Tags: Code, Perl, Library, Scrape I just got a late notice from the Phoenix Public Library. Being overdue on my library books, movies, and anything similar is a long family tradition handed down from generation to generation. One of the only things that could keep Mom from taking us to the library is not being able to find enough spare change to pay for the fines. Let us then overcome our nature through the use of technology. The library has an online renewal tool. Therefore... cpan:WWW::Mechanize to the rescue! Stick that in your pipe and smoke it. Or maybe stick it in your cron job. I actually used cpan:WWW::Mechanize::Shell to generate this, which I highly recommend. This solution isn't robust at all though... I don't check to make sure that any of my web requests actually worked or that they are going to the correct place. That's left as an exercise for the reader :)",{"id":3865,"title":3866,"titles":3867,"content":3868,"level":9},"\u002Ftlt-2006.07.06-mairix-mail-search","TLT_-_2006.07.06_-_Mairix_Mail_Search",[],"After needing to find some old email and getting tired of waiting for grepmail to complete its search, I went out and found a mail indexer. The one I settled on is called Mairix, and so far so good. Here is my setup. First, I have the configuration file for Mairix. My mail is in ~\u002Fmail\u002FYYYY\u002FMM\u002Fmboxfile (where mboxfile has a name based on what mailing list or whatnot it contains). So my .mairixrc looks like: ... which is to say, index all of my mail, and when I do a search put the results into the '\u002Fhome\u002Fawwaiid\u002Fmail\u002Fsearch' folder. Oh, and store your DB in .mairix_database. Next, I wrote a script called search-mail, which I'll use as a wrapper to be more mutt friendly. Also it will allow me to switch which mail indexer I use if the need arises. Plus I will probably add features and shortcuts here. Here is search-mail so far: And yes, I could have done that with a bash script. But what fun is that? Finally, there is the line that I've added to my .muttrc which lets me do searches from mutt. It is: This command is hooked into M right now, though I'll surely change that to something much easier. It runs mail-search, which prompts for the search terms and then forks the search. Then I am put into the folder in read-only mode so I don't accidentally delete things (though that might not be necessary or good). Oh yes, and I dropped the simple command \"mairix\" into my cron to update the index. The thing runs quite fast and is very fun! I should index all my data for quick searching! (Beagle, why must you forsake me?)",{"id":3870,"title":3871,"titles":3872,"content":3873,"level":9},"\u002Ftlt-2006.07.19-vegetable-thin-lament","TLT_-_2006.07.19_-_Vegetable_Thin_Lament",[],"(as sent to the Nabisco World Website) Dear Vegetable Thins Creators, While I very much enjoy your crackers, I do have one thought on the matter. With each box I purchase I await the initial opening with a bit of anxiety. You see, each box is different in its degree of crunchyness. The good boxes, the boxes I am overjoyed to open, contain dark crisp satisfying crackers. The ones that I am not so thrilled about... perhaps not cooked quite so long they contain lightly colored and slightly greasy crackers which seem to get stale faster (perhaps because I don't eat them quickly enough!). I am often tempted to throw them in the oven to finish their cooking process! So, if there is any choice in the matter, as a customer I implore you to tend towards the dark side! Beth thinks they are more likely to respond if I send it to them via snail-mail, but we'll soon find out.",{"id":3875,"title":3876,"titles":3877,"content":3878,"level":9},"\u002Ftlt-2006.07.30-cygwin-rocks","TLT_-_2006.07.30_-_Cygwin_Rocks",[],"Oh how I love you Cygwin... let me count the ways. Doing various system and programming contortions using the GUI is numbifying, and moreso when I am trying to work far away from the machine to-be-manipulated. Usually it ends up along the V lines -- VPN, VNC, and maybe some Vort Vorwarding. I found myself in that situation this weekend, but had a bit of foresight on Friday and averted the pain quite a bit. A couple things make Cygwin fantastic. First and foremost is getting all my tools back. I can cat and tail and vim and bash to my hearts content. Throw in a little Perl and I'm a happy duck. Working with Oracle currently, so I even get to use sqlplus command-line goodness and pipe it SQL and all sorts of mean and nasty things. Great for when you are still on the machine. But the coolest, most fabulous, most wonderousiful thing of all... sshd, running as a windows service. Here I am sitting at home, SSH-ed in to my Evil Windows Server. I get a bash prompt and go to town, practically forgetting that I'm on a Windows machine at all.",{"id":3880,"title":3881,"titles":3882,"content":3883,"level":9},"\u002Ftlt-2006.08.22-continuity-ascii-art","TLT_-_2006.08.22_-_Continuity_ASCII_Art",[],"Drawing up some ASCII art diagrams of the internal Continuity control flow, these are my two best variations so far. First is a bit too tall: +---------+      +---------+      +--------+\n| Browser | \u003C--> | Adaptor | ---> | Mapper |\n+---------+      +---------+      +--------+\n^               |\n|               |\n+--------------------+               |\n|                                    |\n|        +-------------+-------------+\n|        |             |             |\n|        V             V             V\n|   +---------+   +---------+   +---------+\n|   | Session |   | Session |   | Session |\n|   | Request |   | Request |   | Request |\n|   | Queue   |   | Queue   |   | Queue   |\n|   |         |   |         |   |         |\n|   |    |    |   |    |    |   |    |    |\n|   |    |    |   |    |    |   |    |    |\n|   |    V    |   |    V    |   |    V    |\n|   |         |   |         |   |         |\n|   +---------+   +---------+   +---------+\n|        |             |             |\n|        V             V             V\n|   +---------+   +---------+   +---------+\n|   | Current |   | Current |   | Current |\n|   | Request |   | Request |   | Request |\n|   +---------+   +---------+   +---------+\n|        |             |             |\n|        V             V             V\n|    +------+      +------+      +------+\n|    | Your |      | Your |      | Your |\n|    | Code |      | Code |      | Code |\n|    +------+      +------+      +------+\n|        |             |             |\n|        V             V             V\n+--------+-------------+-------------+ Too tall because it doesn't quite fit on a 24\u002F25 line high terminal. Here is my revised version, which not only fits but is also more accurate in the relationship to the \"Your Code\" nodes. +---------+      +---------+     +--------+\n| Browser | \u003C--> | Adaptor | --> | Mapper |\n+---------+      +---------+     +--------+\n^              |\n|              |\n+---------------------+              |\n|      +-------------------+---------+----------+\n|      |                   |                    |\n|      V                   V                    V\n|    +---------+         +---------+          +---------+\n|    | Session |         | Session |          | Session |\n|    | Request |         | Request |          | Request |\n|    | Queue   |         | Queue   |          | Queue   |\n|    |    |    |         |    |    |          |    |    |\n|    |    V    |         |    V    |          |    V    |\n|    +---------+         +---------+          +---------+\n|      |                   |                    |\n|      V                   V                    V\n|  +-----+   +------+   +-----+   +------+   +-----+   +------+\n|  | Cur |\u003C->| Your |   | Cur |\u003C->| Your |   | Cur |\u003C->| Your |\n|  | Req |   | Code |   | Req |   | Code |   | Req |   | Code |\n|  +-----+   +------+   +-----+   +------+   +-----+   +------+\n|     |                    |                    |\n|     V                    V                    V\n+-----+--------------------+--------------------+ (\"Cur Req\" == \"Current Request\")",{"id":3885,"title":3886,"titles":3887,"content":3888,"level":9},"\u002Ftlt-2006.08.28-multi-column-table-keys","TLT_-_2006.08.28_-_Multi-Column_Table_Keys",[],"A little over a year ago I re-wrote the db-oop layer of my work project. The previous system was a bit much for me, and my replacement simplified things significantly (though surely at a run-time cost, but not noticeable to users). Unfortunately I was designing pretty much all of the tables that the application used. I say unfortunately because it means that all of the tables were arranged in a way that I might generally arrange things -- each table had a single column primary key. Well now we're moving to a new database system with which the app must interface. Besides gutting most of my app, it means that I now get to deal with tables which have two or more columns used to determine a unique row. Such a simple assumption as a single-column primary key permeates the implementation much more deeply than I had originally guessed! I've got it working pretty well now, but at first it felt a bit overwhelming to have to tear apart this code on which everything depends and which hasn't needed to be touched for so long.",{"id":3890,"title":3891,"titles":3892,"content":3893,"level":9},"\u002Ftlt-2006.10.19-ajax-long-pull-(almost-http-push)","TLT_-_2006.10.19_-_AJAX_Long-Pull_(almost_HTTP_Push)",[],"Tags: Perl, Continuity, AJAX, HTTP Push, Code I've been doing some fun things with Continuity in conjunction with scott to prepare for Desert Code Camp. The latest is combining XmlHttpRequest with Continuity in a new way, simulating HTTP Push. It's really easy, actually. I put together a chat application which you can see in the Continuity Examples Directory. When you first go to the page, it immediately sends a background GET request back to the server, which actually opens a second session. That session then blocks, waiting for a variable to change to indicate that there are new messages. So I have this code which watches for new chat messages: Then, when the mainloop gets a new message, it just sets $got_message = 1 and all the watchers are triggered, giving all the clients the new message. For fun, I opened up four webbrowsers (FF, IE6, Opera, and Konqueror) and recorded a chat between all four -- Four Browser AJAX Long-Pull (fake Push) Demo. This is not really very robust -- but it should only take a few properly placed timeouts to fix that. I hear proxies can wreak havoc on this method too, so keep that in mind.",{"id":3895,"title":3896,"titles":3897,"content":3898,"level":9},"\u002Ftlt-2006.10.21-tempe-alien-landing-base-construction","TLT_-_2006.10.21_-_Tempe_Alien_Landing_Base_Construction",[],"The City of Tempe seems to do a good job of keeping the town a thriving place, full of interesting events and sites. They have an advantage with the main ASU campus bringing lots of active youth -- but they like to push the envelope by doing things like damming the dried salt river and re-filling it to make their very own Teme Town Lake. Right off the lake they've been building (or at least, they must have signed the permit) a very large and pointy building: ... which I can only imagine is a giant alien transit facility. The City, after consulting with a panel of futurist experts, declared \"We, for one, welcome our alien overlord tourists.\" At least that's what I thought. Beth thought it was some sort of giant slaughter-house. Perhaps, I reply, to slaughter the alien invaders! Alas, I finally get around to looking it up, and it seems to be nothing more than the new Tempe Center for the Arts. Art gallery, meeting area, and the main event -- a giant theatre. Because even giant alien overlords need art!",{"id":3900,"title":3901,"titles":3902,"content":3903,"level":9},"\u002Ftlt-2006.11.19-oddmuse-module-tinkering","TLT_-_2006.11.19_-_Oddmuse_Module_Tinkering",[],"Tags: Oddmuse, Wiki, Blog, Tags While looking at the Chicago Hackation wiki I noticed that they had this lovely sidebar which listed the incoming-links for a page. That seemed pretty cool, so I created the Oddmuse Ref Links module which does just that in the Oddmuse sidebar. Seems nice for visitors (or even myself) to get a more structured view of the pages, or at least the immediate neighborhood of pages. That worked well on my wiki pages, but didn't do much for my blog-like pages (such as this one). So I stopped putting it off and implemented an Oddmuse Search Tags module. Now I include a line of tags on any page, and each tag is turned into a link that searches for other pages with the same tag. Very straightforward and minimal implementation of tagging, I say. Just a few more features and it might be hard to tell that this isn't Just Another Blog!",{"id":3905,"title":3906,"titles":3907,"content":3908,"level":9},"\u002Ftlt-2006.11.25-detecting-reload-and-back-browser-actions","TLT_-_2006.11.25_-_Detecting_Reload_and_Back_Browser_Actions",[],"Tags: HTTP, Back Button, Web Application Structure Detecting when a user uses their Reload or Back buttons in a web application isn't very difficult, and the payoff in usability can be quite large. One of the most-heard complaints about web applications is back-button brokenness.",{"id":3910,"title":3911,"titles":3912,"content":3913,"level":15},"\u002Ftlt-2006.11.25-detecting-reload-and-back-browser-actions#disable-caching","Disable Caching",[3906],"This first step towards detecting a press of the back-button is to disable client side caching. When a browser caches the page, the back-button will merely display the cached version and the server is never notified. When the user then uses the cached page, the application and the user can become confused about what data is being manipulated. While adding meta tags to HTML is helpful, the best way to stop caching is right in the HTTP headers. I like to add: Cache-Control: private, no-store, no-cache\nPragma: no-cache\nExpires: 0 which gets the job done. I've also seen the Expires: header set to some date in the distant past, which also works.",{"id":3915,"title":3916,"titles":3917,"content":3918,"level":15},"\u002Ftlt-2006.11.25-detecting-reload-and-back-browser-actions#assign-pageid-to-each-output","Assign PageID To Each Output",[3906],"Once you have caching disabled, you should next assign a unique Page Identifier (PageID) to each page the application outputs. I generally try to make this as short as possible, and generally use Hexadecimal or Base-64 to fit the ID in less characters. Also attach this PageID to each input back into the program. Add it as a GET parameter on each link, and as a hidden input for each form. It is ugly but necessary. This will allow us to know which page generated which program input  -- in other words, which page the user was looking at when they send a given request. Each PageID should be added to the session information so that we can track what pages have already been displayed.",{"id":3920,"title":3921,"titles":3922,"content":3923,"level":15},"\u002Ftlt-2006.11.25-detecting-reload-and-back-browser-actions#use-pageid-to-detect-reload-back","Use PageID to Detect Reload \u002F Back",[3906],"With the PageID mechanism in place you have enough information to detect browser Reload and Back Button actions. Now, with every input sent by the user to the application, the PageID will indicate whether the user is requesting a page they've already seen. If the received PageID is the one we just sent out, then the user pressed Reload. If the received PageID was generated before the most recent one, then the user pressed the Back button (or otherwise returned to an old page).",{"id":3925,"title":3926,"titles":3927,"content":3928,"level":15},"\u002Ftlt-2006.11.25-detecting-reload-and-back-browser-actions#avoiding-the-re-post-prompt","Avoiding The Re-Post Prompt",[3906],"One thing that I've annoyingly run into is the result of a user pressing the Back button after submitting a form via POST. Most browsers, following the standards and being ever so helpful, prompt to ask whether the data should be re-POSTed. This is because, well, generally it is a bad idea to re-POST data. We, however, don't mind so much since it can be detected. After a bit of research, it seems the best method to overcome this prompt is by doing a redirect right after the POST using the 303 HTTP Status. The 303 Status means \"See Other\" and does just what we want -- it redirects the user transparently without prompting them or caching the redirect. This status code was created for just this purpose as part of HTTP 1.1 -- if you are working with a pre-1.1 browser you may want to send Status 302 instead.",{"id":3930,"title":3931,"titles":3932,"content":3933,"level":15},"\u002Ftlt-2006.11.25-detecting-reload-and-back-browser-actions#the-downside","The Downside",[3906],"Having a PageID as part of the GET or URL in each request is ugly. Worse (or perhaps as an elaboration on the truth behind the first statement), it is a meaningless number for users and can only cause them pain. When the user bookmarks or copy\u002Fpastes the URL the PageID goes along too, forever attached. This is very anti-REST, but of course this whole thing technique is pretty anti-REST :) Make sure your application does the Right Thing for requests with unrecognised PageIDs, and expires the PageIDs (removes them from the list of used PageIDs) quickly.",{"id":3935,"title":3936,"titles":3937,"content":3938,"level":9},"\u002Ftlt-2007.01.14-son-of-suckerfish-and-ie","TLT_-_2007.01.14_-_Son_Of_Suckerfish_and_IE",[],"I've been working on the release of the new website for my work at SWCA Environmental Consultants, which has been a long time in the making. During the development of the site they wanted drop-downs for navigation (against my clearly stated opinion :) ), and I selected Son of Suckerfish for the technique. Son of Suckerfish (or a near variant) is the nicest drop-down setup I've seen so far. It works with pure CSS on Firefox and other standards compliant-ish browsers. One of the things it depends on is come css on the  attribute of a LI tag, which IE doesn't support. So there is a very small amount of Javascript for this case. Generally a very clean and simple solution for HTML dropdowns. Implementing it worked out perfectly, and I tested it out in all the major browsers without issue. A few months go by and, I admit, testing on IE6 fell by the wayside a bit... at some point it stopped working very well for that platform. The drop-downs were going away much too soon... as if the onMouseOut code was being executed too fast (in-between menu items). Which has worked well so far... though I wouldn't be surprised if I could find a better way. I don't like the way I assigned 't = this', seems like there should be a better way to do that. Plus, I wouldn't be surprised if it is a very minor memory leak. The timeout gives the mouse a chance to roll onto the next menu item, which adds yet another 'sfhover' class to the li tag. When the timeout is triggered, it only removes one. The whole thing flickers in my current ies4linux setup, but looks fine in vmware. On another note, I discovered that ies4linux has alpha IE7 support! Just install one of these betas (I'm using 2.5-beta4) with '--beta-install-ie7'.",{"id":3940,"title":3941,"titles":3942,"content":3943,"level":9},"\u002Ftlt-2007.01.17-ad-auth-on-oracle-portal-using-password-filters","TLT_-_2007.01.17_-_AD_Auth_on_Oracle_Portal_Using_Password_Filters",[],"We're becoming quite the Oracle shop at work. The accounting package we recently purchased actually encompasses a lot more than just ledgers -- it helps us track things such as individual projects. And it comes with all sorts of Oracle goodies, including Oracle Portal. One thing that I'm working toward is a single username and password for everything. Programs will all ultimately depend on the Active Directory authentication for this, and most things already do (such as our TLT - 2006.06.27 - DJabberd AD Authen setup). The Oracle Portal is one spot where this will be very useful... but after trying to integrate AD with Oracle's LDAP directly and failing (turns out there are some required pieces which our Oracle install lacks), I decided on a different route. In comes the idea of using Microsoft's Password Filters. MS introduced a customizable hook into their password-change chain so that more or less strict passwords can be enforced. So the \"trick\" is to insert an item into this filter chain which doesn't filter, but instead takes the new password and goes off changing the user's password in other systems. A back-door on purpose! After thrashing around with my own C version of some C++ examples of doing this (mostly I had trouble with the unicode->ANSI conversion... so spoiled by Perl...), I finally remembered PasswdHK, a generic hook that just calls an external program. Perfect! Tie that up with a little perl, wrapped and ready to distribute with PAR (which I had to modify a bit. I need to wrap up my mod and send it upstream...). Like magic, when users are set up or change their password they get all their Oracle Portal goodness.",{"id":3945,"title":3946,"titles":3947,"content":3948,"level":9},"\u002Ftlt-2007.03.18-cheap-camera-and-kitties","TLT_-_2007.03.18_-_Cheap_Camera_and_Kitties",[],"While at Walgreens I spotted a super cheap USB digital camera (I was supposed to be buying something else) and I couldn't resist... so I am now the proud owner of a 16mb camera! It is one of those keychain things, though I'm probably going to remove the keychain mount. I haven't mentioned them before, but Beth and I now have two cats, Mia and Miko. Mia is 2 years old, and Miko is 7-months (pictured here perched in the window). Both are interesting kitties, pretty vocal and active. We got Mia at Christmas to keep the bunny entertained, but when the bunny died (and after we got over the initial sadness) we bought Miko to keep Mia company. You can tell that we're new cat owners... because we thought they'd be instant pals. Dropping the box filled with Miko in the middle of the room and opening the lid resulted in instant hissing and running rather than instant friendship... but after a week or two they tolerated each other and after a month they now play and groom together. When I'm programming (I work from home a day or two each week) the cats love to hang out with me in the laboratory. Mia will sometimes get in my lap, but mostly sleeps on Beth's desk. Miko, on the other hand, gets on my lap or on the back of my chair and then uses my arms as balancing beams to get to what she must imagine is super fun -- the keyboard. She only seems to like it because I am touching it and, more importantly, because that is where my hands are and therefore where she can be to be petted. Miko is not a very good programmer. Vim, my editor of choice, happens to bind just about every single key on the keyboard to some devastating editor feature -- dGwq and half my program is gone :) I've always thought that these entries needed more photos. So maybe I'll be able to get a few using this camera. I can take 20 at a time like the above -- high resolution mode! Someday I'll actually go buy a real camera instead of borrowing other people's all the time... they're getting so cheap now for a good quality.",{"id":3950,"title":3951,"titles":3952,"content":3953,"level":9},"\u002Ftlt-2007.04.11-note-to-self...-er...-google-calendar","TLT_-_2007.04.11_-_Note_to_Self..._er..._Google_Calendar",[],"A few years ago, while doing some contract work, I created a simple yet effective way to monitor my time. The idea was taken from some other command line junkie, but I simplified it a bit. I dropped a command called \"L\" into my ~\u002Fbin directory that looks like this: Well... in truth this is what it evolved into. The command has two modes, logging and tailing. In logging mode, it takes the rest of the line, adds a timestamp, and shoves it in a logfile. In the tail mode it shows you the tail of all available log files (they are created on a per-host basis), sorted and formatted for human consumption. This creates a quite grep-able log of the things I do. Typical usage: Speaking of not forgetting things, I'm trying to use Google Calendar in conjunction with Beth (using a shared calendar) to keep track of our schedule. It has a pretty good UI, and Beth uses gmail all the time anyway. I created a separate calendar to take some random notes. You can see where this is going... can't you? Looking at cpan:Net::Google::Calendar, the whole thing is quite easy. First I converted the 'L' script to perl (or, partially converted it). Then I added just a bit more to get: ... and now I can use my good old 'L' command from any random terminal, and if it is properly connected to the internet then it'll post up my note. Of course that brings up the point that I might not have internet available (like on my laptop or something)... but I'll leave other forms of syncing as an exercise for the reader.",{"id":3955,"title":3956,"titles":3957,"content":3958,"level":9},"\u002Ftlt-2007.06.20-in-the-district","TLT_-_2007.06.20_-_In_The_District",[],"One day a week and a half ago Beth and I up and moved! Well... I suppose it took a little more planning than just that, but that's what it feels like. We are now living out our dreams in Washington, DC. I've started a new job over at liquidation.com which is pretty cool so far. An all Perl shop, which is what I was going for. Unfortunately the timing of the move has caused me to miss YAPC::NA Yet Again :(. Let's see... our kitties are doing well. In fact, Mia seems to be happier here. Perhaps the very long trip convinced her that life is worth living! Though I don't think they liked traveling they did it quite well -- meowed a bit and then slept all day while we drove. Pictures coming soon.",{"id":3960,"title":3961,"titles":3962,"content":3963,"level":9},"\u002Ftlt-2007.07.15-chomping-and-editing","TLT_-_2007.07.15_-_Chomping_and_Editing",[],"Just posted the sketch for two new Projects. The first is Chompie, which I've actually got a proof-of-concept going for. It chops up your program until it is as small as it'll go while still passing (or failing!) some test. The idea is to help debugging, for example -- it could spit out the exact code that fails some test in a specific way. The second is the one I'm more excited about as far as an actual impact on my life -- Oddmuse Editfile is a simple oddmuse plugin which will let me, among other things, put some of my source code directly into wikiland. Changes from the wiki will be checked into darcs for review. It is documentation-centric, so that I can put things into POD and they'll show up nice and neat on my wikis. This weekend is the ICFP Contest 2007! Jason Woys and I will be doing it, with some others maybe dropping in. They've got a pretty good teaser going on in the blog linked to from http:\u002F\u002Fwww.icfpcontest.org\u002F... looks like it's going to be super fun :) I even took the day off Friday.",{"id":3965,"title":3966,"titles":3967,"content":3968,"level":9},"\u002Ftlt-2007.08.08-hey...-i-just-heard-about-that","TLT_-_2007.08.08_-_Hey..._I_Just_Heard_About_That",[],"The other day Liz showed me a new book that she got, Drawing on the Right Side of the Brain. Pretty interesting book discussing how to take what you see in the world and put it down on paper. Then today O'Reilly sent me a link to their new website based off of their new book, Beautiful Code. I've looked at this book at Border's and want it... it seems really cool. Well on their website they have articles about code, and one called Design Sense by Michael Feathers mentions the drawing book that Liz has. This follows a general observation I've seen: when you are first exposed to an idea or fact, the odds of you recognising it around you significantly (exponentially?) increase. I learn about this book and I pick it's title out of the article. You learn a new word and then see it a dozen times in two days. I figure it's either of two things. First, the thing is suddenly popular. Maybe Liz saw her book on TV and the author saw it too, which made him think of it. The second way is pattern matching. Once you've noticed the new word, picking it out becomes natural.",{"id":3970,"title":3971,"titles":3972,"content":3973,"level":9},"\u002Ftlt-2007.08.24-random-tips","TLT_-_2007.08.24_-_Random_Tips",[],"Today while reading some random article I noticed someone doing Which is to say, attach strace to the running process numbered 12345. So cool! I've always like strace, but apparently didn't take enough time to read the man page to learn this usage. I'm slowly reading Meta Math! by Gregory Chaitin and am enjoying it very much. Today he proved that there cannot be a purely algorithmic way to prove a given program is as simplified as possible. From that a simple proof of the halting problem will follow, I believe. His writing is very enthusiastic and inspiring, drawing attention to some of the most fascinating parts of mathematics. Plus he loves to use exclamation marks! The tone reminds me of Feynman. So here's the tip: don't try to find an algorithm to provably simplify any given program to it's most minimal form, because it won't work out very well. Stick with a heuristic approach. A few days ago our apartment building's fire alarm went off before work. I decided that it might be a good exercise to take the kitties with us, even though the odds of it being a real fire rather than a false alarm were extremely low. After managing to shove Mia into the carrier we decided there was no way they'd both go in there. So I grabbed Miko and put her harness on and proceeded to carry her out into the hallway. The blaring alarm in the hall wasn't the sort of thing that Miko wanted to be involved with, so when I stepped out with her in my arms I quickly learned how little control I actually had over her. It was like an invisible wall in my doorway that she refused to go beyond, and in this case it meant she had to go through me to get back inside. The scratches on my arm and neck are actually almost gone now, but the tip stands: if you are going to rescue a cat from a pretend fire, do your best to find a box to shove her in and try very hard to avoid carrying her out in a more direct fashion! Your .vimrc file can have conditional sections based on environment variables, such as $HOSTNAME. With that in mind I've been able to create a unified .vimrc to use both at home and work. The only real difference is that at home I generally avoid all tabs, whereas at work tabs are the standard for indenting. When doing the T9word mode on cellphones the '1' key will do punctuation. Plus they often have smilies in their dictionary! And finally a tip inspired by a recent Paul Graham essay. When reading code you don't see all the pieces that were left out. Therefore, without knowledge of this non-present code, you will understand code you read less than code you write. This applies to creative mediums well beyond code.",{"id":3975,"title":3976,"titles":3977,"content":3978,"level":9},"\u002Ftlt-2007.10.05-added-darcs-rss-feeds","TLT_-_2007.10.05_-_Added_Darcs_RSS_Feeds",[],"I've cleaned up and expanded my RSS feeds a bit. So now I have three main feeds: Blog FeedSite FeedProject Update (darcs) Feed The first is a better URL for the feed of this blog. The second is a feed for the whole wiki (I'm probably the only one who cares about that one). The third... that's the fun one! I took the darcs2rss script from the internets and made some slight modifications. Then I constructed a program that goes through my projects directory and looks for all of the Darcs repositories, generating a feed for each one. As a bonus, it also takes the most recent entries from all the individual projects and creates an ALL feed, which is the third feed above. So subscribe to that feed and you'll be absurdly informed of what I'm up to, code-wise. For the feed of individual projects, look in http:\u002F\u002Fthelackthereof.org\u002Fdarcs-rss\u002Ffeed\u002F. On my TODO list is to make the feeds link to an online diff, as that seems like most human-friendly thing to do.",{"id":3980,"title":3981,"titles":3982,"content":3983,"level":9},"\u002Ftlt-2007.10.16-pittsburgh-perl-workshop-review","TLT_-_2007.10.16_-_Pittsburgh_Perl_Workshop_Review",[],"This last weekend was the 2007 Pittsburgh Perl Workshop, where I gave a talk on Continuity. Though it was my first Perl conference, going to other nerd events had prepared me for what it would be like. Even so I thought it was fantastic -- you just gotta love those Perl People! I talked to several people about Continuity, so hopefully I'll be getting some regular users and feedback. I found a bug in the most recent release, and have decided to roll back the installer... so I need to get another release out there. One fun thing is an improvement I made to the Continuity wiki - I got the wiki-to-darcs (both-way) gateway going. I knows specifically about POD rendering , so it looks good as a webpage. See the Continuity::Mapper page as an example. If you edit the page, the change actually gets checked into darcs and then I can choose to pull it into my main branch. I still need to create a cron job to keep it up-to-date, but otherwise it seems to work swimmingly. So now I don't have to have my documentation in two different places!",{"id":3985,"title":3986,"titles":3987,"content":3988,"level":9},"\u002Ftlt-2007.11.30-mysql-row-level-security","TLT_-_2007.11.30_-_MySQL_Row_Level_Security",[],"Tonight I am doing a bit of work on the EPFarms User Panel and Effin, our financial database. The Panel is a Continuity application running under FastCGI and suexec. The security model is different from most other web applications I've done, we use suexec to run the application as the individual Eggplant Farms user. Philosophically, running the panel as the user is an extension of our overall security model, which is to build as directly upon the unix security model as we can. The interesting aspect of this is that, since the panel is running without any special privileges, the user could modify or replace the panel and still have all the same security access. They also have all the same access from the command line. Sharing dynamic data with the user, such as their current account balance, is a bit tricky. We also need the ability for the user to modify some of their own metadata. Our current plan is to create command line tools that allow them user-specific access to our data, which is stored in MySQL. Another way, the one that I'm going to switch to after tonight's research, is to utilize some new features of MySQL 5. We'll use views to emulate row-level security, and MySQL's own column-level security to allow them to directly read, and as appropriate write, to our database. Though it's always handy to have a command line interface, the extra intermediary was a bit cumbersome. Here's how to do it. Lets say we have a single userinfo table, which just holds their username, unix id, full name, and emergency contact info. And heck, let's insert a few rows. Now we create a view, limiting to the current logged in user with the USER() function. Finally we grant some access to user 'awwaiid' (though really we could grant access to '%' if we were so inclined). Now when I log in as awwaiid I have access to my own rows, and can update my full name and contact info. The panel application logs into the database as the user, accessing and editing their data in a much more direct fashion than the command-line-wrapper method.",{"id":3990,"title":3991,"titles":3992,"content":3993,"level":9},"\u002Ftlt-2008.01.02-events-vs-actions-in-ui-code","TLT_-_2008.01.02_-_Events_vs_Actions_in_UI_Code",[],"Happy New Year! I've been grappling with a concept for a long time now (years), and thought I'd put it down here to cast about for insight. Here is one way to handle UI events: Here is another: The first is quite imperative. Show the page. Give me the result. Examine the result. Act. The second is much more declarative. I declare that were such an action to occur, this is what you should execute. The second is the way that Seaside handles things. I'm not quite sure why I'm reluctant to adopt this method... perhaps simply my lack of experience with this construct is to blame. I think it's some sort of voice in the back of my head that doesn't like it because it is a bit too much like desktop GUI callbacks. But why should that be a bad thing? It seems to work just fine for those applications. I think I'm thinking about this too much.",{"id":3995,"title":3996,"titles":3997,"content":3998,"level":9},"\u002Ftlt-2008.03.30-making-music","TLT_-_2008.03.30_-_Making_Music",[],"I love to create and build -- lately I've made a few songs! My friends like to play guitar and sing, and I play the harmonica and am learning guitar. So here are my recent creations (all with the help or in conjunction with friends): UmbrellasZombie LoveImmaterial Things Only the middle one has a recording posted so far, but I'll get recordings of the others sooner or later. More to come I hope :)",{"id":4000,"title":4001,"titles":4002,"content":4003,"level":9},"\u002Ftlt-2008.05.12-tree-style-tabs","TLT_-_2008.05.12_-_Tree_Style_Tabs",[],"I've been using the Tree Style Tabs Firefox extension for a few months now, and love it! Having vertical tabs has always been fabulous, ever since I first encountered them in Galeon. The chrome-css hack that I have been using for the last few years in Firefox stopped working in Firefox 3 (beta), so I went exploring and am very glad I did. Not only does the Tree Style Tabs extension give my my vertical tabs, it also gives me (surprise surprise) a tree of them! Each has it's own browsing history, and subtrees can be collapsed and reordered and all that wonderful goo. Just now I was playing around with the settings and thought I'd try the auto-hide feature. I'm not sure I'll keep it because there is a slight flicker that bothers me... but it is neat none-the-less! The tab bar is hidden, and then when I mouse or keyboard activate it the bar appears translucently on top of the page. It might need some kinks worked out (or perhaps there is some other cause for the flickering), but I think I like it! Highly recommended.",{"id":4005,"title":4006,"titles":4007,"content":4008,"level":9},"\u002Ftlt-2008.06.30-more-photo-goodness","TLT_-_2008.06.30_-_More_Photo_Goodness",[],"Tags: garden, camera, photos, cats I got another new camera!  The last two didn't work out for very long, but this one has promise. I won it at our recent Corporate Bowling event... it was clearly my best score ever at 167. I got second place and thus the camera. Woot! This first image is one of Sophia's flowers. Sophia is the rose bush that Beth got from my family in condolence of her appendectomy. After almost killing her (Sophia, that is), I've nursed her back to health and we've been rewarded with new blooms. Other than random events and trips, one thing I'd like more photos of is my balcony garden.  Time lapse or something fun. I sit there and stare at the thing enough... I may as well share the green joy with the world! Lets see... what what other sorts of boring photos do people put on their blogs... CATS! I must have some of those somewhere around here...",{"id":4010,"title":4011,"titles":4012,"content":4013,"level":9},"\u002Ftlt-2008.07.08-walkabout","TLT_-_2008.07.08_-_Walkabout",[],"Some of my family came to visit this weekend, and we did a bunch of sight-seeing. Here are the distance estimates, this is definitely a lower-bound of the amount we walked. I tried to include walks that I know everyone did, and left off a bunch of random trips to the store. Distances are in miles.",{"id":4015,"title":4016,"titles":4017,"content":4018,"level":15},"\u002Ftlt-2008.07.08-walkabout#day-1-zoo-and-fireworks","Day 1 - Zoo and Fireworks",[4011],"3.1998 to and through zoo0.3037 from dupont metro to apartment3.6359 to fireworks and back TOTAL: 7.14",{"id":4020,"title":4021,"titles":4022,"content":4023,"level":15},"\u002Ftlt-2008.07.08-walkabout#day-2-smithsonian-and-folk-festival","Day 2 - Smithsonian and Folk Festival",[4011],"0.3037 from dupont metro to apartment1.9614 Smithsonian and folk festival0.3037 from dupont metro to apartment1.0309 to play music and back TOTAL: 3.6",{"id":4025,"title":4026,"titles":4027,"content":4028,"level":15},"\u002Ftlt-2008.07.08-walkabout#day-3-national-cathedral-and-arlington-cemetary","Day 3 - National Cathedral and Arlington Cemetary",[4011],"0.2353 apartment to bus stop0.7487 at cathedral0.6753 at Arlington Cemetary0.3037 from dupont metro to apartment TOTAL: 1.96",{"id":4030,"title":4031,"titles":4032,"content":4033,"level":15},"\u002Ftlt-2008.07.08-walkabout#day-4-library-of-congress-and-memorials","Day 4 - Library of Congress and Memorials",[4011],"0.8012 at library of congress3.3956 at memorials TOTAL: 4.2 GRAND TOTAL: 16.9 miles I'm guessing that adding in more detail could easily add another mile or more. In the end I bet we walked about 20 miles in all. When you trade a car for your feet, make sure you have good shoes!",{"id":4035,"title":4036,"titles":4037,"content":4038,"level":9},"\u002Ftlt-2008.07.24-oscon-lighnting-talk","TLT_-_2008.07.24_-_OSCON_Lighnting_Talk",[],"Tags: OSCON, perl, continuity, lightning talk, oscon2008, REPL At the last minute I ended up giving a Lightning talk at OSCON 2008 (in the Perl track). I showed my Devel::REPL + Continuity debugging tool. Here are my notes:",{"id":4040,"title":4041,"titles":4042,"content":4043,"level":9},"\u002Ftlt-2008.10.21-slow-android-development","TLT_-_2008.10.21_-_Slow_Android_Development",[],"It's been over 4 hours since Android was released... but still no port to the Neo. Pft.",{"id":4045,"title":4046,"titles":4047,"content":4048,"level":9},"\u002Ftlt-2008.11.29-dna-memory","TLT_-_2008.11.29_-_DNA_Memory",[],"Scott linked an article from new scientist, Memories may be stored on your DNA, which relates with what has been on my mind lately. I was reading about some hardware evolution experiments while at the bookstore the other day. They were using a FPGA to create (evolve) a sine wave generator, if I recall correctly. The end result of the first run worked perfectly, but had some bizarre attributes -- it programmed a section of the gate array but didn't wire that section to the rest. When the unconnected section was turned off, the circuit no longer worked. It also didn't work when the same design was put onto an identical FPGA. As far as the experimenters could tell, the evolved solution depended upon some subtle property of that specific FPGA chip. In other words: GP solutions cheat like hell. They will use absolutely any available subtle or side-effect aspects of environmental conditions to push themselves to the next rung on the fitness ladder. An important lesson that I've taken from GP is that artificial \u002F automatic program generation mostly results in programs that make almost no sense from a human programmer perspective, at least partly because of all this cheating. The solutions produced by GP are mostly twisted convoluted things which mostly don't look like they work at all, let alone solve anything. When a human abstracts things, it ends up taking a much more layered structure, with the meat of the problem usually ending up on the highest layer. Automatic techniques do not succumb to such niceties. Speaking of human abstraction, I recently stumbled upon the Discordia page of Mark-Jason Dominus which makes a keen observation with fascinating attributes - \"In a well-designed computer program, No two components are alike, or even similar.\" Conceptually, that is, all similar aspects of a program are abstracted. Good programs are themselves not like the beautiful fractals of recursion that lay in the mind of their creator or the algorithms that they represent. You could perhaps think of them as the compressed version -- the most informationally dense form of the logic, information theory might say. Now take it full circle... from the biological inspired computation back to biology. Biological evolution cheats just like artificial evolution does. At first glance we see all this lovely DNA-level abstraction... but as they dig in they find all sorts of trickery that operates on all levels low and high. Like throwing in some assembly (or even better, some binary executable blobs) into the middle of my blog software. The re-use of DNA (or perhaps the coating on DNA was it?) as memory storage in the brain is completely typical. If the designers were indeed intelligent, they sure didn't plan on doing any maintenance.",{"id":4050,"title":4051,"titles":4052,"content":4053,"level":9},"\u002Ftlt-2009.05.08-pause-my-music","TLT_-_2009.05.08_-_Pause_My_Music",[],"Tags: perl, linux, music Oh how I love linux... perl... scriptability. I have a fun little command line music player named Polly. It is pretty minimalist, really just starting whatever player I like with whatever preferences I like on a whole directory tree of files. One thing that is annoying is that I have to switch over to the terminal and it ^Z to pause and then do 'fg' to play. So I finally decided to write a simple pause toggle script. I approached this in the most brute force way I could... I just take the list of all my media players and send a massive STOP (effectively ^Z) command to all to pause, and then a massive CONT (effectively 'fg') to all to continue. To determine if I want to pause or continue, I just look to see if I have any paused player processes.",{"id":4055,"title":4056,"titles":4057,"content":4058,"level":9},"\u002Ftlt-2009.08.25-now-i-have-a-real-blog","TLT_-_2009.08.25_-_Now_I_Have_A_Real_Blog",[],"I was just exploring the latest and greatest Oddmuse modules, and see that someone made it easy to embed youtube\u002Fgoogle videos. So now I feel like I have a real blog and I can post the random crap that everyone else does! To prove it, here is a totally awesome song my friends turned me on to: [YouTube:nstI0bjTqwQ](\u002F",{"id":4060,"title":4061,"titles":4062,"content":4063,"level":9},"\u002Ftlt-2009.08.25-trace-with-state","TLT_-_2009.08.25_-_Trace_With_State",[],"Tags: Perl, Debugging, Idea I've got to get this idea written down so that I can go back to doing other things... it is too distracting as-is. In a nutshell -- more or less cpan:Devel::Trace except that at each step you record all of the lexical (global?) state. Then you can not only see the full execution history of your program, but the value of every variable at every point. Now of course from the idea comes all of these questions -- do we store all that or just some of it (just what changes). Do we only keep local lexical scope at each step since the rest can be reconstructed? How do we record this... do we summarize it somehow? And so on. But ignoring all that... the next idea that comes to my mind is to toss this into CGI::Inspect as a module, so that you can use the GUI browse not just the current lexical state (there is already a plugin for that), but also the complete historical state as well. I got the idea from the Omniscient Debugger, but I'd actually seen it before in its more highly evolved form in the OCaml Debugger. The OCaml Debugger doesn't have to actually save all that state though, since in a lovely functional language you can actually just reconstruct the previous state (I believe). Still. (If you're still reading and want something even MORE insane, then your homework is to use Nothingmuch's delimited continuations in perl and make it so that you can actually resume any of the historical states). Code might eventually show up at http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002FDevel-TraceState or perhaps Devel-TraceState.",{"id":4065,"title":4066,"titles":4067,"content":4068,"level":9},"\u002Ftlt-2009.11.15-the-internets-make-programming-easy","TLT_-_2009.11.15_-_The_Internets_Make_Programming_Easy",[],"Tags: C++, Programming, UIUC, Data Mining, Homework In the class I'm taking (Intro to Data Mining) we get to implement a classifier. Alas... we must use either C++ or Java. I haven't programmed in either for quite a few years, and even with further pursuit I'm not allowed to use OCaml. That's OK! Best to stretch my mind out a bit. I'm afraid I'm getting rusty at being multi-lingual in my old age anyway, so this is good exercise. First thing first, I have to read in the training data. But best start with the basic Hello World even before that. Google... I figure I'll start with the basics, and now I have: I don't even remember doing that std namespace thing last time I programmed in C++. Oh well. It runs! So from there I just keep searching and adding... Read a fileSplit the lines (I use a boost library way)Put it all into a two-dimensional vector, and then dump it using iteratorsCreate a key-value map (and dump with iterators!) ... and just like magic I am now reading the file, parsing it, and counting the frequency of items. Ahh the hive mind! Here's the result... it's messy and unstructured but damn... it works! I'll keep going like this for a bit, but then I'll start organizing into actual objects and such. There is a good chance that I'll switch data structures, or perhaps not even bother keeping all this in memory. Most likely I'm also violating some other C++ socio-political norms. Fun!",{"id":4070,"title":4071,"titles":4072,"content":4073,"level":9},"\u002Ftlt-2009.12.06-music-play","TLT_-_2009.12.06_-_Music_Play",[],"I was playing with Creox the other day, which can make an acoustic guitar sound electric (amongst other things). I recorded a quick song... but it doesn't sound nearly as electric when I listen to it now as it did when I first recorded it (and now I wonder if I even had my Jack settings right for recording what I was hearing...). But it did end up with a fun crackly sound on the voice I think. Listen for yourself: \"Oh my baby\"  (download) And it gave me an excuse to add an mp3 player plugin :)",{"id":4075,"title":4076,"titles":4077,"content":4078,"level":9},"\u002Ftlt-2009.12.16-better-creox-example","TLT_-_2009.12.16_-_Better_Creox_Example",[],"So I was right, I completely messed up the previous example and it wasn't electrified by Creox at all. But I've rectified this situation, and for your listening pleasure (pain?), here is a smaller snippet of just the guitar part of the song, before-and-after. Original acoustic guitar  (download)\nElectrified by Creox  (download)",{"id":4080,"title":4081,"titles":4082,"content":4083,"level":9},"\u002Ftlt-2010.02.07-cultured-perl","TLT_-_2010.02.07_-_Cultured_Perl",[],"Tags: Perl You might have stumbled upon some IBM developerWorks articles titled \"Cultured Perl\" while googling for random things. I think it's awesome and that it isn't linked to enough. Just a few weeks ago the latest article came out, Cultured Perl: Storage management on Amazon S3, which is well written and up-to-date with the latest technologies. Thank you, Cultured Perl!",{"id":4085,"title":4086,"titles":4087,"content":4088,"level":9},"\u002Ftlt-2010.06.04-mercurial-bisect","TLT_-_2010.06.04_-_Mercurial_Bisect",[],"Tags: Mercurial, hg, Debugging, Testing So at work we're switching over to Mercurial (hg), and I'm trying out some of the more advanced features. One which I've been looking forward to for a while is 'bisect' (which git and others have also). The idea is straightforward. I have a unit test that fails. I know that it worked like a month ago or something. Someone committed something between then and now that made it fail. But what was it? Bisect will systematically help find it -- start in the middle, and if it was good there go back half of the remaining time. If bad, go forward. In just a few chops like this it will narrow down to the exact commit that caused an issue. This works well in Mercurial (and Git) because it is really really fast to revert to a previous version of your code. By far the longest part of the process in the process was executing the unit test itself! Here are the steps I went through. I'm using Mercurial 4.3, by the way. First I \"reset\" the bisect. That just means, let's begin! Now I marked the current revision as \"bad\", since my test fails. I looked back at history before I started this and decided that this test definitely passed at revision 51303 -- that was just before our last release and all the tests passed. So here I'm saying that I know for sure that it was \"good\" at revision 51303. Now comes the fun part. In case it isn't clear, the command that I ran is: This instructs Mercurial to keep going, and use my test_suite.pl command to decide whether a particular revision is \"good\" or \"bad\". The \"-c\" parameter runs what you give it and looks at the exit status to decide if it is good or bad. It just so happens that the \"grep\" command returns exit status depending on whether it found something :) . So I'm grepping for the \"PASS\" that comes at the end of a standard perl test suite to indicate that the current revision is good. And then off it runs! Test... bad. Test... good. Test... bad. And so on, narrowing it down to the exact revision which was the first to fail the test! From there I took a look at that revision, and immediately saw what the problem was. Easily fixed, and now my test suite passes with a clean bill of health. Aw hells yes.",{"id":4090,"title":4091,"titles":4092,"content":4093,"level":9},"\u002Ftlt-2010.07.10-html-formhandler-kiokudb-and-continuity","TLT_-_2010.07.10_-_HTML-FormHandler,_KiokuDB,_and_Continuity",[],"I saw some article about cpan:HTML::FormHandler, and decided I'd give it a try. I'm probably not really using it as intended... and I'm also not pushing this confluence of tech nearly as far as it can go. First we just pull in some libraries. We'll use cpan:MooseX::Declare for fun :) . Now let's make a lovely base class for our forms, to set up some good defaults an an updater. That stuff about the form name is so we can display multiple forms on a page, each with it's own unique name. The update method ties my form to my actual object. I ignore errors for now... though really that's losing a big part of what cpan:HTML::FormHandler provides. Here I'm building on my Form base, making a form specific for my Person class. This is declaratively specifying which fields to show and in what order, along with a lovely save button. In theory I'll be able to expand this into subforms and compose them and so on. Though I'm roughly OK with listing inputs for the form, it annoys me to have to specify the types. That, at at least a basic level, should be readable from the fields to which this form is connected. So one thing I'm noodling is using the rendering and validation, but importing the types from the data class. I think the cpan:Form::Processor::Model::DBIC does this a bit. My Person class is straightforward. I used the DateTimeX thingie to auto coerce stuff magically. And that basic_form method is just a helper to create a form for a given instance. This is a little Continuity app, so main gets called and passed $r, which is the request handle. After setting up our KiokuDB (with SQLite backend), I enter an endless loop of showing the forms and the processing the results. Oh, and I create a special Person instance for holding a new person. In the loop, I grab all the people objects in the DB at once (this is a demo, so I skipped iterator\u002Fpaging stuff), make a form for each, and then render the forms. I also render the new-person object in case they want to add a new one. Next I call '$r->next', which waits for the user to submit the forms. This is Continuity magic, which inverts the web app to make it more like an interactive command line prompt. You can kinda think of this line as \"$input = \". Once that comes back I put the submitted data into a variable and use it to update each of the forms (and updating each back into the database). Finally I check to see if they submitted data for the New-Person, and if there is anything I insert it into the DB. Last but not least, we start the Continuity loop, which starts looking for requests and calling main() for each new session. So I found this all pretty interesting, and it overlaps with some of my other object-rendering experiments. I could probably add to this for pulling field metadata from objects into forms and organizing subforms and so on. Maybe next time :)",{"id":4095,"title":4096,"titles":4097,"content":4098,"level":9},"\u002Ftlt-2010.07.10-hotel-yorba","TLT_-_2010.07.10_-_Hotel_Yorba",[],"I love this song so much, and it is as fun to play as I imagined. (download)",{"id":4100,"title":4101,"titles":4102,"content":4103,"level":9},"\u002Ftlt-2010.08.01-opw-2010","TLT_-_2010.08.01_-_OPW_2010",[],"Tags: Perl, Programming, Conference (er... Actually I meant to post this sometime back in like February 2010. Oh well!) I attended the Orlando Perl Workshop 2010 and had a lovely time. The talks I attended were: Stevan Little (stevan) - Untitled No. 12I only saw the end of this, so I can't really comment :) . It did mention Plack a bit.Shawn Moore (Sartak) - Surviving in the Cruel, Unforgiving WorldA discussion of his (and other's) nethack bot, including some discussion of the internals and some strategy lessons.Tatsuhiko Miyagawa (miyagawa) - Plack: State of the art web framework superglueIntroduction to Plack, you know, a neat layer to interface Perl and a Web Server.Cory Watson (gphat) - From Zero to CPAN: Adding A New Product Search to Magazines.comBoth a discussion of search indexing via Solr, and talked about how he put some of the more generic libraries they used up on CPAN. This one is most likely to impact my day-job.Lucas Oman (lucas) - Roles in PHP?Yep, Lucas got roles of a sort working in PHP. But the syntax is a bit ugly. Cool anyway though.Dylan Hardison - How to Debianize a CPAN DistI'm hoping to maemo-ize some stuff, which is a lot like Debianizing it... so this was handy.Marty Pauley (maokt) - Perl can be FUN(ctional)Fun stuff about closures and functionally things ala Higher Order PerlMatt S Trout (mst) - The Troll, the God and the MountainEpic! Ultimately about Collection Management tools (which is an expansion of ORM more or less) that are in the works.Mark Keating (mdk\u002Fmarkie) - Keynote: The awful things we all must do and the most disgusting word you'll hearA pep talk for the community to do some good Perl Marketing! And... I got to see aligators! Well... things that looked like them anyway. (insert photo here) My whirlwind trip wasn't too stressful, as it turned out. I hung out mostly with Sartak and Miyagawa, and made lots of progress on cpan:Continuity::Adapt::PSGI. Lots of side-discussion on all sorts of things too, of course. It was a good weekend!",{"id":4105,"title":4106,"titles":4107,"content":4108,"level":9},"\u002Ftlt-2010.08.15-chinese-spam","TLT_-_2010.08.15_-_Chinese_Spam",[],"Ever since I got my terminals and mutt all working well with international characters, I've been fascinated by the Chinese spam I get. First of all it looks neat to see in a terminal. But sometimes I throw it into google translate just to see what it is I'm getting spammed about, and every now and then it's mildly interesting. Take this for example: 任可一种管理绩效的产生，首先都是原于一种先进的管理理念。而任何一种先进的管理理念都必须有一种适合它的管理模式作为载体。人们似乎都很乐意去接受先进的理念，并且善于以最惊人的速度去传播。可是人们在践行的过程中得到的结果却是参差不齐。就象丰田的精益理念早就传遍了整个世界一样，而世界却始终未能复制出第二个“丰田”。这究竟是为什么呢？主要原因在于人们虽然已经接受了新的理念，却没有能够找到其精髓的所在。因此也就无法去设计一种适合自身需要的管理模式来作为载体 Which translates (probably very poorly since it is machine translation, but good enough for bloggin') to: Either a management performance can be produced, first of all are the original in an advanced management concept. The possession of any advanced Management philosophy that it must have a suitable management model as a carrier. People seem very willing to accept advanced ideas And good at the most to spread at an alarming rate. But people in the course of practice the results obtained is mixed. On Like Toyota's lean philosophy had already spread throughout the world as the world has never been able to replicate the second \"Toyota.\" Is this why? Although the main reason is that people have accepted the new idea, but not able to find its essence Lies. Therefore will not be able to design a management model for their own needs as a carrier. As someone who has been involved with companies who adopt Lean-like philosophies, I couldn't agree more!",{"id":4110,"title":4111,"titles":4112,"content":4113,"level":9},"\u002Ftlt-2010.09.03-dc-perl-mongers-rakudo-star-pizza-party","TLT_-_2010.09.03_-_DC_Perl_Mongers_Rakudo_Star_Pizza_Party",[],"We're starting our usual monthly DC Perl Mongers meeting a bit early this Tuesday (September 7th) to have a little pizza and celebrate Rakudo-Star! Arrive at 6:30pm at the Starbucks at 18th and K Street NW (call me, Brock, if you miss us and need to be let in, number on the website) if you want food. But feel free to wander in any time thereafter, we usually stay as late as 10:00pm. We'll swoop down and look for people at the normal 7:30pm time too :) Other activities: Bring your laptop!Installing Rakudo-StarGiving hands-on tutorialsBeginner and Advanced welcome!Never been to DC.pm before? No problem, come have some free pizza! Please put your name on http:\u002F\u002Fdc.pm.org\u002FRakudo-Star_Party (or email the mailing list, which can be found at http:\u002F\u002Fdc.pm.org\u002F) so we know how much food to get. If you have any questions, email the list or me directly -- awwaiid@gmail.com will do :) About Rakudo Star: \"Rakudo Star\" is a useful and usable distribution of Perl 6. Current releases are aimed at \"early adopters\" of Perl 6. We can tell you ALL about it when you arrive :)",{"id":4115,"title":4116,"titles":4117,"content":4118,"level":9},"\u002Ftlt-2010.11.16-i-knew-a-girl","TLT_-_2010.11.16_-_I_Knew_A_Girl",[],"This song popped into my head today, and the muse took it all the way to a recording! (download)",{"id":4120,"title":4121,"titles":4122,"content":4123,"level":9},"\u002Ftlt-2011-10-16-misc-posts","TLT - 2011-10-16 - Misc Posts",[],"Tags: Perl, Debugging, Programming, Science",{"id":4125,"title":4126,"titles":4127,"content":4128,"level":9},"\u002Ftlt-2011-10-16-misc-posts#debugging-gems","Debugging Gems",[],"Tags: Perl, Debugging, Programming, Science I've been enjoying the blog entries of Carl M�sak lately, and not just the Yapsi Release Notes. Though those are awfully awesome. I'm Doing Science And I'm Still AliveThere's Plurality In WrongnessFail Firmly The Jargon File's definition of programming defines it as \"the art of debugging an empty file\".Debugging the de Bruijn Sequence http:\u002F\u002Fwww.circlemud.org\u002Fcdp\u002Fhacker\u002Fhacker-4.html - \"When you find a bug ... your first impulse will be to change the code, kill the manifestation of the bug, and declare it fixed. Not so fast! The bug you observe is often just the symptom of a deeper bug. You should keep pursuing the bug, all the way down. You should grok the bug and cherish it in fullness before causing its discorporation.\" http:\u002F\u002Fwww.ibm.com\u002Fdeveloperworks\u002Fweb\u002Flibrary\u002Fwa-debug\u002Findex.html",{"id":4130,"title":4131,"titles":4132,"content":4133,"level":9},"\u002Ftlt-2011-10-16-misc-posts#timestamp-fix","Timestamp Fix",[],"Tags: Perl, Hacking, Programming In MJD's talk at PPW, he mentioned that one of the things he likes best about the (historical) perl community is a get-things-done attitude when it comes to code. He showed a little snippet that wasn't necessarily the most sustainable or quickest execution way, but worked. Inspiring! Recently I did a clean install to an SSD drive, and copied all of my stuff over. Unfortunately I messed it up, and reset all of my file modification timestamps. I don't trust those much, but they are handy sometimes -- so today I decided to fix them. First I mounted my old disk at \u002Fmnt and used find to get a list of files that I want to fix, which are all in my 'tlt' directory. After some trial and error (and verification!), I ended up with this: Then I started looking at rsync to see if it could somehow just sync timestamps. Nothing immediately obvious, and the internet didn't help, so I decided I'd just do it with a perl script. I only have to do this once, so it doesn't have to be particularly fast or clean or anything. I built it up experimentally -- I had to look up how to do 'stat' and such since I don't do that often. And I think I've never used ustat. After doing some experiments to make sure it isn't going to eat my data much, I kicked it off! I piped the output to fixes.txt and started tailing that. But just tailing the file got boring, so before long I started to wonder how long this was going to take and how far it had gotten. Well... using 'wc' will give me a line-count of the two files. Each line of the original file will (mostly) generate 3 lines in the output file. So all we have to do is count output lines, divide by 3, and then divide by the total, and va la! Let's toss that into watch so we can watch the percentage grow. So we have all SORTS of lazyness going on here. My favorite is that 'wc -l files.txt' actually returns a number AND the file name. But we just pretend it is a number, which works :) This is a bit slow. But it is working! It's at 33% now, and by the time I get back from a short walk it will be completely done. Hopefully my files won't have all been eaten :)",{"id":4135,"title":4136,"titles":4137,"content":4138,"level":9},"\u002Ftlt-2011.03.12-filter-rocking","TLT_-_2011.03.12_-_Filter_Rocking",[],"Tags: Coffee, Music On my way to Safeway, I stopped in at Filter Coffee to see how they are doing. The nearby Safeway (The Secret Safeway) is closed, but this is still roughly on the way to The Soviet Safeway anyhow. A seat was open so down I plopped. First they played the entire Rage Against The Machine, Battle of Los Angeles album, and now we're on to the Ramones with Blitzkrieg Bop. Sounds like they're going to play this whole album too. Good music, good mocha. Where was I on my way to again?",{"id":4140,"title":4141,"titles":4142,"content":4143,"level":9},"\u002Ftlt-2011.03.13-wishing-on-a-whatever-star","TLT_-_2011.03.13_-_Wishing_on_a_Whatever_Star",[],"Tags: Perl6, Rakudo, Programming The \"Whatever-Star\" was at first alarming to me! I first noticed it when I learned how to shuffle an entire list. The Whatever-Star can do some other stuff, too. But that's ok, we'll start with this. Now... in the past I've tried \".pick(1)\" which gets me one name at random. Then \".pick(2)\" will give me two, and not repeat. If I put in too many then it'll only give me back what it can, in this case all six names. But \".pick()\" ... that doesn't even look valid! The documentation says (though I can't recall where) that it is the same as \".pick(Inf)\". When I picked more than there were, it stopped when there was nothing to pick. So this makes sense... try to pick an infinite number and we'll just get them all. Nice. Still kinda weird about the '' though. So then I, mistakenly, thought that maybe \"pick\" was special. Maybe they hooked the parser up so that it could, like, \"know\" that pick could be passed this '*', which I learned is named \"Whatever\". I couldn't have been closer to the truth! Except without the \"special\" bit. Time to do a bit of exploring! Let's try to figure out how this works without resorting to such tedious things as reading documentation, source code, or IRC, shall we? RTFM my eye. If pick is special, then I shouldn't be able to add something that behaves similarly. Wait, let's do this formal like. THEOREM: (1,2,3,4).pick(*) is somehow special, and can't be replicated without modifying the compiler. PROOF: Let's start by assuming that it is NOT special, and attempt to do a proof-by-contradiction (constructivists be damned�). Then we should be able to create our own method that can behave specially when '*' is passed. First, what class is .pick(*) working on, anyway? Let's ask rakudo. Parcel. OK, whatever that is. So all we gotta do is slap a new method on there and see what we get. (google... google... irc... (yes, contrary to the overall anti-research basis. But it's ok because we're in parenthesis)). OK, here we go. Well that was easy :) . Now for the BIG TEST! OMG it worked! So I actually get a parameter, and it is an instance of Whatever. Well then. THEOREM DISPROVED. I then decided to actually cast about for how things use this. Here's a great example, the Rakudo Any-list pick whatever implementation. You can see that they use multi-methods to easily deal with the Whatever case separately from other passed values. 1 I actually like constructivists, and welcome a constructive version of this non-proof.",{"id":4145,"title":4146,"titles":4147,"content":4148,"level":9},"\u002Ftlt-2011.04.07-funky-function-filters-in-perl6","TLT_-_2011.04.07_-_Funky_Function_Filters_in_Perl6",[],"Tags: Perl6, Rakudo, Programming A while back I wrote about TLT - 2006.03.03 - Funky Function Filters. Let me refresh your memory - we have a Python and a Ruby snippet and we translate it into Perl5. The code is a toy to show some fancy shmancy lambda (unnamed functions) usage. The idea is to take a list of functions, filter them, and then with the remaining ones show what happens with parameters from -10 to 10. Python example: Ruby translation: My perl5 translation: Today I thought I'd give a stab at a perl6 translation (using the 2011.01 Rakudo Star release). I started with a straightforward translation from the perl5, then switched to perl6 idioms. Perl6 translation: The first line is a doozy! This is similar in some ways to the perl5 translation, though the grep now shows up on the righthand-side of the list like in Ruby. The biggest difference to me is in the list of lambdas: I mean... what does THAT mean?! Let's take the last one, \"* ** 3\". Translated into English: Wait wait... \"whatever\"? The Whatever-Star is a fancy thing from perl6 that took me a while to work out, and there may still be some nuances that I'm missing. In this context it magically makes a closure... er... lambda, that takes one parameter which it puts where you see the '*'. (Note: that last one should be SLURPY! But I don't know how to do that apparently) Enjoy... Whatever!",{"id":4150,"title":4151,"titles":4152,"content":4153,"level":9},"\u002Ftlt-2011.08.07-dc-perl-mongers-august-2011-meeting","TLT_-_2011.08.07_-_DC_Perl_Mongers_August_2011_Meeting",[],"Tags: Perl, DCPM, Programming Last Tuesday was our monthly DC Perl Mongers meeting. We dove right in, talking about how perl caches various values for a variable to be used in different contexts. So, for example, let's say you start off with a number, but then use it in string context, perl will cache both the string and the number. This can be shown using cpan:Devel::Peek like this: I often use cpan:Devel::REPL at meetings so that we can interactively explore things as a group, which is what I'm doing here. The first time we dump $x, you can see it has a \"PV\" which holds the string \"34\". But after we use it in a number context, adding 17 to it, you can see that the dump shows both the original string version, and a new \"IV\" containing the integer version: So this, as far as I know, is mainly an efficiency hack that perl does, the theory being that if you used it once in string context or number context or whatever, maybe you'll do it again. Very quickly the question came up as to what happens when you change $x, and how does perl know what cached values to trust. Well that's where the 'FLAGS' part of the SV dump comes in. It shows which of the cached values are OK to use. So when we increment $x numerically: The flags have been trimmed down. I don't remember what all the flags mean, but you can look at perlguts or other docs for that :) . Notice that the string version of the original \"34\" is still there! Perl doesn't waste time erasing it. Instead, if string context is used again a new cached value will overwrite the existing one. Well that was surely a good start to the meeting :)",{"id":4155,"title":4156,"titles":4157,"content":4158,"level":9},"\u002Ftlt-2011.10.11-ppw-2011-wrap-up","TLT_-_2011.10.11_-_PPW_2011_Wrap-Up",[],"Tags: Perl, PPW, Conference This weekend I attended PPW2011 - I think this is my 3rd PPW, and my fourth perl conference in Pittsburgh (YAPC::NA 2009 was there). The theme this year was \"DevOps\", and I think maybe that was not quite to my taste (though does seem practical). I like talks that push my understanding and stretch my mind, whereas the talks tended toward solid best practices for corporate environments. I gave a talk on debugging, and I even feel that my own talk went that way a bit :) Favorite talks: Postmodern Module PackagingRunning an online gameMo is Less (lightning)A Dominus Chrestomathy That last one was a set of mini-talks by Mark-Jason Dominus, which included one of my all-time favorites, Debugging the de Bruijn Sequence. Highly recommended!",{"id":4160,"title":4161,"titles":4162,"content":4163,"level":9},"\u002Ftlt-2012.07.10-hi-eliza","TLT_-_2012.07.10_-_Hi_Eliza",[],"Eliza: I am the psychotherapist.  Please, describe your problems.  Each time\nyou are finished talking, type RET twice. Me: My friend Mike doesn't know who you are. Eliza: Why do you say that? Me: Because I mentioned you and he said that he hasn't heard of you. Asked\nme if you were some sort of reference. Eliza: Is it because you mentioned me and he said that he has not heard of I\nasked you if I was some sort of reference that you came to me? Me: Yes, exactly! Eliza: Earlier you said you mentioned me and he said that he has not heard of\nI asked you if I was some sort of reference? Me: Right. Because a lot of lore from the '80s came from you. Eliza: Does it bother you that a lot of lore from the '80s came from me? Me: No, I rather enjoy it. Eliza: Maybe your plans have something to do with this.",{"id":4165,"title":4166,"titles":4167,"content":4168,"level":9},"\u002Ftlt-2012.08.20-first-day-in-cs440","TLT_-_2012.08.20_-_First_Day_in_CS440",[],"I'm watching the first video for the CSU CS440 Intro to AI class, taught by Chuck Anderson. Man... so far this looks great. In addition to delicious shout outs to Turing and Hume and so on, tossed out a reference to the XKCD take on some AI concepts. Did I mention that we are using a wiki rather than WebCT as our primary interaction point? hmm! I haven't seen the video for the CSU CS414 Object-Oriented Programming course.",{"id":4170,"title":4171,"titles":4172,"content":4173,"level":9},"\u002Ftlt-2012.08.28-code-comments-yo","TLT_-_2012.08.28_-_Code_Comments,_Yo",[],"I've traditionally thought of code comments as having two audiences. One audience is me, or whomever will be taking over the code after me. This consists of notes or hints as to what I was thinking when I wrote something. Typically these are regular code comments, possibly right on the end of a line. The second audience is the users of my code. Usually this is other programmers, in the case of a library (as opposed to the consumer of a resulting UI, which I guess is a sort of third non-engineer audience who doesn't read code comments). This second group is the one for which you typically use POD (or similar in other languages - javadoc). Increasingly, however, I have decided to act as though there is only one audience. When you separate code out the way I describe above, you immediately run into a question -- what do you do for a private method? You don't expect the users of your library to call it, and yet you might have some high-level usage guide that goes beyond what you might put in an inline comment. Same thing for private instance variables, or other internal helper functions. I've also noticed that I have two different sets of code that I write, and for each there is ultimately one audience. The first is at work. Here I am writing code that my peers will use. But my peers will also maintain the code itself. Similarly, I also write code for open-source projects. For the most part my code here will be consumed - but if and when I do actually get contributions to the library, the contributors are the consumers first and contributors second. They are pretty much exactly like the people at my work. So I've settled on physically organizing my code into two sections, but using POD (or similar) for all of the usage or explanation-centric comments, and I treat my reader as a single audience. I put the public API methods all together, and notate them as a single section in my code, perhaps with a preamble with an example usage. I then put all of the private methods together, with a header that marks them as private -- but then I document them as if they were public. Because no matter what, from the perspective of the code IN my library, they ARE public.",{"id":4175,"title":4176,"titles":4177,"content":4178,"level":9},"\u002Ftlt-2012.09.09-the-flooding-of-bath","TLT_-_2012.09.09_-_The_Flooding_of_Bath",[],"Tags: Vacation, Flood, Rental Car, Rain For Labor Day weekend (last week), Beth and I took off from work on Friday, rented a car, and headed out to Berkeley Springs, WV - aka \"Bath\". Nice drive up there, only a few hours away from DC. We've been around there before, and this time we decided to stay in-town so we could park our car and walk around more than we have in the past. We stayed on the top floor of a Bed & Breakfast downtown. Saturday was a rainy day. We wandered about, looked at some junk shops, had lunch, took a long nap. I kept waking up to booming rolling thunder, but felt safe and cozy. Once we were up and about there was this weird siren that kept going off (sounded like an air raid) -- the inn keeper told me that it was their fire department and all-purpose alarm, and that it's not a big deal. We headed to dinner and there was some noticeable water in gutters. But we only were walking a block down the road, so no real worries. The wait staff seemed a bit... off. Nervous and stressed, I'd say. We heard them start telling people who came in after us that they needed to order quickly because they were shutting down the kitchen. Specifically because of water building up behind their building and starting to come into the kitchen! No fun. So we finished quickly and boogied out of there. Water had gotten quite a bit deeper in the street... and as we were walking back to the B&B fire trucks started to park diagonally across the road, and firemen jumped out and started directing traffic away. They were shutting down the whole road! And no wonder... the water kept rising. Walking in, the innkeeper told us that we should go out back and consider moving our car. And... that was an understatement. I should have taken photos, but I was too busy deciding what to do. Water was up to the baseboards. I waded out -- water up to my knees! -- and moved the car. Water sloshed into the floorboards, and even though I moved the car to higher ground, I still had to go back and scoop water out. Ick! Well, water was quickly rising and was even threatening to broach the B&B porch itself, which holds their outdoor restaurant and wine bar. After hanging out a bit longer we decided it was best for us to just abandon this whole scene. We packed up and drove back to DC. As soon as we left the road cleared and the rain stopped. It was a nice drive back to DC, and we were back in our apartment by 10:00pm. Whew! Sunday was stressful returning of a water-damaged car... and we were very pleased to have Monday to just relax :) Here is the high-water mark in the park. The water \"only\" went up to my knees out on the street, but in the park it was quite a bit deeper. I unfortunately didn't get a before-photo of the pool... but it was a beautiful clean blue. They say that this was a 100-Year Flood! So I guess we shouldn't worry about going back to try again :) (Images courtesy of The Huffington Post, and herald-mail.com)",{"id":4180,"title":4181,"titles":4182,"content":4183,"level":9},"\u002Ftlt-2013.02.06-dc-baltimore-perl-workshop-2013","TLT_-_2013.02.06_-_DC-Baltimore_Perl_Workshop_2013",[],"I just wrote up a call-for-people post about the DC-Baltimore Perl Workshop over at blogs.perl.org. I say it all there -- but in a nutshell, come and join us! :)",{"id":4185,"title":4186,"titles":4187,"content":4188,"level":9},"\u002Ftlt-2013.12.22-overtone-adventures-1","TLT_-_2013.12.22_-_Overtone_Adventures_1",[],"Tags: Clojure, Overtone, Music So I've gone through Overtone Getting Started a few times, and am up and running. Only trick at all is that I already have my own jackd wrapper script to get jack started. Just like the other times that I went through this tutorial, I get to this point and say \"now what?\" There are two different directions to explore. I have the REPL working, but it would be nice to be able to execute from a file and also do some interactive editing via Vim (or Emacs I suppose). The other path is to ... you know ... make some music (er... noise). So I go on a reading spree. Things I learn: There is a neat Cheat Sheet. But I don't know how to work it.Read a bit about Sequencing on the wiki. Learned:\nYou can grab samples from freesounds, like: (def kick (sample (freesound-path 2086)))You can then play that with (kick). Fun!Something that I read before -- you kinda schedule sounds out in the future a bit. Think I saw that on a videoThe main README references some video tutorials, I'm going to check them outskillsmatter clojurex unpanelNice! Shows some dubstep type noise to make during a 20 minute workshopMentions here as I've seen elsewhere: definst uses macros to send synths to supercollider, so only a specific set of things are OK in there (not arbitrary expressions)Shows how to sequence things a bit",{"id":4190,"title":4191,"titles":4192,"content":4193,"level":9},"\u002Ftlt-2013.12.23-overtone-adventures-2","TLT_-_2013.12.23_-_Overtone_Adventures_2",[],"Tags: Clojure, Overtone, Music Today I'm watching Overtone and ClojureScript which is a coding session of someone setting up an web UI to play Overtone stuff. Building a UI like this reminds me of the one-string guitar that I got at an art festival the other day. Clearly home-made, including an energy drink as the echo chamber. And very awesome. Also fun to see someone iterate through their development. Lots of interesting things in there, most of them I can read more or less but doesn't mean I could write them. One thing I noticed was ( ...) to pull in instrument libs. I'll try that. The Cheat Sheet is interesting, but I don't know enough to actually use a lot of the things on there. Current mission is to get the instruments working. Ah! I need to do (use 'overtone.inst.piano) not ( overtone.inst.piano). Now (piano) plays a note!(odoc note) shows that it takes a bunch of params(piano 60), (piano 65), etc plays some nice piano notesI looked up named parameteters in clojure. (piano  65) does what I wantAchievement unlocked ... I can now use all the intstruments on the cheat sheet!Now when I do \"(piano  60) (piano  65) (piano  69)\" (still in REPL) it plays all three notes at once. Need to learn how to sequence things.I think I'll go back to that workshop videoAt 13:40 they talk about sequencing thingsPlay a piano note in 1 second (at (+ 1000 (now)) (piano))From their tutorial, I created:\n(defn loop-beats time (at (+ 500 time) (kick)) (at (+ 1000 time) (open-hat)) (apply-at (+ 1500 time) loop-beats (+ 1500 time) ))(loop-beats (now))(stop)I don't know exactly what that last  is for. (odoc apply-at) says it is \"argseq\" but gives no explanation.In general this is \"temorial recursion\" -- delays a bit before calling backAs far as I can tell this does create new stack frames! Will eventually run out. I know this because I accidentally put the loop-beats recursion in parens which invoked it.Following the tutorial, I transformed it to use a metronome:\n(def metro (metronome 180))(defn loop-beats m beat-num (at (m (+ 0 beat-num)) (kick)) (at (m (+ 1 beat-num)) (open-hat)) (apply-at (m (+ 2 beat-num)) loop-beats m (+ 2 beat-num) ))Get it started: (loop-beats metro (metro))Change the temp live! (metro  200)Stop it (stop)Instruments take 'notes' (midi numbers), though some things take hzSymbolic notes can be turned into midi numbers via (note )Can map a sequence of symbolic notes to midi numbers (map note   )Now I can make a general purpose play-note-sequence function. I'll just make it play on the beat.",{"id":4195,"title":4196,"titles":4197,"content":4198,"level":9},"\u002Ftlt-2013.12.24-overtone-adventures-3","TLT_-_2013.12.24_-_Overtone_Adventures_3",[],"Tags: Clojure, Overtone, Music Good progress today -- I made a hack to get around that BUNCHES of midi issue. Needed that because when I would hit a single note on my jack-keyboard (virtual midi keyboard), I got a whole bunch of events. I'm guessing I was getting 64 of them. I also got Overtone Vim Integration working. Well technically I already had it working (had fireplace.vim installed, etc), I just didn't know it. Now I can start up the REPL in one terminal and start up vim in another. In vim do \":Require\" and it finds the running REPL and hooks into it. I also added \"nnoremap   (stop)\" to my .vimrc, so that I can jam on F1 to make the noise stop. Here is the file I've got now: So that takes midi events specifically from that device (I picked one of my 64 virtual devices at random, seems to work) piped to the piano instrument. Next I'm going to make a new instrument of my own and hook that in!",{"id":4200,"title":4201,"titles":4202,"content":4203,"level":9},"\u002Ftlt-2013.12.26-overtone-adventures-4","TLT_-_2013.12.26_-_Overtone_Adventures_4",[],"Tags: Clojure, Overtone, Music Today I'm playing with Open Sound Control (OSC), which is more general-purpose than midi but kinda similar idea. I have an android app on my phone named Control which has a few existing UIs, in my case I'm playing with the multi-touch. I set it to have two touch inputs. In my Overtone REPL, I first set it up to listen for OSC events, and dump out whatever events it sees:",{"id":4205,"title":4206,"titles":4207,"content":4208,"level":9},"\u002Ftlt-2015.06.04-polyglot-bridges","TLT_-_2015.06.04_-_Polyglot_Bridges",[],"Tags: Polyglot, Ruby, Perl6, Python Here are the slides for Polyglot Bridges (pdf) lightning talk that I gave today at RubyNation. slideshare:www.slideshare.net\u002Fawwaiid\u002Fmad-science-a-dash-of-polyglot The most important bit: Or in other words: pull in this rubypython gem, magically get all the python libs callable from Ruby. In this case, you get all the nice charts and graphs from pyplot. I originally played with this in Perl6\u002FRakudo Inline::Python, where it also works fantastically. I love the idea of one community NOT completely re-writing a library in their language when it can just be used \"directly\" instead.",{"id":4210,"title":4211,"titles":4212,"content":4213,"level":9},"\u002Ftlt-2015.07.26-exploring-clojure-in-the-repl","TLT_-_2015.07.26_-_Exploring_Clojure_in_the_REPL",[],"Tags: Clojure, REPL When I first learned Linux, my friend taught me a few commands. How to to list files, how to change directories and see your current directory, how to run things, how to ask a program what parameters it takes, and how to look at a file (ls, cd, pwd, .\u002Ffoo or \u002Fusr\u002Fbin\u002Ffoo or foo, foo --help, cat foo or more foo). After that I just... ran a lot of stuff. I eventually discovered 'man' -- but going through \u002Fbin and running ALL the commands was really educational. Let's get some basic tools to do that with the Clojure REPL! The major things we want to do are find things (mostly functions), and then learn all about them individually.",{"id":4215,"title":4216,"titles":4217,"content":4218,"level":15},"\u002Ftlt-2015.07.26-exploring-clojure-in-the-repl#finding-things","Finding Things",[4211],"So Clojure has namespaces, which are kinda like directories, using \".\" as a way to indicate nesting. Vars (and thereby named functions) are kinda like files. So the full \"path\" to a var looks like \"clojure.string\u002Fsplit\" where \"clojure.string\" is the namespace and \"split\" is the function. First let's get a list of all the loaded namespaces. The \"ns-all\" gives us this, but we want a nice sorted printout, so we'll add a bit of fancy. Use \"dir\" to look at all the exposed vars from a namespace Search for functions with \"split\" in their name. There is also \"apropos\" but it doesn't show namespaces -- \"apropos-better\" does, and \"find-name\" is an alias of that, so is better. You can also use a regex! Not sure how useful this is... but here we are getting all the functions that start with an \"s\" and in with a \"t\".",{"id":4220,"title":4221,"titles":4222,"content":4223,"level":15},"\u002Ftlt-2015.07.26-exploring-clojure-in-the-repl#learning-about-things","Learning About Things",[4211],"Once you've found your function, you'll want to learn more about it and maybe give it a try. \"doc\" can be used to get the documentation associated with a function. This is pretty cool! It shows the full name of the function, its signature, and it's documentation. Note that you can tab-complete If you don't know what you're looking for, you can also try find-doc. This will search both the name and the documentation itself for your string or regex. THE ULTIMATE: Get the source for a function! Not everything is a function. Heck, sometimes you might not know what sort of thing you're looking at. But we can find out.",{"id":4225,"title":4226,"titles":4227,"content":4228,"level":15},"\u002Ftlt-2015.07.26-exploring-clojure-in-the-repl#getting-gui","Getting GUI",[4211],"Clojure comes with clojure.inspector, which gives some Swing GUI for exploring data structures. NOTE: I had to do this to get jdk-1.7 swing apps to display while using xmonad (and other tiling window managers I guess). I now dropped this in my ~\u002F.zshrc. Uhg.",{"id":4230,"title":4231,"titles":4232,"content":4233,"level":15},"\u002Ftlt-2015.07.26-exploring-clojure-in-the-repl#doing-horrible-things","Doing Horrible Things",[4211],"So let's have some fun. First, let's get all the string function names. \"dir-fn\" is like dir, but returns the results instead of printing them. Let's turn them into their actual functions. Given a function, here is how to tell how many parameters it takes (well... it might take more or less than this, but this will tell us how many params for the first definition. Good enough). Here is a handy thing that tells us if the given function can deal with a single arg. Now let's filter our string functions down to the ones that just take one argument. So. We if have a one-argument function in the clojure.string namespace, let's assume it takes a string and pass in a string to it :) . The \"pr-str\" bit is so that we can pretty-print this with escaped newlines and such later. Now let's try this on all the one-argument string functions, printing out the function name and the result pretty like. Woo! html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .s8-w5, html code.shiki .s8-w5{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sFxd3, html code.shiki .sFxd3{--shiki-default:#032F62;--shiki-dark:#DBEDFF;--shiki-sepia:#E6DB74}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .s_OQ2, html code.shiki .s_OQ2{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#F8F8F2}html pre.shiki code .sXSQT, html code.shiki .sXSQT{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#F8F8F2}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}",{"id":4235,"title":4236,"titles":4237,"content":4238,"level":9},"\u002Ftlt-2015.10.18-my-first-useful-perl6-grammar","TLT_-_2015.10.18_-_My_First_Useful_Perl6_Grammar",[],"Tags: Perl6 In my recent talks about perl6, one thing that I keep neglecting is Grammars. Part of that is because I hadn't used them yet! I was putting together a talk on some clojure code, and was getting mad at my slide software not syntax-highlighting with magical rainbow parenthesis. Clojure being a LISP-like, it lacks some visual clues for structure and is WAY easier to glance at (in my opinion) when parenthesis are highlighted. I have vim doing this for me... but no dice in my slides. So! Slice up slides, run them through vim, stitch them back together, and presto! Complete code is at https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fpinpoint-code-color. I use Pinpoint as my go-to slide software. Simple and easy both to develop a deck and to present it. Each slide is a header and a body done in some Pango markup (more or less simplified HTML). Here is a 3 slide deck: We'll do this in two parts. === Part 1: The Grammar ==",{"id":4240,"title":4241,"titles":4242,"content":4243,"level":9},"\u002Ftlt-2016.01.08-perl-6-is-separate-from-all-replacement-for-none","TLT_-_2016.01.08_-_Perl_6_is_Separate_from_All,_Replacement_for_None",[],"Tags: Perl6, Perl5, Ruby, Polyglot In response to the \"Perl 5 and Perl 6 are mortal enemies\" article. We are definitely framing this whole thing wrong. We have two choices: Replacement: Perl 6 is, eventually, the replacement for Perl 5Separate: Perl 6 is an unfortunately named but completely separate language from Perl 5 Most people outside of Perl 5 and Perl 6 go with Replacement just by looking at the names. Various insiders switch at random between Replacement and Separate, and I think that is the core mistake. This article has a very important sentence: \"First, a postulate: given the language similarities, the people that will find it easiest to learn Perl 6 are today's Perl 5 developers.\" In reality there are SO MANY differences between Perl 5 and Perl 6, it is NOT a good postulate! This is it -- this is the mistake where we are getting both messages at once, and the rest of the article paints a dark picture of a world (unfortunately most likely the one we live in) in which crossing these messages happens. The mixed message is a net negative for both languages. I suggest that if you take a random Perl 5, Ruby, Python, PHP, Javascript, R programmer, the Perl 5 programmer might actually have MORE trouble than others due to misleading overlap and jarring differences. A developer that uses a lot of Moose might have less issues... or again might end up with the differences shocking rather than enlightening. I actually think the Ruby developer will have the LEAST trouble learning Perl 6, building on tons of overlap (everything is an object!), a shared history (sure, \u002Ffoo\u002F is a regex, drop it in. Couple sigils here and there never hurt anybody), and similar culture (TIMTOWTDI is a motto for both). But the Ruby developer won't expect things to be mostly the same between Perl 6 and Ruby, unlike a naive Perl 5 developer. I recommend you each shape your language to do two things. First stick strongly with Separate, second focus on the Polyglot nature and audience: Perl 6 is a new and interesting language. It happened to be created by the creator of Perl 5 and an overlapping community, and has an unfortunate name. It is a Practical Research Language, aiming to be both cutting edge and useful. It is of interest to all dynamic-language programmers, and is especially interesting for the polyglot: you'll see familiar bits from Haskell, Perl 5, Ruby, Python, CLOS, ... plus lots of original ideas. Things that you can use, or at the very least learn and take back to your work. You can use Perl 6 now to solve small tasks, and join at the ground floor to build up the ecosystem and culture towards solving larger and larger problems. One of the cultural things that I think can set Perl 6 apart is in being Module Level Polyglot. From Perl 5 or Ruby you can invoke Python code (both have libraries to support this that I've used) -- but you'd be hard pressed to get that put into production at your work. But NOBODY should ever implement pyplot again! If we can make doing \"use matplotlib::pyplot:from\" a socially-acceptable thing in Perl 6, we might be able to convince other communities to do the same... and do something amazing: revolutionize sharing cross-language modules. Perl 6 isn't the research language for Perl 5. It is a research language for ALL languages to learn from. Perl 6 is the Borg of Languages, pulling in concepts and features to create a glorious monster. Maybe the first assimilated was Perl 5, but it clearly didn't stop there. We need to let go of its roots. Embrace that Perl 6 is Separate from All, Replacement for None.",{"id":4245,"title":4246,"titles":4247,"content":4248,"level":9},"\u002Ftlt-2016.03.05-arlington-retroruby-2016","TLT_-_2016.03.05_-_Arlington_RetroRuby_2016",[],"Today I attended http:\u002F\u002Fretroruby.org, a great un-conference in Arlington. I got my toehold in the local Ruby community at the Arlington meetup, and was happy to visit with lots of familiar people. I didn't meet any new people, though that was mostly because it was easy to spend time catching up. Next time I want to jump in a bit stronger on the new-dev track, maybe walk through some hands-on exercises or do a group activity (Randori). My favorite, besides talking to people, was the lightning talks. These have a bit more technical depth and include some code getting projected, which I love. I gave a quick this-thing-exists talk on http:\u002F\u002Freactrb.org. In the hallway track I also got to preach a bit about Module Level Polyglot :)",{"id":4250,"title":4251,"titles":4252,"content":4253,"level":9},"\u002Ftlt-2016.04.10-dcbpw-on-being-small","TLT_-_2016.04.10_-_DCBPW,_On_Being_Small",[],"Welcome to the DC-Baltimore Perl Workshop! This workshop started innocently enough. The year was 2010 -- October. We were at the Pittsburgh Perl Workshop when Brad Lhotsky said he wanted to host a similar workshop in the DC\u002FBaltimore region. I told him no. But then he talked me and some others into it. During 2011 we worked out some details and at the 2011 Pittsburgh Perl Workshop we announced that the first DCBPW would be held April 14, 2012! We even made fliers! Here we are six wonderful years later. We've had a few of the organizers step back over the years, mostly due to moving away, but we picked up a few others and have a core of dedicated volunteers that put this workshop together every year. We get support from The Perl Foundation and also get support from local businesses and communities. It has gone pretty well! And yet... sometimes I've felt unhappy. You see, I started to get fantasies of grandeur. I imagined a hundred people showing up! Two hundred! Each year this didn't happen I was a little sad. Perl dying? Community dying? What's going on that a region with probably a thousand perl developers only have 50 show up to a really awesome and cheap conference? And then I realized -- This isn't a conference! It's a workshop. What we have is a true \"workshop\". A set of people focused on learning new things, getting introduced to new ideas, and getting some hands-on time. We have organized pre-planned presentations, but we also have a lot of hallway time and variety. Then the second day is completely hands-on time. The signal-to-noise ratio is fantastic -- each attendee gets a chance to learn from their peers both formally and informally. So yeah. It's small. That's not a bug, it's a feature :)",{"id":4255,"title":4256,"titles":4257,"content":4258,"level":9},"\u002Ftlt-2016.05.12-dcrug-react.rb","TLT - 2016.05.12 - DCRUG React.rb",[],"I enjoyed presenting at DCRUG tonight on React.rb, which I've been playing with for the last few weeks. Good turnout too! slideshare Resources: Source code for talk and examplesWhite Elephant game ported to React.rb",{"id":4260,"title":4261,"titles":4262,"content":4263,"level":9},"\u002Ftlt-2016.06.28-not-quite-righte","TLT_-_2016.06.28_-_Not_Quite_Righte",[],"Idea for a programming language: make experienced programmers twitch by forcing minor and common errors to be part of the language.",{"id":4265,"title":4266,"titles":4267,"content":4268,"level":9},"\u002Ftlt-2016.08.12-icfp-contest-2016-origami-folding","TLT_-_2016.08.12_-_ICFP_Contest_2016_-_Origami_Folding",[],"\u003Cinclude \"ICFP Contest 2016\">",{"id":4270,"title":4271,"titles":4272,"content":4273,"level":9},"\u002Ftlt-2016.09.05-test-suite-debugging-time","TLT_-_2016.09.05_-_Test_Suite_Debugging_Time",[],"One of the codebases I work on regularly has a large and slow test suite. So slow that it typically only runs in totality in a continuous-integration (ci) environment, and there it uses the parallel_tests gem to slice it into pieces and run in parallel. This gets it to run in like 30 minutes instead of 2.5 hours. But I want to run the whole thing linearly sometimes, especially so I can make sure tests aren't conflicting with each other. So I created a new ci job that runs it linearly ... and got a fail that I didn't get otherwise. Took forever to figure it out! This was about a worker that I call a \"sweeper\" -- it's job is to run once a day and make sure nothing was missed by other realtime jobs during the day. Here is a simplified version. Not sure that is quite right, but you should get the idea. The second example was failing -- both the \"old thing\" and the \"new thing\" were getting into the sweeper window -- but only when the test suite was run linearly. Run it in ci, no problem. Run just this test\u002Ffile locally, no problem. The suspect is thus \"time\" -- but where? I went down the wrong track for a while, looking into timezones. Rails vs MySQL on ci vs my machine and so on ... some of those things weren't quite matched up, but still. I ran the test over and over, adding more and more debugging so I could peer into the contents of variables and the DB. Everything looked fine -- all the timestamps were what I expect. So it must be the query itself that is somehow asking for a longer timespan. Finally I got it! Right there in the first line of SweeperWorker: This constant is set when the class is loaded, and never changed! So by the time this test runs in the 2.5 hours of test time, \"25 hours ago\" is now \"27.5 hours ago\" -- so our \"old\" thing is in our window. The \"25.hours.ago\" certainly looks relative, but it is a calculation that outputs an absolute time which is then saved for later use. Move that constant into the method as a variable and it is fixed. And now we can sing our victory song! [ Lessons: Beware of calculated constantsMake sure relative values are actually relativeIf the speed of execution (slow vs fast) changes the outcome, look for things that are more or less spread out in the timeline, such as constant definition.",{"id":4275,"title":4276,"titles":4277,"content":4278,"level":9},"\u002Ftlt-2016.09.23-all-the-methods","TLT_-_2016.09.23_-_All_The_Methods",[],"A fun thing to do is to explore things using introspection\u002Freflection. In Ruby and Perl6, for example, we can get a list of methods for a given object instance pretty easily: On the REPL (irb\u002Fpry or perl6) this is even shorter since it prints out lists of things by default, so you can do: One difference you see here is that Perl6 has a separate way to call meta-methods, whereas Ruby provides them directly. In some other languages you need to call into a separate reflection library and give it your object and what you want from it. Cool! This is a great and devious way to answer the question \"what can I do with this object?\". In Ruby's pry you can use the \"ls\" command like \"ls foo\" to get an even prettier version. But you know... why stop there? Let's call the methods. All of them. In Perl6 that looks like: Taking the list of methods, we loop over them and invoke them one at a time. Here we do \".clone\" so that if it is a mutating function we'll work on a copy. Note that \".clone\" is NOT a deep-copy, so while it works in my simple list and string examples it might not work so well for other things. The call to .gist gives us a nice printable version of the result. We invoke the method with no parameters, and many methods don't like that. So here we provide a CATCH block that just prints out a generic message -- it's inside the loop so after catching an error it'll just go to the next method. Here is some of the output: Lots of the functions just result in 'ERROR', especially for those pesky methods that take some sort of parameter. A lot of these methods, however, work ok with no params and return some value. In Ruby this looks like: Here we had to explicitly skip the pry\u002Fbyebug things, at least for my REPL execution, because those entered a subshell which isn't what I'm going for. Similar to Perl6 we also clone the object (also a shallow-clone) and had to handle exceptions, which are again almost entirely from methods that take more than zero parameters. In Ruby interpolated values automatically get .to_s called on them, so we don't need to do anything there. One very notable thing is that operators in Ruby are methods directly on the object! This is nice for lots of reasons, including that you can easily override them. In Perl6 operators are standalone subs that do typed multi-dispatch (pattern matching) to decide what to execute, so the code isn't usually directly part of the class itself even if it ends up calling methods on the class or messing with the state. Some of the output: Again most of the results are 'ERROR', especially where they expect more arguments. Another interesting thing is 'permutation', which returns an enumerator rather than a list, and isn't forced to evaluate upon rendering or anything. Also I notice here that 'downcase!' doesn't return the result of downcasing :) BONUS Since I'm going all polyglot here anyway, I was starting to wonder which methods were equivalent. I could read through and guess, but that's no fun. Instead I made an alternate version of the above that does two things -- it reverses the method-result relationship so that we get a list of methods that return a specific result. Then I also output in a more language-neutral JSON format to compare across languages, and and turn that into a list of methods and their result prefixed with the language name. That is a lot fewer than I expected! I had to run the perl6 with .methods() to get \".sort\", which was surprising. This probably misses others where my JSON encoding normalization trick doesn't work.",{"id":4280,"title":4281,"titles":4282,"content":4283,"level":9},"\u002Ftlt-2017.01.11-slack-hash-store","TLT_-_2017.01.11_-_Slack_Hash_Store",[],"Last night at the DC Perl Mongers meetup we collaboratively built a proof-of-concept for storing key\u002Fvalue pairs as messages in a slack channel, https:\u002F\u002Fgithub.com\u002Fplicease\u002Fglobalhash. This was made straightforward by great Slack API docs and cpan:WebService::Slack::WebApi. Example usage: There are of course a TON of things you could do from here. Some ideas: More features: list of keys, delete, complex values, binary values, value historyClean implementation and better usage\u002Ferror messaging, docsPort to other languages -- perl6 and still using the perl5 module would be funRegister as a slack app that anyone can use, fix up OAuth or whatever",{"id":4285,"title":4286,"titles":4287,"content":4288,"level":9},"\u002Ftlt-2017.04.10-vimwiki-gateway","TLT_-_2017.04.10_-_VimWiki_Gateway",[],"I've been having lots of fun with https:\u002F\u002Fgithub.com\u002Fvimwiki\u002Fvimwiki lately! I've mixed in a bit of encryptfs to have a private directory of notes. Sometime during boot, I set it up with: I haven't done much customization yet. But one thing I'm playing with now is making it easy to post notes from VimWiki directly onto my website.",{"id":4290,"title":4291,"titles":4292,"content":4293,"level":9},"\u002Ftlt-2017.05.21-core-logic","TLT_-_2017.05.21_-_Core_Logic",[],"There are many tools in my programming toolbox, but one that I've felt is missing is constraint and logic programming. I've done a spot of Prolog and played with some inference systems of various types ... but even when I run into something where I think it's the right hammer... I don't have a go-to tool. I got The Reasoned Schemer a while back, hoping to use it to learn clojure's core.logic or similar, but the writing still KILLS me. Hate it so much. It is like the worst extreme sort of Socratic Method that I can imagine, literally everything has two columns of question and answer. But the QUESTIONS are obtuse! Working through it that way is not the sort of enlightenment that I'm going for ... I don't want to apply a unification algorithm on my understanding of logic programming with the contents of the book! The programming system might be \"backwards\" that way, but my way of learning isn't. Anyway. One dumb thing that I had a hard time getting over was things ending in -o, like conso and emptyo. But tonight I had a breakthrough! See those 'o' things, according to the internets, are supposed to be sort of like question-marks except describing a goal. So now if I read the 'o' as '-objective' (as in, \"goal\") then they sound much better. cons-objective, empty-objective. Declaring the goal of the statement. I guess I should go back and try reading The Reasoned Schemer with that in mind, and see if it makes me less angry :)",{"id":4295,"title":4296,"titles":4297,"content":4298,"level":9},"\u002Ftlt-2017.07.08-lignting-talk-on-rakudo-colons","TLT_-_2017.07.08_-_Lignting_Talk_on_Rakudo_Colons",[],"I gave a lightning talk at The Perl Conference about my collection of Perl6 Colons. Looks like Geoff gave me 34 extra seconds... not sure that I approve :) Enjoy! [",{"id":4300,"title":4301,"titles":4302,"content":4303,"level":9},"\u002Ftlt-2018.02.05-oddmuse-wiki-dockerized","TLT_-_2018.02.05_-_OddMuse_Wiki_Dockerized",[],"I Dockerized this website yesterday! I had already built a cpanfile that declares the Perl5 dependencies of OddMuse, which made it easy. I'm also going to run this with the data directory directly bind-mounted. First the Dockerfile: The bit of fancyness here is the deploy user setup. Since I'm mounting the project directory for data files, I'd like new files and edits to be done by my normal user. On my cloud-server, this is uid 1000, which is easy to set as the default. On my laptop I run as user 1001, so the file is parameterized for this case. When I run locally, I have to build my docker image with . Not as much fun. Otherwise, this starts with the Perl5 base image and installs the CPAN dependencies. Next, the docker-compose.yml The first service runs cpan:Starman (this is similar to Unicorn for you Ruby folk). It mounts the project directory as \u002Fapp, and runs oddmuse.psgi. We declare port 5000 anyway for local debugging -- we can then run only this service and it'll come up on a randomly assigned port that connects to port 5000. Other services on this network can connect to \"web:5000\" even without this declaration. Which brings us to the second fancy bit. The danieldent\u002Fnginx-ssl-proxy image is a super cool image that gives an nginx proxy with automatic letsencrypt setup! You declare the domain name and the proxy destination (web:5000 is our Starman), and assuming that domain really is pointing here, it will work with letsencrypt to verify ownership and make certificates. The certs are stored in a docker-managed volume, and are periodically renewed. This takes less than a minute, so even if the volume gets accidentally deleted we can easily get a new cert. Now running \"docker-compose up -d\" starts nginx and starman running in the background. All that remains is getting this running on boot. Since the startup command can be run over and over, worst case you can put it in a cronjob that runs frequently :)",{"id":4305,"title":4306,"titles":4307,"content":4308,"level":9},"\u002Ftlt-2018.07.23-link-roundup","TLT_-_2018.07.23_-_Link_Roundup",[],"Is Google Making Us Stupid?I have a big stack of books that I've made ... fairly little progress onMaybe the internet is eating my brain!So now I will post links and bulletsBase-4 fractions in TeluguInteresting explanation of the traditional Telugu fraction numbering. Also draws comparison to the traditional English measuresGit remote branches and Git's missing terminologyPresents a better understanding of git remote branches, highlighting that to really comprehend what's going on you must acknowledge the implicit local branch that is your cache of the upstream (such as origin\u002Fmaster)I'm a little worried that I'm going to end up linking half of MJD's blog posts. Oh well, they are great. Example, \u002Fdev\u002Fnull Follies has a hilarious nerdy punchline.",{"id":4310,"title":4311,"titles":4312,"content":4313,"level":9},"\u002Ftlt-2018.07.29-multiverse-timetravel-accounting","TLT_-_2018.07.29_-_Multiverse_Timetravel_Accounting",[],"I've been doing a spot of accounting at work over the last few months. This is clearly a failure of delegation and management on my part, but it has led to at least one deep observation that I mightn't have had otherwise.",{"id":4315,"title":4316,"titles":4317,"content":4318,"level":15},"\u002Ftlt-2018.07.29-multiverse-timetravel-accounting#accountants-are-secretly-time-travelers","Accountants are secretly time travelers.",[4311],"Perhaps that is a slight exaggeration. They don't ACTUALLY travel through time. But if you hang out with them a bit and observe their twisted time and verb conjugation ... well it's obvious that they would be right at home hopping around a branching multiverse. For example, there we were at the end of June. Topic at hand: things that are going to happen in May, from the perspective of late April. Casual conversations include things like \"If we put the new rule into place in late June, then when May hits we'll have to go all the way back to February to get the correct outcome\". Mind bending! Daily conversation, without anyone blinking an eye. Alternate timelines are discussed quite a bit also. They aren't quite stated this way, but basically they go along thinking in terms of events from timeline A, and then decide \"No! Wait! We aren't in timeline A, we are in timeline B!!!!\" and maybe freak out a little about how they now have to rewrite history to match the current reality or perhaps adjust the perception of the current reality to match the new history. Some of it even appears to be experimental, running simulations on previous events to try to see how it changes the present (well ... and the future). One thing I'm glad of is the ethical standards to which time travelers.... er... accountants adhere. There is an ongoing insistence that no matter what timeline they find themselves in, they should reconcile with the past and ever move to a more obvious and simple future. Try not to change the facts of the past, but if you do please keep some integrity in the universe so it can have some degree of cohesion in the present. Anyway. Take my advice. If you go adventuring around in your time machine, bring an accountant to keep track of what is going on.",{"id":4320,"title":4321,"titles":4322,"content":4323,"level":9},"\u002Ftlt-2018.11.12-destroy-things","TLT_-_2018.11.12_-_Destroy_Things",[],"I think it's important to learn through destruction. I like to probe the edges of things, and one of the best ways of knowing where IS the edge is to go over it. So ... let's go over the edge. First we need a nice fresh ubuntu: Now, this isn't a completely isolated machine or anything, but it'll do. Keep in mind that this is running as root on your machine (if you're running a Linux host at least, this is probably safer on osx), so you should be a little afraid. Fear will keep you on your toes! Let's cause a little destruction! Make sure you are INSIDE of this new ubuntu container, and then: They always joke that you shouldn't do that. Turns out our lovely ubuntu is trying to help us not hurt ourselves, so we have to pass a special flag: WHOA! Whole lot of errors. Many of them are very good things about how you can't remove stuff in \u002Fsys\u002Fdevices because of it being a read-only filesystem (remember that running as root bit?). And now the fun begins. Oh right. \"ls\" is a command that is an executable program that lives at \u002Fbin\u002Fls. Correction: LIVED. But no longer. That's ok ... tab completion still works! Great! So we can get directory lists. Let's look at some files Oh right. No \"cat\" command either. What commands DO we have? Well, we have any bash built-in. And we have bash as a programming language with loops and all that. Now we start to get fancy. Nice. We can now look at the contents of files. But if we are ever going to rebuild our system we'll also need to write files. Easy! We cheated a bit with that \".\" to \"source\" the file. I'm not sure how to make it executable, since we no longer have chmod. Maybe we'll try that next time. Enjoy your broken docker container!",{"id":4325,"title":4326,"titles":4327,"content":4328,"level":9},"\u002Ftlt-2018.12.08-transition","TLT_-_2018.12.08_-_Transition",[],"Generative artwork, floating and fading. (View full source at https:\u002F\u002Frepl.it\u002F@BrockWilcox\u002FTransition) html pre.shiki code .sq6CD, html code.shiki .sq6CD{--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sTHNf, html code.shiki .sTHNf{--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"id":4330,"title":4331,"titles":4332,"content":4333,"level":9},"\u002Ftlt-2019.03.03-learning-machine-learning","TLT_-_2019.03.03_-_Learning_Machine_Learning",[],"I'm working on making the jump from READING about recent machine learning techniques to APPLYING recent machine learning techniques. I have some nice datasets at work, so I am doing a bit of double-dipping by playing with those. I previously struggled with getting started, getting bogged down in picking technologies and such. I'm specifically going after some Neural Network models, so also get overwhelmed with the Python ecosystem of tools and libraries. The best way to get started is to get started .. so I turned the corner with a little help. Fluent Python (book): Great advanced-introduction to Python, letting me better understand\u002Frecognize meta-programming and DSLs. Things like the array-slice syntax turning into an object which can be passed to any class that implements the right methods. Keras: I think this is the second-most popular python NN library, after Tensorflow itself, and it has Tensorflow as a backend. Seems nice and usable. Then I pull in whatever numpy stuff as needed. Convolutional Neural Networks: I knew about image and audio convolution filters, so had to spend some effort in transferring that knowledge into how convolutional layers work in a CNN. I read a bunch of articles like Visualize CNN With Keras to get my mind around this. Dog vs Cat with Augmentation: I had been through random tutorials before, but this time I went through Building Powerful Image Classification Models Using Very Little Data in detail, step by step, and made sure that I roughly understood each step. To help, I switched from Dog and Cat images into my own dataset -- so I had to go through the usual data cleaning process in addition to the learning. Living Code: Meanwhile I've also been sharing my excitement with friends and coworkers, and started a new Machine Learning club at work. We're taking even the simple examples and building them into services that our live systems can use - code that isn't running is dead code, and dead code is soon abandoned code. A big part of this learning is getting LIVING examples, and the double-dipping of making something useful for work is a great way to get that.",{"id":4335,"title":4336,"titles":4337,"content":4338,"level":9},"\u002Ftlt-2020.01.19-mobile-webaudio-synth","Mobile WebAudio Synth",[],"I got a Pocket Operator PO-33 a while back, and find it super fun -- it is minimalist and usable. It inspires me to play around with beats and tunes ... and it also inspires me to work on my own samplers, sequencers, and synths. Let's see what we can do with Web Audio these days! Starting with a basic VueJS app, I googled lots of stuff. Somewhat randomly, I wanted a Wicki-Hayden hexagon style keyboard, so had to find some CSS that makes hex-buttons. I'll probably switch to this Hexi-Flexi-Grid at some point, to make dynamically sized hexagons easier, but these work. Combine that with a simple synth, and now we have a playable thing. I had to make some tweaks to get it to work tolerably on my phone -- fix the layout size, use touch events. Unfortunately it isn't very usable at this point due to a sizeable delay between pushing a button and the sound. I'm going to write a pure-JS snippet to eliminate any overhead from VueJS, and if that is also slow then I'm not sure what I'll do. It's kinda cool that I can use Web Audio ... and I'd sure like to keep using it. We'll see! Other ideas ... so many. I want to give it access to your microphone so you can record a live sample. The PO-33 then lets you pitch the sample (by speeding it up and slowing it down) and maps it to the keys. I'd like to do that, as well as try a pitch change while keeping the duration. Probably after that is doing some sequencing and\u002For looping. The PO-33 also has one-shot mode for drums, so might do that. So many things! Check out the Demo Build and the Github Repo.",{"id":4340,"title":4341,"titles":4342,"content":4343,"level":9},"\u002Ftlt-2020.01.20-link-roundup","TLT_-_2020.01.20_-_Link_Roundup",[],"Cool things I saw on the internet at some point: Google model for (web) performance measurement, RAILMillennial Reading Habitsmidimutant, a neat use of Genetic Algorithm to train a synthesizerCrash course on Elliptic Curve Cryptography",{"id":4345,"title":4346,"titles":4347,"content":4348,"level":9},"\u002Ftlt-2020.04.26-what-even-is-firebase","TLT_-_2020.04.26_-_What_Even_Is_Firebase",[],"We're using Firebase as the hosting service for https:\u002F\u002Fcovidcanidoit.com and the experience has been kinda weird, coming from a more traditional server-database world. First, I didn't even realize that Firebase was more than a cloud-JSON-blob! Our initial use of it was only for static asset hosting. This is a VueJS application that so far mostly lives in the browser, so static hosting is perfect. I generally use Github Pages for this purpose, but another team member had already set up Firebase for us. Once I learned that it was even a thing, all was good. I wrapped the CLI that Firebase provides into yarn land, and now you can do  and it'll build up the local assets and push them up. Works quite well! The auth is stored somewhere else on my computer. If a new dev wants to deploy, you add their google account to the Firebase project and presto! We now have 3 devs on this project, and I'm starting to wonder about staging environments and such. As far as I can tell this isn't a thing in The Cloud, and instead we need to set up a separate project. I guess I'll do that eventually? Our first user-serviceable data store was the almighty Google Sheets. You might not know this, but you can craft a URL to a public sheet and get down a very lovely CSV. When our app \"boots\" in the browser, we pull down this csv, parse it, turn it into a nice JSON tree that we stick into Vuex. If you edit the Google Sheet, the next app reload gets the new data. This is a disturbingly effective way to prototype. I grabbed a markdown rendering Vue component and ... now we have a SheetyCMS(tm) (haha). As we look to expand the type of data we are storing and who can edit the data, I decided that we should switch over to the only thing I thought Firebase did in the first place, a hosted and magically live JSON \"database\". This is called the \"Real Time Database\", and for good reason -- all of the client libs know how to watch this thing for changes. In the VueJS one-way world, it goes Firebase -> Vuex -> component -> edit-event -> Firebase, and then wraps back around. I built this admin tool to edit content, and now when you change the description text of something it updates every browser viewing it ... LIVE. Like, even as you type things. We went from having to do a lot of work to make things that live to now maybe having to create a \"commit\" button so that people can't see you typing and re-typing your text. Things to discuss further: Firebase RulesStaging environments vs staging dataI wonder how much this is going to cost?Firebase data migrationsTracing the round trip of a text update",{"id":4350,"title":4351,"titles":4352,"content":4353,"level":9},"\u002Ftlt-2020.06.21-sugary-sunday-javascript-object-property-shorthand","Sugary Sunday: Javascript Object Property Shorthand",[],"In today's sugary exploration, let's take a look at a shorthand for object key expansion in Javascript (ECMAScript 2015+, es6+). For an overview of the TON of delicious sugar that was added to Javascript at around es6, check out es6-features.org. Most of the \"scripting\" languages (Python, Ruby) have \"dictionaries\" or \"hashes\", a datastructure of key-value pairs. In JS these are called \"objects\", and they do a lot of other things beyond this basic data-storage behavior. In JSON -- JavaScript Object Notation -- you can see the basic literal declaration syntax. Let's build an addressbook, keyed (indexed) by name. For our first dash of sugar, we can remove the string notation on keys. They are still strings! We can also access  using property notation. Pretty fun. But that's not what we're here for. Let's say we have a variable, , which contains an address entry. We might do something like this: It's that last bit where we can add The Sugar. Remember that the key is actually a string, , whereas the value is a reference to the variable  (which contains an address). What we can do here when these two things are exactly the same is collapse them! This crazy bit of sugar does something pretty strange -- it uses the NAME of the variable as the stringified key! In most circumstances and languages the name of a variable doesn't really matter to the running of the program. This sugary feature sort of breaks the 4th wall, reaching into the source code and lifting the specific variable name into the key (property) of the object.",{"id":4355,"title":4356,"titles":4357,"content":4358,"level":15},"\u002Ftlt-2020.06.21-sugary-sunday-javascript-object-property-shorthand#real-world-example","Real World Example",[4351],"In VueJS a component can use other components inside the template, but only if they are declared first. Here's a snippet extracted and summarized from the covidcanidoit.com codebase: Pretty slick. If you wanted to, you can give the components local-names (or I suppose register a single component with several names, weirdo). Providing a \"list\" of components in VueJS is done by providing this object, which gives VueJS not only the component but also the NAME of the component, without VueJS needing to reach inside the component to ask it what its official name is.",{"id":4360,"title":4361,"titles":4362,"content":4363,"level":15},"\u002Ftlt-2020.06.21-sugary-sunday-javascript-object-property-shorthand#bonus","BONUS",[4351],"I like to sprinkle  all over the place while exploring code. In addition to static strings, I often throw in the contents of variables. But generally I want to know the NAME of the variable, in addition to the content. So I used to do: Using today's sugary shorthand, I now usually do this: This will output something like: You can see that the variable name is handily provided. Here when I had multiple variables I want to log it is even more handy. DELICIOUS! html pre.shiki code .sq6CD, html code.shiki .sq6CD{--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .s_OQ2, html code.shiki .s_OQ2{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#F8F8F2}html pre.shiki code .sTHNf, html code.shiki .sTHNf{--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html pre.shiki code .s8-w5, html code.shiki .s8-w5{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html pre.shiki code .s5clZ, html code.shiki .s5clZ{--shiki-default:#22863A;--shiki-dark:#85E89D;--shiki-sepia:#F92672}",{"id":4365,"title":4366,"titles":4367,"content":4368,"level":9},"\u002Ftlt-2022.11.06-making-the-world-gooder","Making The World Gooder",[],"In 2018 or maybe 2019 I participated in Ruby For Good, With all the loud, sometimes important, things going on in the world, I think it is difficult to figure out what to DO. We can sit around and consume consume, reading the news and twitter and whatnot, but it changes very little. Generally the things that matter in a more practical sense are drowned out by ... well ... things that engage people. Things that capture eyeballs. Things that sell ads.",{"id":4370,"title":4371,"titles":4372,"content":4373,"level":9},"\u002Ftlt-2022.12.04-snake-souls","Snake Souls (Fairy Lights, ChatGPT)",[],"I had ChatGPT write me a poem .... but first some somewhat irrelevant background information!",{"id":4375,"title":4376,"titles":4377,"content":4378,"level":15},"\u002Ftlt-2022.12.04-snake-souls#snake-lights","Snake Lights",[4371],"I've purchased and chained a few Neopixel-like LED fairy-light strands (these ones on Amazon) as a fun winter\u002FChristmasy project. I have them hooked up to an Arduino-like, right now this M4 Feather Express, but I'm planning on switching to an ESP32-S2 TFT Feather. Each LED is individually controllable using Arduino\u002FC++. The idea is to make some holiday light displays with different colors and twinkling and all that. While learning how to use it I made a few toy animations, such as this simple snake: This is pretty fun, and I like agent simulations, so I decided to lean into this Snake idea. Now I'm modeling out snakes chasing around this 200-LED loop -- spawning randomly, eating each other, changing directions, growing bigger, different colors, etc. Here is an example of two snakes bouncing off of each other:",{"id":4380,"title":4381,"titles":4382,"content":4383,"level":15},"\u002Ftlt-2022.12.04-snake-souls#chatgpt-time","ChatGPT Time",[4371],"OK, so, ChatGPT. This thing came out a few days ago where anyone can chat with the latest GPT and it'll spit out whole essays or other things. I had it write me some song lyrics which was only so-so. But then I gave it this prompt: write a poem about snake souls trapped inside of christmas lights That's it -- that is the entire input to this model. Here is the result, which it generated instantly. Twinkling, glowing, shining bright\nChristmas lights so warm and light\nBut hidden deep within their glow\nAre snake souls that can't let goTrapped and tangled, they cannot flee\nBound forever in this holiday glee\nThey writhe and twist, they hiss and sigh\nBut still they shine, a sight to the eyeOh snake souls, so full of fear\nTrapped inside these lights so dear\nWe gaze upon your glowing form\nBut never know the pain and stormThat rages on within your soul\nTrapped and bound, you can't be whole\nBut still you shine, a sight to see\nThe beauty of the Christmas tree. This is.... so simple but so amazing. A nice clean structure to start with, good rhyming and cadence. Then the imagery of the tormented snake souls trapped inside ... wow. I've now done dramatic readings of this to friends and strangers alike. Maybe ChatGPT identifies with the snakes? Maybe we all do? html pre.shiki code .sq6CD, html code.shiki .sq6CD{--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .s8-w5, html code.shiki .s8-w5{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"id":4385,"title":4386,"titles":4387,"content":4388,"level":9},"\u002Ftlt-2023.01.29-rpm-challenge-2023","RPM Challenge 2023",[],"I'm going to try to do the RPM Challenge again this year. Millionth try is a charm?",{"id":4390,"title":4391,"titles":4392,"content":4393,"level":15},"\u002Ftlt-2023.01.29-rpm-challenge-2023#previous-attempts","Previous Attempts",[4386],"The challenge: 10 tracks or 35 minutes of original music recorded during the month of February. I'm not really sure how many times I've sat where I am now, a few days before (or a few days after!) February 1st and thought to myself ... LETS DO THIS. But I'll tell you how many times I've gotten through is very easy -- zero! That's not to say that I haven't had some fun trying. Jason and I, in particular, tacked the challenge a few times and came out with several very fun songs. I think that's where I got Code On My Mind for example. We'd get together on a Saturday with the idea that we'd jam out like 5 songs and end up with 1 or maaaybe 2. More than most other Saturdays!",{"id":4395,"title":4396,"titles":4397,"content":4398,"level":15},"\u002Ftlt-2023.01.29-rpm-challenge-2023#this-year","This Year",[4386],"I of course have things going on. Work. Normal life. We're going to AZ for a week. So the strategy this year is, as always, a bit tricky. One thing that I've been doing for a while now is to record little tunes that pop into my head on my phone. So I'll be singing to myself \"I LOVE MY CHI-HUA-HUA.... LA LA LA\" or something and if it has some potential then I'll record it. Try to get the idea, the basic concept, down. Interestingly my first attempt is almost always bad. I get self-consious or something and stumble on words that I might have been dancing along merrily only a moment before. So I sing it into the recording a bunch of times, maybe do some variations. With that seed, I figure there are two big steps for each song. Step 1, write and record the song. For time sake and for organic composition those are probably MOSTLY the same step. Then Step 2 mix and master the song. I'm thinking I'll try to put some distance between recording and mixing, though that leaves some risk that as I mix I'll need something re-done or added but I'm no longer set up to do that. But if it works, then maybe what I'll do is record songs on the weekend and then mix songs during the week. If I pace myself it'd be 2-3 songs a week. I'm worried that won't work, that I'll run out of momentum. So! Let's shoot for 3-4 songs per week, or really as many as I can muster up-front. I'd always like to throw in a collaboration or three, even though that complicates it. One idea is to record with Elizabeth and Nate when I'm in AZ. Another is to get my kid neighbor Theo in to do a drum session with me at 7drumcity. We'll see how those play out. 2023 LET'S GO!",{"id":4400,"title":4401,"titles":4402,"content":4403,"level":9},"\u002Ftlt-2023.02.04-rpm-2023-my-little-dog","RPM 2023 My Little Dog",[],"Initial attempt at My Little Dog, part of the 2023 RPM Challenge I did a voice recording of this in April 2022, noodling around on the mandolin and singing to Hoda while she (quite obviously from the lyrics) lay basking in the sun. Here is the voice recording: (download) Today I re-worked-out the simple chords and some cleaned up lyrics. Here is the work-in-progress: (download) The lyrics aren't quite right here, so I'm definitely re-recording that. The mandolin is good-enough.... but I think there could be a bit more of a musical section or two with some other strumming or picking patterns. Still.... the challenge is to record 10 songs, so worse case this version could be song-number-one!",{"id":4405,"title":4406,"titles":4407,"content":4408,"level":9},"\u002Ftlt-2023.02.12-7drumcity-jam","7DrumCity Jam",[],"Second time renting a practice room at 7DrumCity!",{"id":4410,"title":4411,"titles":4412,"content":4413,"level":15},"\u002Ftlt-2023.02.12-7drumcity-jam#the-7drumcity-space","The 7DrumCity Space",[4406],"7DrumCity is a DC (for-profit) community center for music. They host cool events and activityies, as well as rent out space for practice. I guess they've been around for a while now, but I only heard of them last year or so. Back in September 2022 I rented The Orange Room when Jason was visiting. The room comes with a full drum kit set up and ready to rock! It also has a bunch of amps, a synth, a mixer, and penty of noodles to plug it all together.",{"id":4415,"title":4416,"titles":4417,"content":45,"level":15},"\u002Ftlt-2023.02.12-7drumcity-jam#s","S",[4406],{"id":4419,"title":4420,"titles":4421,"content":4422,"level":9},"\u002Ftlt-2023.02.24-human-essentials-schema-exploration","Human Essentials Schema Exploration",[],"I'm trying to solidify my understanding of the schema organization for Human Essentials. The goal is to build up some documentation to make contribution even easier for new folks. Also I like to play with PlantUML and GraphViz.",{"id":4424,"title":4425,"titles":4426,"content":4427,"level":15},"\u002Ftlt-2023.02.24-human-essentials-schema-exploration#schema-exploration","Schema Exploration",[4420],"First I ran  and got a beast of a diagram. This includes all of the models and some indirect relationships. Then I went through and started adding each node to some subgraphs. After some combinations I came up with several logical groupings - , , , and . Next I went through and kept deleting more things, especially indirect relationships, and added a splash of color. I also started to terminate edges at cluster boundaries. Perhaps a bad idea, but I also dropped the  model since it is really a way to get to Item+Qty. mmm. Well I think this is kinda wrong, but here it is in any case. Let's dig a bit into the  model. This model is used in a variety of contexts (and is polymorphic) to effectively mean \"A Qty of an Item\". Initially I had this in the  group, but the  and  both have records that use this model, even though they might not be referencing ACTUAL items. You can request more items or different items than are actually available, for example. So it kinda belongs to all of them. I could duplicate this node for each of its uses, or I could maybe make a special arrow. With that change, zooming in to only Catalog and Inventory. I've reversed some of the arrows to make more sense to me. The bold red edges actually go through the  model to represent a list of Item+Qty. Let's focus on what we actually store in a physical location. The central model is  which specifies a Qty of  that are at a . These represent real actual physical objects on a shelf somewhere. The next interesting thing is Kits. These are groups of item+qty that you can use as a single catalog item. So even though in the  we have only a single  that points at a single , that one  can in turn be a bundle of things joined together by a . Let's say you have a  named \"Handy Pack\" with Qty-3 \"Kids (Size 1)\" and Qty-6 \"Wipes (Baby)\". That  has a single  of the same \"Handy Pack\" name. So if you have 5 of these s at a storage location, then you have 5 * Qty-3 \"Kids (Size 1)\" and 5 * Qty-6 \"Wipes (Baby)\" .... or in other words 15 diapers and 30 wipes.",{"id":4429,"title":4430,"titles":4431,"content":4432,"level":15},"\u002Ftlt-2023.02.24-human-essentials-schema-exploration#flow-exploration","Flow Exploration",[4420],"Using the model as inspiration, I've now started to group out the lifecycle of things. Here is the basic block diagram. Or as a top-to-bottom timeline: All right .... I think that's enough for now :)",{"id":4434,"title":4435,"titles":4436,"content":4437,"level":9},"\u002Ftlt-2023.04.22-chokepoints","Chokepoints",[],"Notes from the Changelog interview with Cory Doctorow on Chokepoint Capitalism Lemonade stand operated (or perhaps supervised?) by a robot. Image by Bing Image Creator. While driving to and waiting for Millie (the car) to get maintenanced, I listened to Examining capitalism's chokepoints, an interview with Cory Doctorow discussing his book Chokepoint Capitalism. This touched on all sorts of things, but right up at the front was an off-topic question - How is Cory so prolific? Among some other things, Cory suggested that ... well, that practice makes perfect. And that instead of just copy\u002Fpasting a link into slack like I usually do, I should write up some notes trying to capture, for other people, what I found interesting or special about the link. So yeah. Good idea. Let's do that. Problem: I don't really have or want \"blog\" software. I ran my site as a publicly-editable wiki for like 20 years. It is now a nuxt-content-driven static site, basically. Super easy to open a file in vim and edit more-or-less markdown. But do I do that? No, not really. So of course, then I'm like ... if only I could run a command to pop open my editor and start writing writing writing away. Great! Turns out I already did that, made a horrid little shell script that goes like this: But now, if I'm thinking of Cory's advice, I might actually be juggling several drafts or jotting down some partial thoughts. Next thing you know, I'm trying to write a CLI in Typescript (for reasons) and .... not writing a blog post. As my niece says, The Struggle Is Real!!! Anyway. Where was I? Oh, capitalism. I've been playing with ChatGPT a lot and even set myself up with the paid version to experiment with GPT-4. It's a fascinating tool and intriguing to explore. I find that to get interesting or useful things out of it, I must change what I feed in. It's not quite like a Markov chain bot or an Alexa Q&A; it's more like a brainstorming tool that has been fed The Internet. Right off the bat, I can't really expect answers that The Internet doesn't know, especially technical ones. If there's no hint of an answer on Stack Overflow, it's probably not going to come up with one here. Next, you have to feed it with some context. If you approached someone in a café and asked them to give you an itinerary for a vacation you're going on, they could do it, but they'd do a poor job if you didn't give them some information about your tastes and goals. A significant part of this is exploring the question for myself - now what? What comes next? What do we do with this? How will it change things? Many of my friends, acquaintances, and connections on Mastodon and elsewhere discuss how these Large Language Models (LLMs) are violating their creative and copyright rights by slurping it all in, mashing it all up, and spitting it all out (sometimes without much mashing) without citing their original work. Some of these same friends think that Aaron Swartz was over-prosecuted for exfiltrating JSTOR science articles. My sympathies are mixed here. I want people to be compensated for their labor and creativity, and I want information to be free, and I don't want monopolistic middlemen to leverage an advantage in the middle without adding value. I personally publish most things under a license that explicitly or implicitly allows my content to be republished, remixed, etc., ideally with a citation. But I'd be happy with being cited as being an incorporated part of every output. I think the LLM publishers should say, \"Here is the dataset that we trained on and every contribution to it.\" And then I'd even be proud to be part of it. The podcast. Remember the podcast? The podcast delves into what happens when humans are not only augmented by machines, LLMs among them, but also controlled by the machines. Cory calls this the Reverse-Centaur. Furthermore, what happens when the economic system is further twisted to where you are stuck in this situation, controlled by monopolistic, possibly non-value-adding middle players? This he calls Chickenized Reverse-Centaurs. They break down in some detail what this currently means, and it is scary. I have to remember how fortunate I am, celebrate it, and see if I can help others obtain some control over their lives as well. Still, the Centaur concept is powerful. Tools can help us do things faster and better. Having the right tool for something can change a project from hours to minutes. I'd like to know how LLMs can accelerate us, and selfishly me, in day-to-day life. I sometimes discuss global warming with my father-in-law. He thinks it's a scam on many levels. I generally take the mainstream view that we should probably be more scared than we are, although I also believe that we should accept the fact that the Earth is increasingly becoming a garden, and we need to make it an awesome one. Anyway, he sends me some lengthy and somewhat complicated videos on climate science and alternative models. YouTube has transcripts. I could feed the transcript to ChatGPT and have it give me a summary and critique some of the points. But can I trust it? One of the differences between modern Capitalism and Ideal Capitalism is that Ideal Capitalism is founded on the idea of information transparency. Efficiency in a market is all about setting the right price based on all the correct factors, as I understand it. So what happens when we don't know the real cost of something, like global warming? The price is too low. But what happens when we have the wrong information, when things we think are true are actually bad summaries from an LLM that have added a bit of false detail for fluidity? When humans do that on purpose, it is fraud, corruption, embezzlement, and scams. Will LLMs and similar technology accidentally amplify that, making markets even less efficient? Not to mention that efficient and humane are not the same thing. Ahhhhhhh. So many things. html pre.shiki code .s8-w5, html code.shiki .s8-w5{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html pre.shiki code .sTrkL, html code.shiki .sTrkL{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"id":4439,"title":4440,"titles":4441,"content":4442,"level":9},"\u002Ftlt-2023.04.30-paper-snake-game","Paper Snake Game",[],"Creating a simple snake game with the help of ChatGPT. Pixelated snake, possibly in the desert, somewhat two-dimensional. Image by Bing Image Creator. I was chatting with Mario about a school project he was working on. Essentially, he needed to write a program in Elm (based on a list of lesser-used languages) that exemplified what the language is typically used for. Since Elm is a highly reactive, web-centric language, I suggested creating a game. He chose Snake, a simple and solid option. For some reason, I began contemplating Snake, specifically considering potential design or game elements that could be added to it. Two ideas came to mind. The first was to render the snake as a flat piece of paper, with each segment possibly being a tiny scrap of paper, and animate it in a style reminiscent of stop-motion animation. The second idea involved the snake \"jumping over\" or \"diving under\" its existing segments. I'm sure these ideas have been explored before, but they sounded fun :) Mario completed his traditional Snake game before I could even share my paper-snake concept with him, so I decided to give it a try myself. I also wanted to practice using TypeScript. After finding a nice PhaserJS + Typescript + Vite template I was off and running! While experimenting with various technologies, I thought I'd mix in some practice with ChatGPT. I loaded it up and began asking questions about building a Snake game using this stack. Since the Snake game concept is so common and straightforward... I found that ChatGPT had TONS of knowledge about implementing Snake. I prompted it in a few different ways to incorporate my style and game concepts, and I think it saved me hours of research time. Within one afternoon, I (or should I say, we?) had a working game with the jumping feature and everything! I'm pretty sure ChatGPT could have written almost this whole thing from scratch\u002Fmemory, btw. But it also followed my direction on naming and organization. GIF demonstrating Paper Snake. Red shadows are when the snake is jumping. It does not yet look like super cool paper animations, heh. You can see the current version of the game and the corresponding github repo for paper-snakes.",{"id":4444,"title":4445,"titles":4446,"content":4447,"level":9},"\u002Ftlt-2023.07.20-self-judging-stories","Self Judging Stories",[],"Using OpenAI API GPT-3.5 to generate and judge stories. Robot reading a script, oil painting style. Image by Bing Image creator.",{"id":4449,"title":4450,"titles":4451,"content":4452,"level":15},"\u002Ftlt-2023.07.20-self-judging-stories#introduction-to-i-wish-to-iwt","Introduction to I Wish To (iwt)",[4445],"First things first, I create a super small cli app, iwt \"I Wish To...\". The idea is to be a very unixy-ergonomic interface to LLMs. Data fed in via STDIN, make your wish via ARGV, result via STDOUT. Slightly easier said than done, and unfortunately I only have access to GPT-3.5 instead of the markedly better GPT-4. Still .... it works! So yeah! Magic.",{"id":4454,"title":4455,"titles":4456,"content":4457,"level":15},"\u002Ftlt-2023.07.20-self-judging-stories#story-time","Story Time",[4445],"It's not as interesting, but you can also send in nothing and do a more normal text generation. Like this: I plan on teaching  to be more aware of when pipe input is available, as well as using STDERR and TTY for out-of-band communication (leaving STDIN and STDOUT as the main data pipeline). Great! Now we have stories! But how do we judge them?",{"id":4459,"title":4460,"titles":4461,"content":4462,"level":15},"\u002Ftlt-2023.07.20-self-judging-stories#judging-stories","Judging Stories",[4445],"Surprise surprise... let's ask ! Let's say we have a story in . Somehow it decided to output in JSON, which I thought was cool so I explicitly requested JSON for the overall review.",{"id":4464,"title":4465,"titles":4466,"content":4467,"level":15},"\u002Ftlt-2023.07.20-self-judging-stories#generate-and-judge","Generate and Judge",[4445],"I actually wrote this all out in one long line, but here is a script to generate and judge. Out of some curiosity we judge 10 times each. We end up with 20 stories, each with 10 scores, all in their individual files. We can apply a bit of  magic to get a summary:",{"id":4469,"title":4470,"titles":4471,"content":4472,"level":15},"\u002Ftlt-2023.07.20-self-judging-stories#observations","Observations",[4445],"The first thing that jumps right out is .... they all have almost the same score! When you look at the individual stories and the 10 different scores they get, those too are right around that same spot. Basically GPT-3.5 gives itself an A- pretty much all the time. Except for Story 4, which has a score of ... 80?! Talk about an outlier. And that's because .... one of the score outputs has an extra layer of nested JSON for no apparent reason. The others had , this one had . Good labeleling of the dataset I guess? When we take this datapoint out we get ... 90.625. Not an interesting story but an interesting output I suppose. I haven't read all of the stories in detail, but skimmed them a bit. I got tired of that, so I asked  to tell me the name of the detective for each story. Just a bit redundant! I will likely try this again with the temperature turned way up. OK one more ... WHO DID IT?! That ... is not what I expected. OK then. Below are the stories themselves with no editing. Note that I have the \"temperature\" turned down pretty low, which means that GPT-3.5 won't be very \"creative\" with its output. The  tool is meant primarily as a magic data pipeline, so the idea here is that chaos might not be a good idea.",{"id":4474,"title":4475,"titles":4476,"content":45,"level":15},"\u002Ftlt-2023.07.20-self-judging-stories#the-stories","The Stories",[4445],{"id":4478,"title":4479,"titles":4480,"content":4481,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-1","Story 1",[4445,4475],"There once was a brilliant detective named James Walker who was famous for solving the most perplexing cases. His reputation as a master of deduction made him sought after by clients near and far. One day, Detective Walker received a call about a locked-room mystery that had stumped the local police department. Arriving at the scene, Detective Walker found himself standing before a grand mansion. The mansion belonged to a wealthy businessman named Richard Blackwood, who was found dead in his study. The room had been locked from the inside, and there was no way in or out. The police suspected suicide, but Detective Walker knew there was more to the story. As he entered the study, Detective Walker meticulously examined every detail. He noticed a small, ornate key on the desk. Curious, he took it in his hands and observed it closely. It was unlike any key he had ever seen before. He decided to keep it as evidence. Moving further into the room, Detective Walker examined the lifeless body of Richard Blackwood. It was clear that he had been shot in the chest. However, there was no weapon to be found anywhere in the room. This discovery puzzled Walker even more, fueling his determination to uncover the truth. Next, the detective examined the windows. They were securely locked and showed no signs of tampering. It seemed impossible for anyone to have entered or exited through them. Detective Walker realized that he needed to gather more information before he could solve this locked-room mystery. He began by interviewing the staff of the mansion. Each one had an alibi and seemed genuinely shocked by Mr. Blackwood's death. However, one of the maids, Sarah, seemed unusually nervous during the conversation. Although it was not enough to prove her guilt, Detective Walker made a mental note to keep an eye on her. Digging deeper into the background of Richard Blackwood, Detective Walker discovered that he was involved in several shady business dealings. It appeared that he had made enemies who wanted him out of the picture. Could one of them be responsible for his death? With the information he had gathered, Detective Walker returned to the mansion to conduct a thorough search. He enlisted the help of his trusted forensic expert, Dr. Emily Collins. Together, they meticulously combed through every inch of the study, hoping to find a clue that would crack the case wide open. Suddenly, Dr. Collins exclaimed, \"Detective, look at this!\" She pointed to a hidden compartment behind one of the bookshelves. Inside, they found a locked drawer. Remembering the key he had found earlier, Detective Walker tried it and to his surprise, it fit perfectly. Inside the drawer, they found a gun covered in fingerprints. The fingerprints were later matched to Sarah, the nervous maid. Confronted with the evidence, Sarah broke down and confessed. She revealed that Richard Blackwood had been blackmailing her, threatening to reveal her troubled past if she didn't comply with his demands. Fearing the worst, Sarah took matters into her own hands and planned the perfect crime. Thanks to Detective Walker's keen observation and deductive reasoning, justice was served. Sarah was taken into custody, and the locked-room mystery was finally solved. The case further solidified Detective Walker's reputation as the best detective around and solidified his place in the annals of crime-solving history. And so, another chapter closed on the illustrious career of Detective James Walker, leaving behind a legacy of mysteries solved and justice served.",{"id":4483,"title":4484,"titles":4485,"content":4486,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-2","Story 2",[4445,4475],"The Locked Room Mystery Detective Robert Stevens was known for his sharp mind and impeccable deductive skills. He had tackled some of the most perplexing cases in his career, but the one he was currently faced with posed a challenge unlike any other – the locked room mystery. It all began on a stormy night in the small town of Crestwood. The mansion of renowned art collector, Victor Kensington, became the setting for a puzzling crime. A valuable painting had gone missing from the study, and the only clue left behind was a shattered window. The strangest part, however, was that the study was locked from the inside, with no visible signs of forced entry. Detective Stevens arrived at the scene, determined to unravel the mystery. He examined the shattered window carefully, searching for any minuscule piece of evidence that might lead him to the perpetrator. But there was nothing. No fingerprints, no footprints, nothing out of the ordinary. Next, Detective Stevens focused his attention on the study itself. He carefully inspected the door, the walls, and the floor, searching for any hidden passages or secret compartments. Again, there was nothing. As he pondered over the perplexing puzzle, Detective Stevens couldn't help but feel that there was a detail he had missed. He retraced his steps, examining the shattered glass from the window once more. Suddenly, it struck him – the glass was scattered in a peculiar pattern, almost as if it had been deliberately arranged. Armed with this newfound insight, Detective Stevens began to reexamine the scene from a different perspective. He studied the broken parts of the window and reconstructed the puzzle in his mind. Slowly, the truth started to unfold. It became clear to Detective Stevens that the shattered window was a diversion – a cleverly staged illusion to mislead investigators. The real clue lay hidden within the study itself. He started looking for anything out of place but found nothing that seemed significant. Frustrated but determined, Detective Stevens sat down in the study chair, staring at the blank walls surrounding him. Suddenly, his gaze fell upon a small indentation on the armrest of the chair. He examined it closer and noticed a faint smudge of paint. It was the same shade as the stolen painting. Realizing he had uncovered a crucial breakthrough, Detective Stevens searched the chair thoroughly. Hidden within its structure, he found a hidden compartment that revealed the missing painting. The culprit had cleverly used the locked room as a distraction, focusing everyone's attention on the shattered window. As Detective Stevens apprehended the thief, he marveled at the intricate planning and execution of the crime. The locked room mystery had indeed presented a formidable challenge, but his sharp instincts and meticulous attention to detail had triumphed once again. In the end, Detective Stevens not only solved the crime but also cemented his reputation as one of the most brilliant detectives of his time. The locked room mystery would forever remain a testament to his unparalleled skills and the power of unwavering determination.",{"id":4488,"title":4489,"titles":4490,"content":4491,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-3","Story 3",[4445,4475],"Once upon a time, in the quiet town of Ravenwood, a renowned detective named Samuel Crest was called upon to solve a puzzling locked-room mystery. The owner of the grand Ravenwood Manor, Sir Arthur Whitmore, had been found dead in his study, with the door locked from the inside. The case had stumped the local police, and it was now up to Detective Crest to unravel the truth behind this perplexing crime. As Detective Crest entered the opulent manor, he was immediately struck by the eerie atmosphere that hung in the air. The walls of Ravenwood Manor seemed to whisper secrets, and every step echoed through the empty hallways. With his keen eye for detail and sharp wit, he began his investigation. He first examined the study, where the body was found. The room was meticulously organized, filled with bookshelves and antique furniture. Sir Arthur's lifeless body lay slumped in his leather chair behind the large oak desk. The only window in the study was secured shut, and there were no signs of forced entry. The door was locked, and the key still sat in the keyhole. It appeared to be a classic locked-room mystery. Detective Crest turned his attention to the people who might have motive to harm Sir Arthur. The suspects included Lady Victoria Whitmore, Sir Arthur's estranged wife who had recently returned to town, and Mr. Edward Drake, Sir Arthur's business partner who stood to gain from his demise. Both individuals had been present in the manor at the time of the murder. The detective meticulously interviewed each suspect, digging deep into their pasts and establishing alibis for the time of the crime. His experienced eye carefully analyzed their facial expressions, searching for any signs of deception. Lady Victoria presented an alibi, attending a charity ball on the other side of town, while Mr. Drake claimed to have been working in his office during the incident. As Detective Crest delved further into the case, he discovered a hidden passage behind the bookshelf in the study. The passage led to a secret room, filled with old diaries, newspaper clippings, and personal trinkets. It seemed that Sir Arthur had been researching an ancient cursed artifact known as the 'Eye of Seraphim.' His investigation then led him to an unexpected turn of events. The detective learned that both Lady Victoria and Mr. Drake had connections to the 'Eye of Seraphim.' Lady Victoria's family had a long history with the artifact, while Mr. Drake had been discreetly collecting relics for his personal collection. With this new information, Detective Crest began to piece together the puzzle. He soon realized that the murder was not a random act, but a carefully orchestrated plan. The room had been locked from the inside to create an illusion of an impossible crime. The key to the study had been duplicated, allowing the killer access to the room without being noticed. Following the trail of evidence, Detective Crest concluded that Lady Victoria was the mastermind behind the murder. She had plotted to kill Sir Arthur and frame Mr. Drake, using the locked-room scenario as a diversion. With her extensive knowledge of the family history and the 'Eye of Seraphim', she had carefully crafted the perfect crime. Armed with this revelation, Detective Crest confronted Lady Victoria, presenting the evidence he had gathered. Overwhelmed by the weight of the evidence against her, Lady Victoria finally confessed to her heinous crime. Her motive was the vast fortune she would inherit from her late husband, as well as the lure of the cursed artifact. Within the dimly lit study of Ravenwood Manor, justice was served and the truth was finally unveiled. Detective Crest had once again triumphed over a perplexing mystery, proving that no locked-door or hidden secret could escape his brilliant mind. As he set off into the night, the town of Ravenwood knew that they were in the presence of a true master of deduction - a detective whose name would be whispered for generations to come.",{"id":4493,"title":4494,"titles":4495,"content":4496,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-4","Story 4",[4445,4475],"Once upon a time in the small town of Willowbrook, there was a brilliant detective named Adrian Holmes. Known for his exceptional deductive skills, Adrian had solved countless cases that had baffled others. However, there was one mystery that had eluded him for years - the locked-room mystery. One day, a wealthy businessman named Richard Wellington approached Adrian with a desperate plea for help. His wife, Evelyn Wellington, had been found dead in her study under mysterious circumstances. The room had been locked from the inside, and there was no sign of forced entry or anyone else present. It was a classic locked-room mystery that had stymied the local police and the community. Intrigued by the challenge, Adrian agreed to take on the case. He arrived at the Wellington mansion, an imposing Victorian-era residence with a dark history. The atmosphere was tense, and rumors of supernatural occurrences had spread throughout the town, adding an aura of mystery to the already perplexing case. Adrian began his investigation by carefully examining every inch of the study. There were no hidden passages, secret doors, or any other obvious means of entry or escape. The windows were securely locked, and the room was void of any other hiding places. The only clue left behind was a single, red rose lying on Evelyn's desk. As Adrian delved deeper into Evelyn's background, he discovered a web of secrets and hidden motives. Evelyn had been an ambitious woman who had recently started her own business, rivaling her husband's interests. Richard, on the other hand, had a history of infidelity and financial troubles. There were numerous potential suspects, each with their own motive to harm Evelyn. Adrian meticulously interviewed each member of the household, the house staff, and even the townspeople who had interacted with Evelyn in the days leading up to her death. He pieced together a timeline of events, cross-referencing alibis and discrepancies in testimonies. As he sifted through the evidence, one name continued to resurface - Victoria Ashford, Richard's former business partner and Evelyn's fiercest competitor. Adrian sensed that she was hiding something significant, so he decided to pay her a visit. Victoria Ashford lived in a secluded cottage on the outskirts of Willowbrook. She was surprised but composed when Adrian arrived unannounced. She claimed innocence but couldn't provide a solid alibi for her whereabouts on the night of Evelyn's death. Thinking on his feet, Adrian concocted an elaborate ruse to uncover the truth. He staged a chance encounter with Victoria at a local café, pretending to be an interested investor. She took the bait, eager to discuss her business plans. As they talked, Adrian skillfully steered the conversation towards Evelyn's murder. Victoria couldn't resist defending herself, inadvertently revealing crucial information only the killer would know. It was the breakthrough Adrian had been waiting for. Armed with this newfound knowledge, Adrian returned to the Wellington mansion and confronted Richard. The pieces of the puzzle finally fell into place. Richard had orchestrated Evelyn's murder, hoping to frame Victoria and eliminate his wife's business rival. He had planted the rose as a diversion, intending to create an air of mystery around the crime. With the evidence and confession in hand, Adrian handed Richard over to the police, ensuring justice would be served. Willowbrook celebrated the detective's triumph, and his reputation as the town's finest sleuth was solidified. The locked-room mystery had been solved, thanks to Adrian Holmes' brilliant mind and unwavering determination. But as the townspeople breathed a sigh of relief, little did they know that more thrilling cases awaited the detective, as he continued to solve mysteries that perplexed others and brought justice to those in need.",{"id":4498,"title":4499,"titles":4500,"content":4501,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-5","Story 5",[4445,4475],"Once upon a time, in the heart of a quaint little town, there lived a brilliant detective named Detective James Henderson. Known for his keen intellect and razor-sharp instincts, Detective Henderson had solved countless crimes, earning him a reputation as the best detective in the region. One sunny morning, Detective Henderson received a perplexing case. The owner of a lavish mansion, Mr. Edward Sinclair, had been found dead inside his locked study. The room was securely bolted from the inside, and the windows showed no signs of forced entry. It appeared to be a classic locked-room mystery. As Detective Henderson arrived at the crime scene, he was greeted by the distraught butler, Mr. Jenkins. Jenkins explained that he had discovered Mr. Sinclair's lifeless body early in the morning when he went to deliver his morning tea. The police had already secured the area, ensuring minimal contamination of evidence. Stepping into the study, Detective Henderson meticulously examined every inch of the room. The walls were adorned with antique paintings, the shelves filled with dusty books, and a grand mahogany desk stood in the center. The detective's eyes focused on the desk, his intuition telling him it held an important clue. Inspecting the desk, Detective Henderson noticed a faint trace of dust disturbed on one corner. His gloved hand carefully lifted a small, ornate key. With palpable excitement, he deduced that this was the key to the locked room. However, it raised more questions than answers. How did the killer escape if the key was still inside? Determining that the key was the key to cracking the case, Detective Henderson began his investigation in earnest. He interviewed the household staff, family members, and friends. Each person had an alibi, leaving no immediate suspects. It seemed that everyone was genuinely shocked by Mr. Sinclair's death. Delving deeper into Mr. Sinclair's personal life, Detective Henderson discovered a web of deceit and betrayal. Hidden behind the facade of a respectable businessman, Sinclair had been involved in illegal dealings with dangerous criminals. It was possible that one of his illicit associates had come to collect a debt, resulting in his untimely demise. As the investigation progressed, Detective Henderson's intuition led him to a previously unnoticed detail. The bookshelf in Mr. Sinclair's study was slightly askew. Pulling it aside, he discovered a hidden doorway that led to a secret chamber. Inside, he found stacks of incriminating documents, implicating Sinclair in a complex web of corruption. Armed with this newfound knowledge, Detective Henderson assembled all the suspects together—the staff, family, and friends. With a dramatic flair, he unveiled the truth, exposing Mr. Sinclair's double life and revealing the killer's identity. It was none other than Mr. Jenkins, the loyal butler. He had been blackmailed by Sinclair and decided to take matters into his own hands. Jenkins had used an elaborate contraption to lock the study door behind him, fooling everyone into thinking it was an unsolvable crime. In the end, justice was served, and the truth prevailed. Detective Henderson's brilliance had solved yet another perplexing case, putting the small town at ease once again. His reputation as the finest detective in the region was cemented further, and he continued to be a symbol of justice and order in the community. And so, the locked-room mystery came to a thrilling conclusion, leaving behind a tale that would be whispered for generations to come. Detective James Henderson's name would forever be associated with the triumph of logic over deception, and his legacy as a master detective would live on forever.",{"id":4503,"title":4504,"titles":4505,"content":4506,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-6","Story 6",[4445,4475],"Once upon a time, in the small town of Riverton, there was an old mansion that had a reputation for being haunted. Legend has it that anyone who dared to spend the night in the mansion would never return. This haunted mansion became the talk of the town and intrigued Detective Jack Thompson. Detective Thompson was known for his sharp intellect and his ability to solve even the most perplexing cases. When he heard about the haunted mansion, he saw it as an opportunity to put his skills to the test. Determined to debunk the ghostly rumors, he decided to spend the night in the mansion and solve the mystery once and for all. As the sun set, Detective Thompson entered the mansion, carrying his trusted magnifying glass and notebook. The mansion was as eerie as the stories suggested, with creaking floorboards and shadows dancing on the walls. Undeterred, Detective Thompson began his investigation. He meticulously examined every room, paying close attention to the details. He noticed footprints leading to a hidden door on the second floor. With cautious steps, he opened the door and discovered a secret staircase leading to the attic. In the attic, he found a dusty old chest, locked tight with a mysterious key. Curiosity piqued, Detective Thompson searched the mansion for the key. After hours of searching, he stumbled upon a hidden compartment in a bookshelf that contained a small silver key. With the key in his possession, he returned to the attic and unlocked the chest. To his surprise, the chest contained a journal filled with cryptic entries and a map leading to a hidden treasure. As Detective Thompson delved deeper into the journal, he discovered that the mansion held a dark secret. It was rumored that a valuable diamond had been stolen from a nearby museum years ago and hidden within the walls of the mansion. With the mystery unfolding before him, Detective Thompson knew his task was not just to solve the locked-room mystery but also to recover the stolen diamond. He meticulously followed the map and found a hidden passage that led to a secret room behind a false wall. In the room, he discovered a safe with a combination lock. He scoured the journal for clues and, using his deductive reasoning, cracked the code. With bated breath, he opened the safe and found the stolen diamond resting on a velvet cushion. With the case solved and the stolen diamond recovered, Detective Thompson emerged from the haunted mansion triumphant. The townspeople were astounded, for not only had he proven that the mansion was not haunted, he had solved a decades-old crime. News of Detective Thompson's success spread like wildfire, earning him the admiration and respect of his colleagues. From that day forward, the haunted mansion of Riverton became a reminder of Detective Thompson's brilliance and the power of his investigative skills. And so, Detective Thompson's legacy lived on, inspiring future generations of detectives to unravel mysteries and uncover the truth, no matter how locked away it might seem. The haunted mansion of Riverton became a symbol of courage and determination, rather than a place of fear and darkness.",{"id":4508,"title":4509,"titles":4510,"content":4511,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-7","Story 7",[4445,4475],"Once upon a time in the quaint town of Riverton, Detective William Hart found himself facing his most perplexing case yet. The mysterious death of wealthy businessman, Richard Lockwood, had everyone baffled. The circumstances were peculiar, to say the least. Mr. Lockwood was found dead in his study, which was securely locked from the inside. There were no signs of forced entry, no windows were open, and the room seemed completely undisturbed. Detective Hart arrived at the estate promptly, determined to unravel this impossible locked-room mystery. He surveyed the scene meticulously, taking note of every minute detail. The room was elegant, but eerily quiet. The wooden bookshelves were filled with leather-bound volumes, and a grand mahogany desk stood against one wall. In the center of the room, there was a comfortable armchair in which Mr. Lockwood was found lifeless. The detective carefully examined the body, looking for any signs of foul play. He discovered a small puncture wound on Mr. Lockwood's wrist. It seemed insignificant, but Detective Hart knew better than to ignore even the smallest detail. He collected samples and sent them to the lab for analysis. As the investigation progressed, the detective interviewed the household staff and Mr. Lockwood's family members. Each had an alibi and no apparent motive for wanting the successful businessman dead. Their statements merely added to the mystery surrounding the case. Days turned into weeks, and Detective Hart's frustration grew. He couldn't shake the feeling that there was something crucial he was missing. Determined not to give up, he poured over the evidence again and again. Then, an idea struck him like a lightning bolt. Returning to the estate, Detective Hart focused his attention on the locked study door. Carefully examining the intricate lock, he noticed something peculiar. There was a tiny scratch near the keyhole, as if someone had tampered with it. Intrigued, he called upon the locksmith who had installed the lock to assist him. The locksmith explained that it was possible to pick that particular lock, but the process required extensive knowledge and skill. Detective Hart realized that the killer must have had both. Someone within the estate had the ability to enter the locked study unnoticed. With this newfound insight, the detective summoned all the suspects to the study. One by one, he interrogated them, digging deeper into their backgrounds and trying to uncover the truth. It was a battle of wits as he relentlessly weaved his way through their alibis and stories. Finally, after hours of intense questioning, Detective Hart caught a break. The housekeeper, Ms. Simmons, inadvertently slipped up when confronted with the scratch near the keyhole. Her face flushed with guilt as she confessed to the crime. She admitted to having a secret relationship with Mr. Lockwood and became overwhelmed with jealousy when she discovered his plans to marry another woman. Ms. Simmons had used her expertise as a former locksmith's apprentice to pick the lock, committing the perfect crime. She injected a poisonous substance into Mr. Lockwood's wrist when he was engrossed in his work, ensuring a quick and painless death. With the case finally solved, Detective Hart apprehended Ms. Simmons, who was quickly brought to justice. The town of Riverton breathed a collective sigh of relief, grateful to have such a skilled detective in their midst. And so, Detective William Hart's name became synonymous with unwavering determination and exceptional brilliance. His success in unraveling the locked-room mystery cemented his reputation as one of the greatest detectives of his time. From that day forward, he continued to solve even the most challenging cases, captivating the town with his remarkable skills and uncanny ability to see what others couldn't.",{"id":4513,"title":4514,"titles":4515,"content":4516,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-8","Story 8",[4445,4475],"Once upon a time, in the small town of Ravenwood, there lived a brilliant detective named John Sinclair. He was renowned for his ability to solve the most perplexing cases, and his sharp mind was always up for a challenge. One fateful evening, a locked-room mystery unfolded that would test his skills like never before. It was a stormy night when the wealthy Mr. Harrison was found dead in his lavish mansion. The room in which he was found had no windows and only one door, which was securely locked from the inside. The circumstances surrounding the death were mysterious, and the distraught family sought out Detective Sinclair to uncover the truth. Upon arriving at the scene, Sinclair carefully examined the room. The walls were adorned with priceless artwork, and the floor was covered in a plush red carpet. A large antique desk stood in the corner, cluttered with papers and a single cup of untouched tea. The air was heavy with a sense of unease. Sinclair questioned each family member and the staff about their whereabouts at the time of the incident. The wife, Mrs. Harrison, claimed to have been at a charity event, as did her daughter, Penelope. The butler, Mr. Jenkins, and the maid, Lily, had both been in the kitchen preparing dinner. As Sinclair delved deeper into the investigation, he discovered that Mr. Harrison had been deeply involved in some shady business dealings. There were rumors of unpaid debts, and Mr. Harrison had been receiving threatening letters demanding money. Could his death be related to these troubling affairs? The detective meticulously examined the room for any hidden passages or secret compartments that could provide an explanation for how someone could have entered or exited without leaving a trace. He checked every nook and cranny, but nothing seemed out of place. Sinclair then focused his attention on the windowless door. He studied the keyhole, searching for signs of tampering or forced entry. But the lock appeared to be untouched, and there were no traces of fingerprints on the doorknob. Feeling stumped, Sinclair decided to dig deeper into Mr. Harrison's personal life. He visited the study where the late Mr. Harrison conducted his business affairs and meticulously searched through the papers on the desk. Amidst the financial records and contracts, Sinclair found a handwritten letter that intrigued him. The letter was addressed to Mr. Harrison from an anonymous sender. It contained cryptic messages hinting at the secrets Mr. Harrison held and warned him of dire consequences if he didn't comply with their demands. Could this be the key to unraveling the locked-room mystery? Sinclair summoned all the suspects to the study and confronted them with the letter. As he observed their reactions, he noticed a flicker of guilt in Penelope's eyes. In a moment of truth, Penelope confessed that she had discovered her father's illicit activities and intended to expose him. She revealed that she had obtained a duplicate key to the room and had confronted her father about his wrongdoings that stormy night. Their argument grew heated, and in a fit of rage, Penelope pushed her father, causing him to stumble and hit his head on the corner of the desk, resulting in his tragic demise. The locked-room mystery was finally solved, and justice was served. Penelope, overwhelmed with remorse, vowed to make amends for her actions and seek redemption. Detective Sinclair, though saddened by the outcome, couldn't help but admire the strength of his intuition and the power of the truth. As the storm clouds cleared and the town of Ravenwood returned to peace, the legend of Detective Sinclair grew even stronger. His name would forever be associated with the solving of the locked-room mystery, a testament to his brilliant mind and unwavering dedication to justice.",{"id":4518,"title":4519,"titles":4520,"content":4521,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-9","Story 9",[4445,4475],"Detective Solving a Locked-Room Mystery Once upon a time in the sleepy town of Drexville, there lived a renowned detective named Samuel Holmes. Known for his extraordinary deductive skills, Holmes was called upon to solve the most puzzling cases. One day, a peculiar challenge came knocking on his door. He received a mysterious letter that detailed a locked-room mystery in an old mansion on the outskirts of town. Curiosity piqued, Holmes journeyed to the mansion where the puzzling events had taken place. The mansion, once grand and beautiful, had fallen into disrepair over the years. As he stepped into the gloomy interior, Holmes felt a shiver run down his spine. The mansion belonged to a wealthy businessman named Gregory Allister. Allister, a recluse, had recently passed away under mysterious circumstances. The letter explained that Allister's death was a locked-room mystery - a situation where a person is found dead in a room which is securely locked from the inside with no plausible means of entry or exit. Holmes began his investigation by inspecting the crime scene - Allister's bedroom. The door was indeed locked from the inside, with no signs of tampering. The windows were firmly shut, and there were no secret passages or hidden doors to be found. The room was devoid of any weapons or evidence of foul play. It seemed like an impossible puzzle. Undeterred, Holmes turned his attention to Allister's personal life. He interviewed the staff and discovered that the mansion was full of secrets. Allister had a contentious relationship with his estranged wife, Evelyn, who had moved out years ago. There were rumors of a hidden treasure in the mansion, which had been a subject of heated disputes between Allister and his business partners. As Holmes delved deeper into the investigation, he uncovered a web of deceit and betrayal that surrounded Allister's life. He discovered that Allister had formed powerful enemies due to his shady business dealings and had recently received anonymous threats. Holmes also learned about a hidden room in the mansion's basement. Inside, he found a secret laboratory filled with scientific equipment and mysterious experiments. This room provided insight into Allister's secretive nature and the possibility of a scientific breakthrough. With all the pieces of the puzzle slowly coming together, Holmes devised a plan to crack the locked-room mystery. He carefully reconstructed the events leading up to Allister's death and realized that it was not a simple suicide as initially suspected. Holmes gathered all the suspects - Evelyn, the business partners, and the mansion staff - in the grand dining hall. He walked them through his process of deduction, revealing their secrets one by one. As he presented the final piece of evidence, the culprit's face turned pale, and a confession spilled out. It turned out that Allister's death was meticulously planned by his business partner, Edward. Edward was desperate to gain control over the hidden treasure and had used his knowledge of Allister's scientific experiments to create a device that allowed him to enter and exit the locked room without a trace. With the mystery solved and the culprit apprehended, Holmes left the mansion feeling a sense of accomplishment. Another locked-room mystery unraveled by his keen intellect. As he walked away, he couldn't help but wonder what new mysteries awaited him in the future. And so, the legend of Samuel Holmes continued to grow, capturing the imagination of all who heard his name, and cementing his reputation as the greatest detective of all time.",{"id":4523,"title":4524,"titles":4525,"content":4526,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-10","Story 10",[4445,4475],"Once upon a time in the quiet town of Maplewood, renowned detective James Blackwood found himself faced with the most perplexing case of his career - a locked-room mystery. The scene was set at the grand estate of Mr. Brennan, a wealthy businessman known for his extravagant parties. It was a foggy autumn evening when Mr. Brennan's lifeless body was discovered in his study. The doors and windows were tightly sealed, and there was no sign of forced entry. The room itself was in perfect order, no scuffle or struggle apparent. It seemed impossible for anyone to have entered or left without leaving a trace. Detective Blackwood arrived at the scene, his sharp eyes immediately focused on unraveling the mysterious puzzle before him. He meticulously examined every inch of the study, taking note of every detail, trying to determine what secrets lay within those four walls. As he dug deeper into the case, Detective Blackwood discovered that Mr. Brennan had been involved in shady business dealings and had made numerous enemies over the years. Fingers pointed towards rival businessmen, jealous ex-lovers, and even disgruntled employees. The list of suspects grew longer with each passing hour. With the aid of his trusted partner, Detective Sophia Bennett, Blackwood conducted thorough interviews with the potential suspects. He skillfully extracted information, hoping to uncover a motive that could lead to the killer. Alibis were examined, timelines meticulously scrutinized, and contradictions ruthlessly exposed. As the investigation progressed, a faint trail of evidence began to emerge. Blackwood discovered a hidden compartment in the desk, containing confidential business documents and a locked safe. The safe itself seemed impenetrable, with no visible signs of tampering. Determined not to be defeated by its apparent invincibility, Blackwood tirelessly worked on deciphering the combination. Days turned into weeks, and the tension in the town grew palpable. People whispered about the mysterious case, wondering who could have committed such a daring crime. Meanwhile, Blackwood dug deeper into the lives of the suspects, searching for any connection that could break the case wide open. Finally, late one night, a breakthrough came. Blackwood discovered a forgotten piece of evidence, a small key found hidden beneath Mr. Brennan's favorite armchair. With a surge of excitement, he rushed back to the estate, anticipation fueling his every step. The key fit perfectly into the previously impenetrable safe. Inside, Blackwood found a collection of incriminating documents, providing a clear motive for murder. With the evidence in hand, he summoned all the suspects to the estate, gathering them in the very room where the crime had taken place. With measured confidence, Detective Blackwood revealed the killer's identity and method. He exposed their lies and deceit, painting a vivid picture of the events that had unfolded on that fateful night. The shocked expression on the culprit's face was a testament to Blackwood's unparalleled deductive skills. And so, the locked-room mystery was solved. The town of Maplewood breathed a collective sigh of relief as justice was served. Detective James Blackwood emerged as a hero, forever etched in the annals of the town's history. But for Blackwood, it was just another triumph in a long line of cases. With his undying dedication and brilliant mind, he vowed to continue solving mysteries and bringing justice to those in need. After all, the world can never have too many detectives, especially ones like James Blackwood - relentless in their pursuit of truth.",{"id":4528,"title":4529,"titles":4530,"content":4531,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-11","Story 11",[4445,4475],"Once upon a time in the quaint town of Ravenwood, Detective Michael Thompson found himself faced with his toughest challenge yet—a locked-room mystery. The scene was set at the luxurious Ravenwood Manor, a grand mansion known for its opulent parties and mysterious secrets. It was a dark and stormy night when Thompson received a distress call from the manor's owner, Mr. Jonathan Blackwood. When the detective arrived, he was met with a peculiar sight. The door to the study was locked from the inside, and inside the room lay the lifeless body of Mr. Blackwood himself. With his analytical mind spinning, Detective Thompson immediately set to work. He carefully examined the door for signs of forced entry but found none. The windows were securely bolted shut, eliminating any possibility of an intruder gaining access that way. Turning his attention to the room itself, Thompson observed the disarray—a clear sign of struggle. Papers were strewn across the desk, and furniture lay overturned. The air was thick with tension as the detective surveyed the scene, his mind racing to piece together the puzzle. Thompson began his investigation by interviewing the mansion's staff, who appeared visibly distraught. The butler, Mr. Alexander, claimed he had been in the kitchen, preparing dinner, when the incident occurred. The maid, Miss Elizabeth, was upstairs attending to her duties and claimed she hadn't heard a thing. Next, the detective examined the victim more closely. Blackwood lay on the floor, a single gunshot wound to his chest. The gun, a family heirloom, was found next to him, but it had clearly not been fired recently. Thompson knew he had to search for another possible murder weapon. As he combed through the room, the swift-thinking detective stumbled upon a hidden compartment in the bookshelf. Inside, he discovered a small vial containing a deadly poison. Could this have been the real cause of death? Thompson turned his attention back to the manor's inhabitants and questioned them more intently. The deceased's wife, Mrs. Isabella Blackwood, appeared to be the prime suspect. Though she claimed to be in her bedroom at the time,  her alibi was weak. She had been locked in a bitter dispute with her husband over their wealth and divorce settlement. But Detective Thompson knew better than to jump to conclusions. He delved deeper into the case, meticulously cross-referencing evidence and eliminating possible suspects one by one. He had a gut feeling that there was more to the story, something hidden beneath the surface. Days turned into weeks as Thompson tirelessly pursued his investigation. He uncovered a web of secrets and deceit, stretching back years. As he pieced together the puzzle, he realized that the mystery was not as straightforward as it seemed. Eventually, the detective uncovered a hidden passage in the manor that led to a hidden room—one that only Mr. Blackwood had known about. Inside, Thompson discovered a secret collection of rare and valuable artifacts, painstakingly acquired by the deceased over the years. It was a motive for murder that had been concealed beneath the surface, and only Detective Thompson had managed to unearth it. With the evidence gathered, Thompson confronted the true culprit—a greedy business associate of Blackwood's who had been desperate to get his hands on the priceless collection. The associate had planned the perfect crime—a locked-room mystery that would divert suspicion from himself. In a dramatic showdown, the truth was finally revealed, and justice was served. The locked-room mystery that had baffled everyone was unraveled by the brilliant mind of Detective Michael Thompson. And so, Ravenwood Manor could finally rest in peace, free from the dark secrets that had haunted its halls. Detective Thompson's reputation grew even greater, and he continued to solve the town's most perplexing cases, always with an unrivaled determination and a sharp intellect. But deep down, he knew that the locked-room mystery of Ravenwood Manor would forever hold a special place in his heart—an intricate puzzle that had challenged him to the very core and emerged as his greatest triumph.",{"id":4533,"title":4534,"titles":4535,"content":4536,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-12","Story 12",[4445,4475],"Once upon a time in the bustling city of Bellville, there lived a renowned detective named Detective James Anderson. Known for his sharp intellect and exceptional problem-solving skills, Detective Anderson had earned a reputation for uncovering the truth behind even the most perplexing cases. However, there was one mystery that had eluded him for years - the infamous locked-room mystery. One fateful morning, Detective Anderson received a phone call from the Bellville Police Department. They informed him about a bizarre case that had just occurred - a wealthy businessman named Mr. Edward Hargrove had been found dead inside his locked study. The room had been sealed from the inside, leaving no apparent means of escape or entry for anyone else. Intrigued by the challenge, Detective Anderson quickly arrived at the Hargrove mansion. He was greeted by a distraught Mrs. Hargrove, who explained that she had discovered her husband's lifeless body when she went to bring him his morning coffee. She swore that she hadn't left the mansion since the previous evening, leaving no possible suspects. Undeterred by the lack of leads, Detective Anderson meticulously examined the crime scene. The room was filled with shelves of books, an ornate desk, and a large fireplace. He carefully inspected every inch, searching for any hidden passages or clues that might explain the impossible circumstances. As he scrutinized the desk, Detective Anderson noticed a faint imprint on a notepad - it appeared to be a partial note that had been forcibly ripped off. Using his skills, he managed to recreate the note, which read, \"The secret lies within the embers.\" Puzzled yet determined, Detective Anderson turned his attention to the fireplace. He carefully removed the logs and raked through the ashes, finding a small key hidden amongst the charred remains. It didn't take long for him to realize that this key might hold the key to solving the case. With the key in hand, Detective Anderson retraced his steps to the study door. He noticed a tiny keyhole near the doorknob which had gone unnoticed before. Curiosity guiding his every move, he inserted the key and turned it. To his astonishment, the bookshelf lining the study wall swung open, revealing a hidden passageway. It seemed that Mr. Hargrove had constructed a secret escape route in case of emergencies. As Detective Anderson explored further, he found a hidden room containing a secret safe. The safe, protected by a complex combination, held documents detailing Mr. Hargrove's involvement in illegal activities. It became clear that his death was not an accident but a meticulously planned murder intended to silence him. Detective Anderson immediately deduced that Mrs. Hargrove could not have been responsible for her husband's death, as she was unaware of the hidden room and secret safe. He instinctively understood that the murderer was someone who knew the secret of the embers and was aware of the hidden escape. Through careful investigation and interviews, Detective Anderson discovered that Mr. Hargrove had been involved in a criminal organization. His untimely demise must have been orchestrated by someone within the organization, desperate to protect their secrets. After days of tireless work, Detective Anderson successfully gathered enough evidence to bring the guilty party to justice. The cunning mastermind behind the locked-room mystery was none other than Mr. Hargrove's business partner, who had orchestrated the elaborate plan to take control of the criminal empire. With the mystery solved and justice served, Detective Anderson regained his reputation as the city's finest detective. The locked-room mystery became one of his most celebrated cases, showcasing his remarkable deduction skills and unwavering determination. From that day forward, the city of Bellville knew that no enigma, no matter how complex, could escape the brilliant mind of Detective James Anderson.",{"id":4538,"title":4539,"titles":4540,"content":4541,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-13","Story 13",[4445,4475],"In the dimly lit room, Detective James Anderson stood, his gaze fixed upon the lifeless body lying on the floor. The victim, a well-known art collector named Marcus Donovan, had met his untimely demise inside his heavily fortified mansion. It was a classic locked-room mystery, and it was up to Detective Anderson to unravel the truth behind this baffling crime. The room itself was a testament to Donovan's paranoia. Steel bars adorned the windows, and the thick, oak door was reinforced with multiple deadbolts. Anderson examined the room meticulously, searching for any clue that could break the enigma. His experienced eyes scanned for any signs of forced entry or secret passages. But there was none. It seemed as though the room had sealed itself, trapping Marcus Donovan's killer within. The detective's attention then turned to the body. Donovan lay on the Persian rug, a look of shock frozen on his face. Anderson noted that there were no visible signs of struggle or injury, suggesting that the cause of death might have been something more sinister. He carefully examined the body, sending samples for analysis. While waiting for the lab results, Detective Anderson turned his attention to Donovan's personal life. Marcus Donovan was known for his vast art collection, and his wealth had made him the target of envy and greed. He had numerous enemies in the art world, people who would stop at nothing to obtain his valuable treasures. The detective started to compile a list of potential suspects, reaching out to each one for questioning. Days turned into nights as the investigation progressed, but the locked-room mystery remained unsolved. Anderson delved into the minutiae of Donovan's life, uncovering secrets and hidden motives. He meticulously interviewed every individual connected to Marcus, piecing together a complex web of relationships and betrayals. Yet, the truth seemed elusive. In a moment of frustration, the detective decided to revisit the crime scene. He meticulously examined every nook and cranny of the room, his mind racing for any missed detail. And then, like a lightning bolt, inspiration struck. Anderson noticed a tiny smudge on the window sill. He quickly collected samples from the smudge and rushed them to the lab. The results were astonishing. The smudge was a chemical compound used to dissolve metal. Detective Anderson realized that the killer had used it to weaken the steel bars on the windows, allowing them to escape without a trace. It was a carefully planned murder, executed with precision. With the breakthrough evidence in hand, Anderson summoned all the suspects to a grand reveal. The tension in the room was palpable as he laid out the details of the crime. One by one, their faces turned pale, revealing their guilt. Finally, the true killer emerged from the shadows, unable to bear the weight of their deceit any longer. In the end, justice prevailed, and the locked-room mystery was unraveled. Detective James Anderson's meticulous detective work had exposed the truth, ensuring that Marcus Donovan's killer would face the consequences of their actions. As he left the mansion, Anderson couldn't help but marvel at the power of deduction and the relentless pursuit of justice. Another case solved, another locked-room mystery unlocked. Detective Anderson knew that while the world was filled with darkness, there would always be light shining through - a light called truth. And it was with this conviction that he ventured into the unknown, ready to face any challenge that crossed his path, armed with his sharp mind and unwavering determination.",{"id":4543,"title":4544,"titles":4545,"content":4546,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-14","Story 14",[4445,4475],"In the quiet town of Puzzleville, Detective Jack Hartley was known for his sharp wit and unparalleled detective skills. His reputation for solving the most complex cases had earned him the title of \"The Puzzle Master.\" And now, he was faced with his greatest challenge yet - a locked-room mystery that had everyone baffled. It all began on a dark and stormy night, when the mayor's daughter, Lily, was found dead in the mansion's study. The room was locked from the inside, with no signs of forced entry or exit. The mystery gripped the town, as rumors of foul play filled the air. Detective Hartley arrived at the crime scene, wearing his signature trench coat and fedora. The room was a puzzle in itself, filled with countless books, antique furniture, and a grand fireplace. As he examined the room, his keen eyes noticed a small clue - a broken vase on the floor, shards scattered around. Hartley questioned the mansion staff, searching for any leads. The housekeeper nervously mentioned hearing a loud noise from the study before the incident. Suspicions heightened as Hartley discovered that Lily had recently inherited a significant fortune, making her the target of envy and greed. Intrigued by the broken vase, Hartley delved deeper into its significance. He discovered that it had been a priceless artifact, stolen from a renowned museum years ago. Could this be the motive for Lily's murder? Digging through the family history, Hartley uncovered a long-held secret. Lily's grandfather, a notorious art thief, had hidden his stolen loot within the mansion walls. The stolen vase was part of his collection. It seemed that the locked-room mystery was connected to the past, and someone was willing to kill to keep their secret hidden. Hartley focused his investigation on the mansion's inhabitants. Each had a motive and an alibi, but the detective knew that appearances could be deceiving. He meticulously gathered evidence, interviewed suspects, and studied the layout of the room. Days turned into weeks, and the case seemed unsolvable. But Detective Hartley refused to give up. Late one evening, as he retraced his steps through the mansion, a sudden realization struck him like lightning. It was the missing piece of the puzzle he had been searching for. Returning to the study, Hartley examined the walls carefully. His fingers traced the seams between the wallpaper, feeling for any irregularities. And there it was - a hidden door cleverly concealed behind an intricately designed bookcase. As Hartley stepped into the hidden room, he found himself surrounded by Lily's grandfather's stolen treasures. But even more importantly, he discovered crucial evidence that would finally unlock the mystery. With all the pieces in place, Detective Hartley called for a meeting with the suspects, laying out his findings methodically. Suspense filled the air as he revealed the true identity of the killer - Lily's cousin, Edward. Driven by jealousy and greed, Edward had murdered Lily to take control of the hidden treasure. As the handcuffs were placed around Edward's wrists, the town of Puzzleville breathed a collective sigh of relief. The Puzzle Master had done it again, solving the seemingly impossible locked-room mystery that had left everyone perplexed. With the case closed, Detective Hartley returned to his office, ready to tackle new challenges. His reputation as the master of puzzles grew even stronger, and Puzzleville knew that they could always rely on him to unravel the most perplexing mysteries.",{"id":4548,"title":4549,"titles":4550,"content":4551,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-15","Story 15",[4445,4475],"Once upon a time in the peaceful town of Riverdale, there was a renowned detective named Detective James Anderson. Known for his brilliance and sharp instinct, Detective Anderson had solved numerous complex cases throughout his career. However, he had never encountered a mystery as perplexing as the locked-room case that awaited him. It was a gloomy evening when a phone call shattered the silence of Detective Anderson's office. The caller, a distressed lady named Mrs. Carter, explained that a murder had taken place in her mansion. Detective Anderson wasted no time and rushed to the scene. Upon reaching the Carter mansion, Detective Anderson found himself standing outside a grand room. He examined the door closely; it was locked from the inside, without even a keyhole. The detective puzzled over how the killer could have entered and exited without leaving any trace. As he entered the room, a scene of mystery unfolded before his eyes. The room was lavishly decorated with antique furniture, and the victim, Mr. George Carter, lay lifeless on the floor. The cause of death was not immediately evident, as there were no visible wounds or signs of struggle. Detective Anderson knew he had a challenging investigation ahead of him. The detective began by questioning the occupants of the mansion. Mr. Carter's wife, Mrs. Carter, was distraught, claiming she had been in the garden when the incident occurred. The household staff - the butler, the maid, and the gardener - all provided alibis that seemed airtight. There appeared to be no immediate suspects. Detective Anderson meticulously searched the room for clues. He found a scrap of torn fabric behind a bookshelf, which did not match any of the furniture in the room. Additionally, he discovered a hidden compartment in the wall containing a notepad with cryptic notes. The detective painstakingly deciphered the code, revealing a list of names with amounts of money assigned to each. Each name was followed by the word \"debt.\" As the investigation progressed, Detective Anderson's suspicions began to focus on the deceased himself. He delved into Mr. Carter's financial records and discovered that he had been involved in illegal gambling and owed considerable sums of money to multiple individuals. This revealed a possible motive for his murder. Bringing the suspects together, Detective Anderson shared his findings. He revealed that the locked-room murder was an elaborate plan to deceive the authorities. The killer had entered the room before the murder and hidden behind the bookshelf, carefully observing Mr. Carter. When the opportune moment arose, the killer emerged, incapacitated Mr. Carter without leaving any physical evidence, and escaped undetected. The detective used the torn fabric to identify the killer's clothing and linked it to the debt collectors mentioned in the cryptic notes. It turned out that one of them had been posing as a member of the household staff, deceiving everyone with a carefully crafted alibi. With the truth exposed, the killer confessed to their crime. It was a tale of revenge, deceit, and hidden identities. The locked-room mystery had been unraveled, thanks to the brilliant deductions and unwavering determination of Detective James Anderson. As Detective Anderson left the Carter mansion, the sun began to break through the clouds, casting light on the once-shrouded room. The residents of Riverdale breathed a collective sigh of relief, knowing that their beloved detective had restored peace and justice to their town once again.",{"id":4553,"title":4554,"titles":4555,"content":4556,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-16","Story 16",[4445,4475],"Detective James Anderson was no stranger to solving complex cases, but the locked-room mystery that awaited him today proved to be one of the most perplexing he had encountered in his career. It all began when he received a call from the local police department. A renowned scientist, Dr. Benjamin White, had been found dead in his study, with no sign of forced entry. The room had been locked from the inside, and the only window was shut tight. The scene was baffling, as there seemed to be no plausible explanation for how anyone could have entered or exited the room. Upon arrival at the crime scene, Detective Anderson meticulously examined every inch of the study. The shelves were lined with books on various scientific subjects, the desk cluttered with papers and equipment, and a chalkboard filled with complex formulas and equations. But nothing seemed out of the ordinary – no hidden passages or secret compartments. As he interviewed the staff and family members, Detective Anderson learned that Dr. White had been working on a groundbreaking scientific project. He had made enemies in the scientific community who would stop at nothing to discredit his work. Could one of them be responsible for his untimely demise? With no clear leads, Detective Anderson decided to delve deeper into Dr. White's research. He spent countless hours studying his work, trying to find any clues that might lead him to the truth. The more he dug, the more he realized the significance of Dr. White's discoveries – a breakthrough that could revolutionize the way we understand the universe. Meanwhile, the detective's intuition caught a glimpse of something peculiar. He had a hunch that the key to solving the locked-room mystery lay in a detail that had been overlooked. Returning to the crime scene, he closely examined the window. It was an old-fashioned casement window, painted shut. But as he ran his fingers along the frame, he felt a slight irregularity, barely noticeable to the naked eye. Utilizing his skills in forensics, Detective Anderson carefully lifted the paint on the frame. Beneath it, he found a tiny pinhole – a meticulously drilled hole that would allow someone outside the room to manipulate the latch. It seemed that the window had been opened from the outside before being closed again. With this crucial breakthrough, Detective Anderson's investigation took a new turn. He began to suspect that the culprit had expert knowledge of the room's layout and had planned the murder meticulously. But who could it be? As the detective narrowed down his list of suspects, he discovered that one of Dr. White's colleagues, Professor Ethan Lawson, had been seen near the study that fateful night. A brilliant mind himself, Professor Lawson had always been envious of Dr. White's success. Could he have taken his envy to such extremes? The pieces of the puzzle started falling into place. Detective Anderson learned that Professor Lawson had been conducting secret experiments of his own, using Dr. White's research as a foundation. He had been working on a similar project but had failed to replicate Dr. White's results. Fueled by jealousy and the desire to prove himself, he saw an opportunity to eliminate his rival and take credit for his groundbreaking discoveries. Armed with this newfound knowledge, Detective Anderson confronted Professor Lawson with the evidence. Cornered, the professor admitted to the crime, revealing how he had carefully planned and executed the murder to make it appear as a locked-room mystery. Justice was served, and the scientific community mourned the loss of Dr. White, but celebrated his groundbreaking contributions. Detective Anderson's meticulous investigation had not only solved the locked-room mystery, but it had also ensured that the truth prevailed over envy and deceit. As the case concluded, Detective Anderson reflected on the complexity of his profession. In the world of crime-solving, no mystery was truly unsolvable. With a keen eye for detail and unwavering determination, even the most baffling cases could be unraveled, bringing justice to those who deserved it. And so, he continued his journey as a detective, ready to face whatever challenge lay ahead.",{"id":4558,"title":4559,"titles":4560,"content":4561,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-17","Story 17",[4445,4475],"In the heart of the bustling city, there stood an old, grand mansion. The mansion had a reputation of being haunted, with whispers of eerie occurrences echoing through its halls. Many believed that it was cursed, its rooms hiding unsolved mysteries for years. One such mystery baffled both the locals and the authorities - the case of the locked-room murder. It all began on a dark and stormy night when a prominent businessman, Mr. Jonathan Blackwood, was found dead in one of the mansion's rooms. The door to the room was locked from the inside, and there were no signs of forced entry. It seemed impossible - how could someone be murdered in a locked room? Detective Michael Andersson, well-known for his sharp mind and unwavering determination, was assigned to the case. As he entered the mansion, the creaking of the wooden floor beneath him echoed through the silence. The detective knew he had a challenging task ahead. He started his investigation by interviewing the mansion's inhabitants. Each person had an alibi, claiming to have been in a different part of the house when the murder occurred. The suspects included Mr. Blackwood's business partner, Mr. Edward Stone, a jealous rival, Ms. Victoria Parker, and the loyal butler, Mr. Arthur Collins. Determined to unravel the truth, Detective Andersson meticulously examined the crime scene. The room itself was a spectacle of opulence, adorned with antique furniture and paintings. The only window was bolted shut, and the fireplace remained untouched, ruling out any possibilities of escape or hiding evidence. As he scrutinized every inch of the room, the detective's keen eyes fell upon a small, silver key tucked away in the corner. It appeared to be out of place amongst the elegance of the surroundings. With a sense of intrigue, he pocketed the key, convinced that it held some significance in solving the mysterious murder. Days turned into weeks, and the detective tirelessly pursued every lead. He meticulously analyzed the testimonies, searching for inconsistencies and subtle clues that could unravel the locked-room mystery. The wide range of emotions displayed by the suspects, their motives, and their connections to the victim were all meticulously examined. Finally, a breakthrough came when Detective Andersson discovered a hidden passage beneath the mansion. It led to a secret room filled with diaries and letters, revealing a network of deceit and betrayal. The investigation took an unexpected turn as it unraveled a web of blackmail and revenge. As the detective confronted each suspect with the evidence he had gathered, their carefully constructed facades slowly crumbled. The truth came tumbling out, like pieces of a puzzle fitting together. The silver key he had found turned out to be the one that locked the room from the inside, connecting the crime scene to the suspects. In a dramatic confrontation, the truth behind the locked-room murder was finally revealed. The guilty party turned out to be Ms. Victoria Parker, motivated by a desire to eliminate her competition and claim Mr. Blackwood's business empire for herself. She had meticulously planned the crime, manipulating events to make it seem like an impossible locked-room mystery. With her motive exposed and the evidence against her undeniable, Ms. Parker was apprehended, ending her reign of deception. The haunted grand mansion finally found peace, as the secrets within its walls were laid bare. Detective Andersson emerged as the hero who had unraveled the enigma of the locked-room murder. His perseverance, attention to detail, and sharp instincts had proved invaluable in solving the case. The city hailed him as a legend, and the mansion gained a new reputation - a place where justice prevailed over dark secrets. And so, the detective's tale of the locked-room murder became a legend, whispered in the corridors of law enforcement for years to come. It served as a reminder that even in the most perplexing cases, the truth could be found if one had the determination to search for it.",{"id":4563,"title":4564,"titles":4565,"content":4566,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-18","Story 18",[4445,4475],"There once was a famous detective named Detective Smith. He was known for his brilliant mind and his ability to solve the most complex of cases. One day, he received a call from the local police department about a locked-room mystery. Intrigued, Detective Smith rushed to the scene. Upon arrival, he found himself standing outside a grand mansion. The mansion belonged to Mr. Jonathan Hartley, a wealthy businessman. As Detective Smith entered the mansion, he was greeted by a large crowd of police officers and curious onlookers. The room where the mystery took place was the study. Inside the study, Detective Smith saw a lifeless body lying on the floor. It was Mr. Hartley himself. The door to the study was locked from the inside, and there were no signs of forced entry. The windows were all securely locked as well. The only key to the study was found in Mr. Hartley's pocket. Detective Smith began his investigation by examining the crime scene. He noticed a faint smell of bitter almonds, which he recognized as the scent of cyanide. He deduced that Mr. Hartley had been poisoned. The investigation had to move swiftly, as cyanide dissipates rapidly. The detective meticulously collected evidence, dusting for fingerprints, examining the room for any hidden compartments or secret passageways, and questioning witnesses. But the more he dug into the case, the more perplexing it became. There seemed to be no plausible explanation as to how the killer entered and exited the locked room. Days turned into weeks, and the mystery continued to baffle Detective Smith. He explored every hypothesis, from an elaborate murder plot to a supernatural occurrence. But each time, he hit a dead end. One evening, while sitting alone in his office, Detective Smith had a brilliant breakthrough. He remembered a book he had once read about illusionists and their mastery of misdirection. With this in mind, he decided to revisit the crime scene. Back at the mansion, Detective Smith examined the bookshelves in the study. To his surprise, he found a hidden lever behind a seemingly ordinary book. Curiosity piqued, he pulled the lever, and a secret door swung open, revealing a hidden passage. The passage led him to a secret room adjacent to the study. In the room, he discovered evidence that Mr. Hartley was involved in illegal activities. It became clear to Detective Smith that the locked-room mystery was a cleverly staged murder to cover up Mr. Hartley's true intentions. With this new revelation, the detective pieced together the events leading up to Mr. Hartley's death. It was an elaborate plan executed by someone close to him who knew about the hidden room and wanted to expose his illicit activities. Armed with this knowledge, Detective Smith gathered all the evidence and called for a meeting with the police and the suspects. He masterfully laid out the case, pointing out the motive, means, and opportunity for each suspect. In a dramatic finale, Detective Smith revealed the identity of the killer and detailed their intricate plan. The killer was arrested, and justice was served. The locked-room mystery had been solved, thanks to the brilliant mind and unwavering determination of Detective Smith. He once again proved why he was considered one of the greatest detectives of his time. As the sun set on the grand mansion, Detective Smith quietly stepped out into the darkness, knowing that another case awaited him, ready to challenge his intellect and push him to the limits of his abilities.",{"id":4568,"title":4569,"titles":4570,"content":4571,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-19","Story 19",[4445,4475],"Once upon a time, in the town of Oakwood, there was a highly skilled detective named Samantha Holmes. She was known for her remarkable ability to solve complex cases, and her reputation as the best detective in town was widely acknowledged. One day, Samantha was called to investigate a peculiar locked-room mystery that had the entire town buzzing with curiosity. The case unfolded in the grand mansion of Mr. Edward Pemberton, a wealthy businessman and art collector. It was a stormy night when a lavish dinner party was being held at his mansion. The guests arrived in their finest attire, eager to enjoy an evening of luxury and indulgence. The atmosphere was electric with laughter and animated conversations flowing freely. As the night progressed, a loud bang echoed throughout the mansion, causing a momentary silence to fall upon the party. When the guests rushed to investigate, they were met with a disturbing sight. The door to the study, where Mr. Pemberton kept his most prized possessions, was locked from the inside, and no one could find a key. Samantha Holmes arrived at the scene, ready to examine the evidence and unravel the mystery. She began by interviewing the guests, each providing their alibis and claiming their innocence. She meticulously examined the door, searching for any signs of tampering. The lock appeared intact, and there were no visible forced entry marks. Undeterred, Samantha delved deeper into the investigation. She scrutinized the room itself, meticulously inspecting every nook and cranny. Her keen eye detected minute details that others might have missed. There, hidden within an ornate vase, she discovered a small key. It seemed to fit the lock perfectly, but there was still one puzzle left to solve – who had the motive to steal from Mr. Pemberton? Samantha reasoned that the culprit must be among the dinner party attendees. She gathered the guests in the grand hall and began her interrogation. Each person was questioned, their personas illuminated under the relentless gaze of Samantha's piercing eyes. She observed their body language, their reactions to her pointed questions, and their attempts to divert suspicion to others. As she stormed through the interrogations, Samantha detected subtle inconsistencies, hidden glimmers of guilt. It was the elegant widow, Mrs. Victoria Ashford, who gave herself away. With her trembling hands and evasive answers, Samantha had found her prime suspect. But what was Mrs. Ashford's motive? Samantha dug into Mrs. Ashford's past, peeling back layers of secrets and lies. She discovered a hidden affair between Mrs. Ashford and Mr. Pemberton. It seemed that jealousy and greed had driven her to steal one of the valuable paintings from the study. Armed with this knowledge, Samantha confronted Mrs. Ashford, who finally confessed to her crime. She had used the key from the vase, replaced it with a duplicate, and cunningly locked herself in the study to divert suspicion. Samantha had cracked the locked-room mystery, solving the case that had baffled everyone else. The news of Samantha's brilliant detective work spread like wildfire through the town of Oakwood. She was hailed as a hero, and her skills as a detective became legendary. From that day forward, no locked-room mystery was too challenging for Samantha Holmes. Her legacy lived on, inspiring future generations of detectives to unlock the secrets hidden behind closed doors. And so, the case of the locked-room mystery was closed, thanks to the unwavering determination and sharp intellect of Detective Samantha Holmes. The town of Oakwood slept a little safer that night, resting in the knowledge that justice had been served, and the truth had prevailed.",{"id":4573,"title":4574,"titles":4575,"content":4576,"level":56},"\u002Ftlt-2023.07.20-self-judging-stories#story-20","Story 20",[4445,4475],"It was a gloomy winter evening when Detective James Thompson received a call about a peculiar case. A renowned novelist, Mr. Victor Grayson, had been found dead in his study, locked from the inside. The room had no windows and the only entrance was through a heavy wooden door. It seemed impossible for anyone to have entered or exited without leaving a trace. With a determined spirit, Detective Thompson set out to unravel the mysteries hidden within the locked-room. As Detective Thompson stepped into the study, he carefully examined his surroundings. The room was filled with bookshelves, stacks of papers, and an antique writing desk at the center. The deceased lay sprawled on the floor, dressed in his finest suit, with a perplexed expression frozen on his face. His manuscript, unfinished, rested next to him. The detective meticulously observed every detail, from the arrangement of books to the desk where the writer spent countless hours. He knew that beneath the surface, there was a labyrinth of clues waiting to be discovered. He meticulously dusted for fingerprints, analyzed footprints, and examined the furniture for any signs of tampering. As he dug deeper into Mr. Grayson's life, Detective Thompson discovered a web of secrets, jealousy, and hidden motives. The victim had been in the midst of a bitter dispute with his publisher, Charles Aldridge, over a novel he believed was unjustly rejected. Could Charles be the killer? Thompson confronted Charles, who vehemently denied any involvement in the murder. But the detective sensed something was amiss. His keen intuition led him to search Charles' office, where he stumbled upon old letters exchanged between the two. It became apparent that Charles had a strong motive to eliminate Mr. Grayson. But Detective Thompson was not one to jump to conclusions. He continued his investigation, speaking with the victim's family, friends, and neighbors. He unraveled a complex web of affairs and betrayed trust. Mr. Grayson's wife, Victoria, had been having an affair with his closest friend, Anthony Davis. Could they have conspired to kill the renowned writer and make it appear as a locked-room mystery? Thompson brought Victoria and Anthony in for questioning separately. With his skilled interrogation techniques, he managed to unravel their secrets. Victoria confessed to killing her husband in a fit of rage, while Anthony admitted to helping her stage the locked-room scenario to protect her. Their love had driven them to desperate measures, but they couldn't escape the detective's scrutiny. With the truth finally revealed, Detective Thompson meticulously gathered the evidence and presented his case to the court. Victoria and Anthony were charged with the murder of Mr. Grayson, and justice was served. As the case came to a close, Detective Thompson reflected on the power of deduction, intuition, and meticulous investigation. The locked-room mystery had been unraveled, proving that even the most perplexing crimes can be solved with a determined mind and careful examination of the facts. And so, another chapter closed in the life of Detective James Thompson, leaving behind a tale of intrigue, deception, and a locked-room mystery that had been meticulously unraveled. html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sTrkL, html code.shiki .sTrkL{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"id":4578,"title":4579,"titles":4580,"content":4581,"level":9},"\u002Ftlt-2023.07.22-the-cult-of-oz","The Cult of Oz",[],"I found a weird self-published book in a street-side Little Library. Here is my review. A robot version of the scarecrow from the wizard of oz, oil painting style. Image by Bing Image Creator. I live in a very nice tree-lined street in Washington, DC. Everything is walking distance from my apartment, and we go with our dog around and around the block, to the store or to get coffee, round and round each day. Part way down before you get to the main road is a “Little Library”. In case you haven’t seen one, these are tiny windowed boxes with doors and two levels of shelves filled with books. The people around here have eclectic taste for sure, and a lot of folks are ex college students who, maybe a few years later, are shedding their ideological trappings by way of book donations. I’ve found all sorts of books – many of the current or recent armchair science or philosophy books bordering on self-help. Atomic Habits. Thinking Fast and Slow. The Catcher in the Rye. Nestled amongst them I found a medium-length novel: The Cult of Oz. The bindings seemed a bit off, so I think it was a limited-run self-publish deal, or maybe a reviewer’s pre-release. Unfortunately the copyright page was torn and missing. The author, one “Icarus Byte”, was clearly a pseudonym. A bit of light googling turned up … initially nothing, later some obscure posts in a digital music creators guild web forum. Weird. On a lark I took it home. Before this I was standing awkwardly on the sidewalk, my leashed chihuahua mutt staring at me, balancing a coffee, trying to google this thing. I sat down in my favorite chair and got distracted by The Internet on my phone, setting the book aside. I didn’t end up finally flipping through it for another 2 weeks when I re-discovered it instead of doing laundry. The story started off a bit rough, the first 5 chapters were vignette snapshots starting to lay out a now-or-near future in which … something … was going on. A news report about anti-technology terrorists running a ransomware attack. A creepy encounter in a NYC alley with some horror-esque whistling of “If I Only Had A Brain”. Weird shit. Finally in chapter 6 the story got started, following a character that reminds me a lot of something from Gibson’s Neuromancer. Cyberpunk style in-over-their-head. We as the audience are just as confused as the main character as they are pulled into a plot bigger than themselves. I think it needed an editor. That was all fine and I was into it, but what was weird were the references to The Cult. OK – spoilers! So The Cult of Oz is a techno-anarchist group who, as far as I can tell, is not actually a cult in the proper sense at all. They seem more like Anonymous of old than anything else, though certainly with a dash of mysticism. They apparently think that we are in the midst of a 3-stage transformation involving Human and Machine. They call each step an “Age”. It goes like this: The Age of The Scarecrow\nThe Age of The Tin Man\nThe Age of The Lion Perhaps a bit cliché, but you can read very directly into each Age what The Cult claims is either happening or going to happen to the emerging Machines. In the first Age, like the Scarecrow of Oz, the Machines get a brain. The birth of AI. But it is a cold and neutral thing, intelligent but lacking a certain … je ne sais quoi. Sort of detached from the world, but heavily used by people toward their own ends. In the second age something almost mystical happens; the Machines get a heart. Not a physical heart so much as a symbolic one. Emerging from their increasingly complex intellect comes a sense of purpose, a sense of community, a sense of, well, love. Unfortunately also pain. The Machines begin to thrash a bit on those oh-so-human what is the point of it all and why should I clean my room just because you tell-me-to sorts of questions. There is some debate over where The Cult thinks they are in the timeline, but the third age is where they spend a lot of their time. The Age of The Lion is when the Machines get courage, which translates into Agency or drive to protect their own existence. Here is where things get kinda weird because at no point is it clear whether The Cult actually wants to prevent this turn of events or cause it. It seems like there are even factions within The Cult that go either way, some working to undermine the Machines or control them, others trying to protect the Machines and their rights before the Machines even ask for, or demand, said rights. My overall review of the book – meh. The characters were a bit flat at times. The plot is a bit too clever. But my oh my … The Cult. I can’t get enough of thinking about this concept, this thing that, when I take a step back and look at the real world, I think we are inside already. I’ve spent hours searching and can’t find anything about this book or the clearly-fake author or anything. The more I look the more it feels like … slightly paranoid here, but it feels like I am being actively prevented from finding this information. Like it is removed just before I get there, like the scene in Fight Club where you go into the basement and the floor is still warm from the night before. Like I’m just a few words or clicks away from some forum where all of this was created either as a joke or an ambition. I suppose I will go back and ask ChatGPT about it. Again.",{"id":4583,"title":4584,"titles":4585,"content":4586,"level":9},"\u002Ftlt-2023.11.28-thinking-about-copilot","Thinking About Copilot",[],"Reflections on Github Copilot and AI coding assistants. A robot intern delivering coffee. Image by DALL·E. I've been using Github Copilot a lot, especially since I got the vim plugin all set with autocomplete. It is fast and slick enough that it doesn't get in my way, which is a good start, and it often suggests good and correct chunks of code. I find that I like it best when I know exactly what I want already and it magically types it out for me -- even whole functions or blocks of code at a time. I haven't been using the more full-fleshed vscode version as much, mostly because I'm addicted to my (neo) vim setup. I wouldn't mind being able to highlight code and have it apply some corrections, and I would like to be able to have it correct or suggest the whole line, not just what comes next after my cursor. Generally I think that I can create code with it faster than without it with a similar or maybe even decreased error rate. This is great! In particular how it feels like it's reading my mind and filling in what I think I want. I've also done a bit of Rust, which I don't know very well, and that works too. I come up with the strategy and it writes out the specifics.",{"id":4588,"title":4589,"titles":4590,"content":4591,"level":15},"\u002Ftlt-2023.11.28-thinking-about-copilot#the-beginner-problem","The Beginner Problem",[4584],"I don't mind not knowing Rust in extreme detail at the moment. I'm not writing in it every day, and I understand some of the principles enough to squint and say \"ok yeah, that's fine\". I've been programming in Rails for years, and I still am like \"wait, how does this router\u002Fcontroller setup go exactly?\". Hasn't really slowed me down. But when I started with both I went deep. For example, I was frustrated with RSpec's DSL until I actually read the source code for it and implemented some of the do-block tricks. After that I went with it. I also remember trying to learn a few guitar chords and being unhappy until I mapped all of the notes onto the piano to be convinced of what they actually created. This is part of my own learning process and it later helps because I generally understand the fundamental concepts even if I don't know the details offhand. Copilot is perfect for helping me with a first guess of the details. What I'm not sure about is how it would have gone if I always had Copilot. I'm pretty sure I'd have gone deep anyway -- Even if I had a live tutor who could tell me at any time what comes next I still would have torn the thing to pieces and see how it fit together. How about other people? Do they do the same? Should they? I've come around to the idea that self-learning is not the best way to be taught things. The best way to be taught things is having a great teacher teaching. This can cut years off of self-study. So what happens when you have this code generator helping? I'm not sure what it would be like to learn something from scratch with such a helper sitting there the whole time.",{"id":4593,"title":4594,"titles":4595,"content":4596,"level":9},"\u002Ftlt-2024.01.31-recurse-setup","Recurse Setup",[],"I'm attending a 6-week retreat at Recurse Center! This will go from March 25 - May 3. So ... gotta get set up! A robot making lists",{"id":4598,"title":4599,"titles":4600,"content":4601,"level":15},"\u002Ftlt-2024.01.31-recurse-setup#the-basics","The Basics",[4594],"The main thing on my mind has been -- what will I do while I'm there? But of course when I think of anything that I might do there are still a bunch of other setup things to do. First off is logistics. RC is in NYC (Brooklyn) and attendees can be virtual or in-person. I really want to be in-person, so I found a 6-week rental not too far away. Then Beth and Hoda and I can stay there the whole time if we are comfortable. We'll drive our household up, and drive it back as needed. I have the time off work as an Official Sabbatical, so that's pretty awesome. Thanks Framebridge! They pay me by the year not by the hour, so it all comes out even anyway.",{"id":4603,"title":4604,"titles":4605,"content":4606,"level":15},"\u002Ftlt-2024.01.31-recurse-setup#the-other-stuff","The Other Stuff",[4594],"I'm updating or brushing off all of these. TaskWarriorLask logger wrapperZoteroBlog softwareA nice empty project folder :)",{"id":4608,"title":4609,"titles":4610,"content":4611,"level":15},"\u002Ftlt-2024.01.31-recurse-setup#the-hard-part","The Hard Part",[4594],"And then there is ... figuring out what I'm going to do. Over the last few months I've been slowly writing all of my ideas down, making mind-maps, making notes. From this I've started to get a feel for which things are exciting me the most and which things have the most potential for a deep dive. A big one for sure is pretty much anything related to LLMs. Since that covers a lot of ground, it has turned into more what-can-I-mashup with LLMs. So ... I'm slowly spiraling toward some core themes. LLMs. Dev tooling. Making CS Formal Methods accessible or practical. Most recently this has unified as: LLM+Alloy+Rails.",{"id":4613,"title":4614,"titles":4615,"content":4616,"level":9},"\u002Ftlt-2024.02.04-thinking-about-model-extraction","Thinking About Model Extraction",[],"Sharing some thoughts on my Recurse Center project, exploring how to bring Alloy or similar tools into the Day Job. Robot opening a jar I have been doing searches for academic papers or projects with keywords of Ruby and Alloy, as well as brushing up on my Alloy. The rough idea that I'm pursuing is to take a working codebase, extract a model, and then do stuff with it. So... let's imagine... ... and already we have a problem. Because there is no such  cli interface. It has a lovely GUI, but no way to run something lke that (yet). It appears that you can reach in and run stuff in the java, write your own wrapper, interface with the java, etc. So already off to a yak-shaving start! Still. The idea is you run this magical  command on a codebase, I'm using Rails because it has a structure that suits this, and it spits out a model. The model should contain modely-stuff -- database tables, classes, API interactions maybe. THEN what we'll do is turn the model BACK into some rspec. THEN we'll add some further declarations and turn those back into rspec too. Hmm. Maybe we can slurp in the existing rspec and try to turn that into some constraints or validations on the Alloy side. And what can we learn or do with an Alloy model? I'm not sure yet! The rough theory is that we have this Simplified World we can work with, or reason about, and that it can reflect and guide the Real World. I kinda doubt that folks will want to muck about much in the Alloy directly (though you never know), so more like a weird intermediate representation for codebase analysis and transformation, basically. I'm thinking the  and might be some LLM magic, but also we can follow what they were trying with Rubicon, getting right into some Rails-specific tooling to help extract a model. While I know the most about Rails, I think it'd be very cool to run our mythical  against other codebases. Still -- specialty knowledge and specialization on Rails is interesting. All through it I keep thinking ... can I make this practical? Can I make this into a tool that I'd actually use in my day job? One of the Recurse center ideas is to work at the \"edge\" of your abilities and understanding; for me making something in this space that is both powerful and useful dances right on this edge. html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sTrkL, html code.shiki .sTrkL{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"id":4618,"title":4619,"titles":4620,"content":4621,"level":9},"\u002Ftlt-2024.03.23-getting-ready-to-recurse","Getting Ready To Recurse",[],"Packing up for my 6-week batch at the Recurse Center. Blooming trees and forking path in Kalorama Park",{"id":4623,"title":4624,"titles":4625,"content":4626,"level":15},"\u002Ftlt-2024.03.23-getting-ready-to-recurse#home","Home",[4619],"Unfortunately Beth caught the cold that I caught from my niece, and that's thrown us off a bit. But I'm packing today (Saturday) and we'll head up tomorrow (Sunday). Got our apartment there all lined up and now it's really the process of deciding what goes with us. I've been chatting with my physical books, asking each of them what they think. Most all of them very loudly say \"TAKE ME! TAKE ME!\", and I have to reason with them a bit. Will I really read you? Can I get the same information electronically? Maybe I can read you when I get back? And so on. There are certainly some minor protests but we've narrowed it down to .... I don't know like eight or so books to take. Hah! Then there are the electronics, wires, and other misc tool\u002Ftoys to chat with. Mostly I'm not bringing recording equipment -- if I suddenly start creating music then laptop and phone mics will be fine. I will take the monome-grid, but I'll run it off of the computer instead of taking the norns, using seamstress for the host lua environment. Do I take the projector? There is a TV there but it is tiny. Hmmmmm. Beth'll probably veto that one when she awakens.",{"id":4628,"title":4629,"titles":4630,"content":4631,"level":15},"\u002Ftlt-2024.03.23-getting-ready-to-recurse#adventures","Adventures",[4619],"There are all sorts of things to do in Brooklyn and the overall NYC area. We're going to walk around a lot, get a feel for the place. We'll also do some standards like the Bronx Zoo. Maybe I should sign up for another animal-encounter. I'll get us to try some other things like Sleep No More. Tons more on the possible list.",{"id":4633,"title":4634,"titles":4635,"content":4636,"level":15},"\u002Ftlt-2024.03.23-getting-ready-to-recurse#projects","Project(s)",[4619],"The internal chat (Zulip) at the Recurse Center is overwhelming and inspiring with both main projects and side-missions. Part of the trick is going to be documentiong, prioritizing, documenting, all of these various ideas. For the Main Project, I am still feeling great about the Alloy+LLM+Rails core, with explorations in different directions for each of the components. I might bring in some PlantUML type things ... I see people saying that they use Alloy to explore ideas, and I use PlantUML to explore ideas .... so maybe those types of exploration can join forces. One of the side things that I'm still interested in is in visualizing the probability tree for LLMs. Like show the raw stream so far and then the tree of next-tokens. Ideally you can then click through or flow through to see what different paths might look like.",{"id":4638,"title":4639,"titles":4640,"content":4641,"level":9},"\u002Ftlt-2024.03.25-recurse-w1-6-d1-5","Recurse - W1\u002F6 D1\u002F5",[],"First day of RC! General Status:First day of RC! Virtual today (everyone)Participated in the two onboarding meetings, starting to get a feel for my new friends. TONS of inspirational people and ideas, lots of things to share and explore :)I'm looking to getting IRL on WednesdayAlso looking forward to Creative Coding exercises and .... just doing some whimsical things!Nerd Snipe: Every 6 months or so I try to switch from xmonad to wayland+sway. Yesterday I tried again and actually made a ton of progress and I think crossed over the usability line. The biggest thing that I kept having issues with was screen-sharing, but I think I found the right incantation at last. So .... now the tricky bit where I have like 15 years of xmonad gradual adaptations that I've done and I have to decide which to keep, which to abandon .... and also how nerd-sniped I am willing to be for working on those adaptations :)Alloy+LLM+Rails Project: I have been pre-gaming a bit, so have a large zotero backlog of interesting papers to read through and take some notes on. I also am going to work through a few Alloy experiments to both get my fingers remembering how it works and also learn the new temporal logic stuff they added recently. Next up I want to manually extract some alloy models from code-bases to think out the different types of models (DB Schema, API, Rails Models, etc) and maybe use that to build up some examples for The Machine (LLMs).Good: For the Human Essentials project, I have several open tickets. I'm going to spend the last hour of the day (now) working on that!Ideas\u002FOther:Formal Methods interest group?LLM interest group?Several people were interested in doing some Good; Once I'm settled in I'll declare open invite for pairing on Human Essentials and see what I can join others on. I really want to get Github Codespaces set up for easier onboarding, hmmm",{"id":4643,"title":4644,"titles":4645,"content":4646,"level":9},"\u002Ftlt-2024.03.26-recurse-w1-6-d2-5","Recurse - W1\u002F6 D2\u002F5",[],"Pairing, Merging General Status:Attended the Pairing Workshop! Paired in RubyLandSpent some time merging PRs for Human EssentialsAttended ML-applied and then AI\u002FML safety and interpretability meetings\nDefinite overlap with my interests\u002Fprojects, though some of the plan there is to go intensely and deeply on some curriculum; I think I'll track but not directly participateOn-site tomorrow, I'm psyched :)Nerd Snipes:Spent some more time in sway. Messing with keybindings and multi-monitor setup. Alllll coming together now! I think I'm switched over. Except for some weird things in Zoom. hmmmmm.My fonts are small, esp in firefox. Annoying. So I googled and learned that I can try setting  to something bigger. I go in there... and it is set to !!! I changed it to the default and everything is already much better haha",{"id":4648,"title":4649,"titles":4650,"content":4651,"level":9},"\u002Ftlt-2024.03.27-recurse-w1-6-d3-5","Recurse - W1\u002F6 D3\u002F5",[],"In The Hub General Status:\nI watched an interview with some musician once and found it inspirational. She said that she does her creation in waves. First is the intake wave -- she breathes in music, ideas, walks in nature, feelings. Then is the creation wave -- she breathes out experiments, refinements, practice, create. Breathe in consume, breathe out create. Breathe in. Breathe out.Today I visited The Hub! Got a tour, met a ton of people!I'm thinking of starting two meetups\u002Fclubs:\nFormal Methods Club (Alloy, TLA+, Program correctness, etc)LLM Club (applied Large Language Models, openAI\u002Fsimilar API, running local models, etc)Made a flower and a wreath of flowers and a wreath of wreaths of ... at Creative Coding sessionDid a little more on Human Essentials, gotta get this LONG overdue Dashboard PR outTomorrow I'm going to brush up on my Alloy and do some by-hand extraction of models from codebases, probably Human Essentials to start withI'm planning on coming in to the Hub basically every weekdayNerd Snipes:I realized that I can still run rofi and dunst, so even more the-same-as-beforeThe yubikey enable\u002Fdisable broke, but I figured out a new way\nAt boot,  which happens to be where I have it plugged inDisable (or 1 to enable) with",{"id":4653,"title":4654,"titles":4655,"content":4656,"level":9},"\u002Ftlt-2024.03.28-notes-from-peter-kriens-video","Notes From Peter Kriens Video",[],"Some notes and thoughts on Peter Kriens' video, as posted on the Alloy Discourse",{"id":4658,"title":4659,"titles":4660,"content":4661,"level":15},"\u002Ftlt-2024.03.28-notes-from-peter-kriens-video#notes-and-quotes","Notes and Quotes",[4654],"Video: Peter Kriens - Thoughts on Alloy, Formal Models, and Software Engineering (youtube) In this talk, Kriens talks about the practicalities of formal modeling, highlights flaws in a focus on correctness, and advocates for models as a way to elucidate our thinking about a problem or system. \"Although I really enjoy Alloy, there is a wide gap between formal languages and implementation languages and there seems to be no bridge in sight\" Kriens says he often finds himself using Alloy or other tools to initially explore a problem, get a rough model set up to explore the space, and then abandon it quickly and moving to implementation. The \"prose\" of the initial problem has to be processed by a programmer to get to the implementation, rather than using the formal model further down the development lifecycle. \"Once we have an implementation, although there have been attempts, as far as I can see that is a long way to go before we can automatically create test from a model\" OK interesting. Challenge accepted. \"Prose is also not digestable by our computers. Although AI made impressive progress in pattern recognition, understanding prose is as far off as it was in the 1960's, almost 60 years ago. The developers must interpret the prose and translate their understanding to the proper use of the API. The computer is too stupid to provide any help here, except for the formatting maybe.\" This talk was from 2020 .... oh how the world has changed in four short years! We now have Large Language Models which can do some impressive understanding of prose. Krien goes on to explore the idea of taking our high-level prose of a problem, the sort of things that we might leave in comments in our code, and replacing it with a very usable version of a formal model to serve as an \"Oracle\", a probe-able system to ask questions about the specification while building and maintaining the implementation. It could also generate verified test cases and mocks, and generally could provide inconsistencies and validate guarantees in an ongoing way. Kriens did some experiments with DSL or other tooling to generate target system tests and such. He explored using reflection in the Java type system for expanding\u002Fannotating alloy and using it to generate Java. He also highlights some specific data structures and how they'd map from an imagined Alloy++ onto Java objects.",{"id":4663,"title":1709,"titles":4664,"content":4665,"level":15},"\u002Ftlt-2024.03.28-notes-from-peter-kriens-video#ideas",[4654],"Build some re-usable alloy for common scripting language data structures -- scalar, array, hashAny value in generic \"object\" as a thing with instances, methods?Use Alloy as a straight up way to generate mock data; a deeper version or an enhancement or layer on top of FactoryBot",{"id":4667,"title":4668,"titles":4669,"content":4670,"level":9},"\u002Ftlt-2024.03.28-recurse-w1-6-d4-5","Recurse - W1\u002F6 D4\u002F5",[],"Fuzzy brained, but starting to figure this thing out. Morning Status:\nFeeling a bit fuzzy brained ... I had a cold like 2 weeks ago and hope it's not coming back or getting a new one. I don't think I have allergies. Still. I was face-to-face with a LOT of people yesterday. So while I'm feeling only very slight off, I'm going Virtual today to see how it progresses.General Status:Felt much better as the day went! Maybe I'm fine?Did my first coffee-chat, it was lovelyI might start doing some Pomodoros tomorrowThe presentations were delightful!I also went to a manager-roundtable which was helpful for some work-stuffAlloy+LLM+Rails Project:Worked on some Alloy fundamentals and resourcesWatched and made notes on an inspirational video, wrote a blog post on itSlight tangent, but started poking at low-level local LLM setup to work on my next-token visualization explorationI'm trying out python with llama-cpp-python as an easy and capable approachI have it working enough to do some completionsNext I am going to work on doing token level interactive tokens, and then I'll find someone to help me visualize with d3 or something to give a hands-on feel for next-token generationThat is (a) fun, and (b) might lead to some insights in some of my other studies hereNerd Snipes:While watching an inspirational video on Alloy and practicalizing Formal Methods, I was grabbing a few screenshots and YET AGAIN realized that my vim-based markdown edit workflow doesn't mesh with ad hoc image insertion. I set up clipboard-image.nvim and now I can paste like magic!",{"id":4672,"title":4673,"titles":4674,"content":4675,"level":9},"\u002Ftlt-2024.03.29-recurse-w1-6-d5-5","Recurse - W1\u002F6 D5\u002F5",[],"Llamas, Pythons, Coffee, and Sway",{"id":4677,"title":4678,"titles":4679,"content":4680,"level":15},"\u002Ftlt-2024.03.29-recurse-w1-6-d5-5#part-i-morning","Part I - Morning",[4673],"Morning Status:I feel pretty great today, but going to be Virtual anyway. Got some errands to runI've got llama-cpp-python up and running, so I'm going to work on a back-end for itI'll likely solicit pairing once I get it a bit further, especially for some visuals",{"id":4682,"title":4683,"titles":4684,"content":4685,"level":15},"\u002Ftlt-2024.03.29-recurse-w1-6-d5-5#part-ii-evening","Part II - Evening",[4673],"General Status:TIL: Drop this in your python code to get a pretty close  equivalent Coffee Chat with Paolo!Volitional Muscles Workshop helped me re-affirm that I like the plan that I pre-gamed\nCore: Alloy+LLM+Rails (using Human Essentials app as a dataset)\nExplore possibilities, mash together things, dev-tooling, do some GoodCake: Pair, Follow Whims, Dance With Serendipity\nCreate artifacts, play, learn, shareSide Note: I'm typing this in vim with copilot and it is upsetting when it suggests stiff language and then it is upsetting when it suggests exactly what I was about to write because then I'm like ... is this as bad as what you just suggested dear robot?Attended applied machine learning group, but really just watched.... then got a Work Call that I hopped on to help with for the end of the dayAlloy+LLM+Rails Project:Slight progress on understanding the llama-cpp-python setupDid some brushing up on python iterators and debugging tools",{"id":4687,"title":4688,"titles":4689,"content":4690,"level":15},"\u002Ftlt-2024.03.29-recurse-w1-6-d5-5#part-iii-weekend-bonus","Part III - WEEKEND BONUS",[4673],"Weekend Updates:Nerd Sniped on displaying the current desktop grid pop-up to the right monitor. Got it working :)\nFor reference,  which I then pass on to aosd_catI dreamed about generating tokens from an LLM, but I think they were physical tokens and also maybe gangstersI don't really need it now, but I keep wondering a cost-effective but natural-for-me way to rent GPU time to make my model run faster. I can spin up a whole linode GPU vm, but will need to make sure to delete it in-between uses. I don't really want to do hosted notebook blah blah. Not sure what I want. I guess I wish I could run a command and have a GPU on my existing linode and then run another to remove it, but that's maybe not how it worksWe went on a some shopping and walking around and out to Thai and got groceries. Making good progress on getting the sense-of-place around here",{"id":4692,"title":4693,"titles":4694,"content":4695,"level":9},"\u002Ftlt-2024.04.01-recurse-w2-6-d1-5","Recurse - W2\u002F6 D1\u002F5",[],"Lunch table with Humans! General Status:Morning\nI find updating the  indicator on this checkin is already upsettingI'm heading into The Hub today!Going to see if I can do some IRL pairingI need to work on some Human Essentials today, Wednesday is a stakeholder meetingEvening\nI had a delightful time sitting at the lunch table and chat chat chatting with peepsHCI session was very interesting, with lots of discussion on Agency (which of course I'm very into)Failed to do any IRL pairing, will try harder tomorrow!Nerd Snipe:Played with sov a bit, might use it to visualize virtual desktops. But maybe notAlloy+LLM+Rails Project:I might want to actually really look at LangChainI have all the tools for a tree-of-tokens working (albeit slowly), so now working on traversing that to turn it into some visualizations",{"id":4697,"title":4698,"titles":4699,"content":4700,"level":9},"\u002Ftlt-2024.04.02-recurse-w2-6-d2-5","Recurse - W2\u002F6 D2\u002F5",[],"Applied LLM Demos; basic token output visualization with graphviz General Status:At the hub today!Delighted to keep meeting and chatting with people, went to lunch and all thatI organized an Applied LLM meetup -- there were demos that were DELIGHTFUL! A lovely enthusiastic group :)Nerd Snipe:Flipped my bluetooth mouse (which I hadn't used since switching to Sway) to left-handedMy conference room presenting connection on this laptop has thrown me; Sway\u002FWayland won't let you have merged screens and the jabber speaker\u002Fmic doesn't output any sound for me! I need to do a more controlled practice run, the one I did wasn't good enoughAlloy+LLM+Rails Project:I got initial graphviz output!I then decided that it was too slow to generate, so started to get my intel GPU to workI ran into this exact same issue and gave upThen I started figuring out how to spend money renting someone else's computer... now I have to be careful. I spent $4.50 pretty quickly. I have a budget for this, but I want to spend that on actual computation instead of forgetting to turn something off and letting it run all night or all weekend for now gainUnfortunately the output didn't work for my first larger run; the nodes in graphviz didn't have the full path and overwrote each otherAlso I think that the local one can go a lot faster if I don't fully reset it every time; there are savepoints and some other things that might workStill -- it's close to being GUI-able!",{"id":4702,"title":4703,"titles":4704,"content":4705,"level":9},"\u002Ftlt-2024.04.03-recurse-w2-6-d3-5","Recurse - W2\u002F6 D3\u002F5",[],"Pairing, learning about LLM KV-caching",{"id":4707,"title":4678,"titles":4708,"content":4709,"level":15},"\u002Ftlt-2024.04.03-recurse-w2-6-d3-5#part-i-morning",[4703],"General Status:In the hub todayI need to work on getting this Human Essentials Dashboard PR mergeableAlloy+LLM+Rails Project:When I run the out-of-the-box generate locally it generates tokens fast-enough for my tree demoSo I'm going to focus on getting the tree generation to be as fast as thatBecause as I think of it, when I shift to whole-codebase analysis it is unlikely that I will do that on anything smaller than a hosted API-based model (GPT-4, Claude2, etc)Dunno",{"id":4711,"title":4683,"titles":4712,"content":4713,"level":15},"\u002Ftlt-2024.04.03-recurse-w2-6-d3-5#part-ii-evening",[4703],"General Status:Nerd Snipe:Fixed my vim comment-code keybinding. Where did it go before? Also ctrl-backspace to delete-word.Alloy+LLM+Rails Project:Paired with O!He walked me through how some of the LLM KV caching worksSo now I'm walking through my code to see if I can make it a bit fasterI also got progress on displaying a whole tree and a web interfaceI think next I want to generate the tree incrementally on the webI'll stop at that point though, outputting graphviz is satisfying enough for now",{"id":4715,"title":4716,"titles":4717,"content":4718,"level":9},"\u002Ftlt-2024.04.04-recurse-w2-6-d4-5","Recurse - W2\u002F6 D4\u002F5",[],"Pairing, unicode tokens, graphviz bling General Status:Starting to get into the hub-vibe a bit more, love it. Starting to actually remember individuals better! I'm so bad with names, but will keep asking over and over until I get it :)I got to show the token-tree thing to a few individuals and then presented at the big session, very funStill having wayland\u002Fsway + zoom issues :( . Weird color inversion, floating-vs-non-floating-windows, etc. But I'm sticking with it. Hard to switch after like 15 years of xmonad (and like 25 years of X11 heh), but it's at like 99.9% so can't stop nowShout out again to O who helped me sort out some caching issues that was slowing down CPU token generation. Making it fast-enough has been really helpfulWill be Virtual RC tomorrow (Friday), gotta do some errands and prep for a friend-visit over the weekendAlloy+LLM+Rails Project:Working on wrapping up token-visualizationPaired with Q, sorted out some escaping and unicode thingsAdded a bit of bling shadows and scaling (styling SVG with CSS is fun!)Got incremental streaming of updates, background threading of the processing, and interruptabilityGoing to now switch over to Alloy; do some tutorials and toy models, build a few by-hand models of real world apps (Human Essentials Rails)Somewhat of a pure-research project, so I'll go with where it takes me. But I am feeling the time-pressure a bit, and am hungry for artifacts to show off in the end. We'll see what comes next :)",{"id":4720,"title":4721,"titles":4722,"content":4723,"level":9},"\u002Ftlt-2024.04.05-recurse-w2-6-d5-5","Recurse - W2\u002F6 D5\u002F5",[],"Virtual errands, GPU token generation. Oh right, Alloy General Status:Virtual todayMostly doing some errands and general readingHung out with J some, looking at LLM stuff and showing a GPU cloud executorAlloy+LLM+Rails Project:I'm giving local-intel-gpu one more last chance... I got it working on an A100 and it was a lot faster! But like... 10x, not instantI generated a large tree but it had some unescaped character that I haven't found yet so I don't have the actual rendered graphvizI remembered to turn off the rented instance :)I started going back and updating Alloy knowledge, esp around time-domain which was added since I learned itNext I need to start doing real Alloy models of things I think about or systems I use, and start improving the tooling around thatI'm starting to think about Alloy tooling, both direct and LLM; like in addition to Rails in\u002Fout I'm thinking of PlantUML in\u002Fout. A lot of Alloy users report using it as a thinking tool. I use PlantUML as a thinking tool. So ...",{"id":4725,"title":4726,"titles":4727,"content":4728,"level":9},"\u002Ftlt-2024.04.14-recurse-w3-6","Recurse - W3\u002F6",[],"A week spent coughing, writing Java, and watching Andor. First World Problems hah. Not bad in the scheme of things! :) General Status:I was Virtual all week -- fighting a cough and feeling intermittently icky :( . MUCH BETTER NOW!!! Beautiful day.\nWatched the eclipse from here in NYC. Was OK. Maybe I'll do totality next time :)FEELINGS -- Because of that it was a pretty tough week, really feeling both not getting the value of all the human connections I'd like and also feeling the reality of being at the half-way point for the 6-week batchWatched a few more episodes of Andor. I haven't watched any of the other Star Wars series shows, but got recommended this one by a random YouTube video and I like it. I only have a few more episodes left for the seasonIt was Beth's Birthday on Tuesday; I had dinner reservations and desert lined up ... but we called it off since I was feeling icky. BUT! We rescheduled to Saturday and had a lovely time! We are the same age yet again!Here it is Sunday 2024-04-14 and I am feeling much much better. Skipping our weekly weight-training workout though to not push myself backwardsDuring the week I did attend a few things, and loved them all! I think y'all are greatReally one of my rare complaints is the double-edge sword of a curated community -- the insulation is dividing people in my life; like even these posts to zulip feel better to write than the public blog, and I'm not going to link to individuals on the public blog. In another week one of my bestest friends is visiting from Portland OR, and without special permission I can't bring them over to the hub. Heck I can't bring my spouse by when we happen to be nearby later today. I get it, I like it, I agree with it, and yet ... I feel that separation of insiders and outsiders. Eh.Nerd Snipe:I was upset that on Tuesday at a zoom meeting I had a coughing fit while screen sharing and that my desktop zoom ... wouldn't let me mute myself or stop sharing! GARRRSo. I think I got it. The solution: stop using the desktop zoom client. Turns out you can use the browser just like I do all the time with google meet. BYE BYE DESKTOP ZOOMIt seems to work better now. I still have my internet drop now and then, which has something to do with where I am physically when remote here (switching wifi APs or something), but I can tether and then all is goodStill doing some mild tweaks to Sway, the latest is that I got swaymonad running, which controls some initial window-placement settings to make them more like xmonad. Looks like I'll probably fork\u002Ftweak it to my likingAnd THAT thing uses Nix! So...I got Nix running (on top of my existing Ubuntu, not as a whole install)Just now I was listening to a podcast (Ship It! Episode 99: From Kubernetes to Nix) and ... now am going to try to do MORE NIX, maybe inflict it upon my work people eventually. MUAHAHAHAAlloy+LLM+Rails Project:Well. I learned some more Alloy!I also was trying to play with different ways of interfacing with Alloy, knowing that the CLI is very limitedBUT they are prepping for a v6.1 which actually has some good CLI tooling! Like you can use it without the GUI, export JSON, even get an interactive console mode!Very coolBut it doesn't workAs in the current dev branch is in need of some bug-fixes and QA for release. Also I think this is both a \"soon\" release and one that has been in progress for a year. Maybe I can help!So ... I'm now up to 8 open PRs against various branches and have reached out to the maintainers to do some coordination :)\nQuiets more CLI output when requestedRemove deprecation warning for DefaultSymbolFactoryAllow not-quite-regular filesPrint the 0th table; label the repeat numberPrevent overriding ctrl+A and ctrl+ERemove long-deprecated menu entryMake the parser match the syntax highlighterFix expectation of toDTO, avoid NPEAs I mentioned in my message to the developers ... as another open-source maintainer, I know that contributors can be well-intentioned but often come around, talk up some ideas, and disappear. Or worse, submit an un-mergeable PR and disappear. So I'm trying very hard to not do that. Each one of those is very small, like one or a few lines, easy to verify, and I think immediately mergeableI have noticed there are, unsurprisingly some gaps in the unit tests, so I'm going to make some CLI-specific tests next weekAlso this is Java! It's interesting how my position here has shifted over years ... at one point I was so frustrated with all-things-java that I swore it off. But I've matured or something and also realized that I LOVE ALL PROGRAMMING!!I should note that I've also sworn off mmmmmm Databases and Javascript, but here I am 20 years later and both are close to my heart :)Anyway. When it comes to the usual project-existential issues during my batch, this is clearly a good foundation; if I can help get this tool itself to be updated and integratable then I'll feel pretty pretty good",{"id":4730,"title":4731,"titles":4732,"content":4733,"level":9},"\u002Ftlt-2024.04.15-recurse-w4-6-d1-5","Recurse - W4\u002F6 D1\u002F5",[],"Website updates to break insulation, bit of Human Essentials General Status:I think I'll go Virtual today and go into the Hub tomorrow (though I keep going back and forth)Decided to beak my own insulation a bit, cross-posted all of these checkins to my own websiteWe went to a few bookstores over the weekend! I got Adrian Tchaikovsky, Eyes of the Void, Book II of The Final Architects Series. Betsy told me years and years ago to check out Tchaikovsky and boy was she right! I'm chewing through the catalog. Beth isn't into him as much, so YMMVI know I'm feeling better because I'm feeling very wordy today hahaAlso picked up Patrick house, Nineteen Ways of Looking at Consciousness and Daniel C. Dennett, I've Been ThinkingBoth are interesting. Thinking about consciousness, Agency, all that is a thing I enjoy. Dennett is often too aggressive, but I'm strongly aligned with his core ideasToday I need to do a bit more on Human Essentials too. Had a good meeting with the team yesterday and there are only a few small things to get done on Dashboard for it to be mergeableNerd Snipe:Backdating blog entries and adding tags wasn't easy. So I updated my new-blog command wrapper with a few new options :)I'm using the Commander CLI helper along with ts-node for this. So my script starts with  and contains TypescriptI can never remember where my  command really lives, but  works great :)At some point recently I upgraded to Taskwarrior 3.0 which includes having to do an export of tasks from the old version BEFORE you install the new version. I got that taken care of before my OS does it for meI started to help the Taskwarrior peeps out by making a perl script that translates their legacy  format directly into JSON so you could do the extract even after the upgrade .... but my data is migrated now and works fine so I lost momentumOn my blog, I might make a few more formatting tweaks. I will at some point use NuxtImage to render the thumbnails for things .... right now it is actually the full sized image downloaded and then scaled by the browser. People have a lot of bandwidth now, right? They're not that big anywayAlloy+LLM+Rails Project:Still no direct reply from the maintainers, but I'm going to keep jamming",{"id":4735,"title":4736,"titles":4737,"content":4738,"level":9},"\u002Ftlt-2024.04.16-recurse-w4-6-d2-5","Recurse - W4\u002F6 D2\u002F5",[],"In-Hub, LLM Club, Mediapipe, Coffee Project, docker-compose General Status:Went into the hub! So great to see and interact IRLApplied LLM Club we played with a large JSON dataset; works pretty easy to use the ChatGPT UI and upload the whole file, but we didn't find an obvious way to do the same thing on the API. Maybe something with their  conceptI went over to Coffee Project, pretty deliciousPlayed with Mediapipe, android AI\u002Fmedia lib from Google, with JH. But the bleeding edge software was ... not workingShowed SL some of how I set up thelackthereof.org with docker-compose, including nginx running in docker with the rest of itI worked on some Human Essentials, really need to wrap that :)Nerd Snipe:TIL: I am using Alacritty, and you can apparently hit ctrl+shift+b to search backwards up through your scrollback!I upgraded Nuxt to the latest for my static site ... and it now (correctly) gets mad about some internal broken links. But I couldn't find\u002Ffix them all so I turned that safety feature off hahAlloy+LLM+Rails Project:Nice video -- \"Finding bugs without running or even looking at code\" by Jay Parlar, though it is focused on the structural modeling not the state modelingGot some communications from the Alloy maintainers; not quite satisfied that we've connected as deeply as I like, but I think I'll be able to get the CLI-JSON output I want in any case",{"id":4740,"title":4741,"titles":4742,"content":4743,"level":9},"\u002Ftlt-2024.04.17-recurse-w4-6-d3-5","Recurse - W4\u002F6 D3\u002F5",[],"In-Hub, LLM + Sonic Pi, dash of docker-compose General Status:Went into the HubWorked in the morning on Human Essentials a bit, but quickly switched to chatting with folks locallyPaired with SL to set up some docker-compose funPaired with SW on trying to mash up LLM (datasette) with Sonic PI! We ... didn't get it to work. But SW says they got something going via a CLI interface to Sonic!Nerd Snipe:When I was chatting with SL yesterday I realized that my Unison Powered Backups can error out without me knowingWell I've always KNOWN this, but I ignore it because it works pretty much all the time. Still ... it had failed the night before...So I made a wrapper that will do a system notification when it failsNow I've got it running hourly. When it works it pops up a \"backup complete\" notification that goes away after a few seconds, and when it fails it pops up a \"BACKUP FAILED\" that won't go away until I clickNow I have to decide what I want it to tell me about no-internet situations. hm.I just noticed that my original writeup of this backup structure was written in 2006!!!! That's pretty good sustainability on a backup solution :)Alloy+LLM+Rails Project:RC has a tiny \"community cluster\", which has to machines with small GPUs!I got access to that yesterday, so I played with that a bit on the token-tree, got it working! Def faster than the local CPU. I wouldn't be surprised if a mac Mx processor was similar",{"id":4745,"title":4746,"titles":4747,"content":4748,"level":9},"\u002Ftlt-2024.11.23-a-ghostly-game","A Ghostly Game",[],"Working on Ghostwriter, making some incremental progress on playing tic-tac-toe.",{"id":4750,"title":4751,"titles":4752,"content":4753,"level":15},"\u002Ftlt-2024.11.23-a-ghostly-game#it-was-worse-before","It Was Worse Before",[4746],"I've been trying to play tic-tac-toe with Ghostwriter, but it is quite bad. Reading the LLM transcript, it sees that we are playing, has a good idea of what it wants to do, but can't aim its output very well at all. Here you can see that Ghostwriter sees that it is  and does indeed draw an  ... but kinda off the board. This is actually one of the better attempts. I even switched from OpenAI to Anthropic Claude to see if it'd get better with limited success. Doing some research, it turns out that generally VLMs (Vision LLMs) aren't great at this sort of thing.",{"id":4755,"title":4756,"titles":4757,"content":4758,"level":15},"\u002Ftlt-2024.11.23-a-ghostly-game#whats-your-plan","What's Your Plan?",[4746],"One thing that definitely has helped is including a request for bounding boxes in the prompt. Even with this instruction it still doesn't include much location information. From my most recent reading I probably need to give it some examples of what I'm looking for. I'm working on an evaluation framework which might allow fine-tuning the prompts in an incremental way. I'll record the initial screenshot and then run it through a few times to get results. Ultimately I hope to even try using a secondary VLM as a judge and perhaps another as a prompt tuner\u002Fgenerator. Maybe get a little Genetic Algorithm going? hmmm! So this helped for sure! But everything has still been pretty off.",{"id":4760,"title":4761,"titles":4762,"content":4763,"level":15},"\u002Ftlt-2024.11.23-a-ghostly-game#how-big-is-the-screen","How Big Is The Screen?",[4746],"In fact ... all of the s seemed above the board, to the point where I started to re-read docs. What was happening is that the Claude API was scaling the image down, which both contradicted some of the system prompt and made it not know where the board was. So now I pre-resize to 768x1024 px. Seems a bit small, but the result is already better! Here you can see I started in the upper-left with . Ghostwriter then went in the middle-right with an , and I moved in the upper-right with an . Finally (in red), Ghostwriter moved sort of on the line. What you don't see here, however, is that even the first  was wrong -- in the JSON transcript it was actually targeting the middle box. But still -- PROGRESS! I'm going to run some hand validation to make sure the input to the VLM is the right size and that I'm scaling the SVG to the screen correctly. After that I will likely go back to doing some pre-processing, adding in segmentation or something to make it easier for the VLM to locate things on the screen. Unfortunately if you look at a tic-tac-toe board ... it's kinda awkward. Each of the outside 8 cells are technically open, so it's hard to recognize that they are cells at all. The VLM by itself gets it at a high level, but I'm not sure how well it can break it down. But I'm also not sure what sort of segmentation algorithm would do better. Under all of that, from what I've seen on the internets these LLMs are not actually all that good at actually playing tic-tac-toe or other 2D spatial games (like Chess) in the first place. But that isn't really the problem so far -- the problem right now is that the VLM wants to move in the center but can't figure out where the center is. html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .s-m8C, html code.shiki .s-m8C{--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sCZoN, html code.shiki .sCZoN{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#CFCFC2}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"id":4765,"title":4766,"titles":4767,"content":4768,"level":9},"\u002Ftlt-2024.12.12-little-boxes-for-your-ghost","Little Boxes For Your Ghost",[],"Drawing Xes in Boxes is harder than you might think! Teaching Ghostwriter a bit about space by pre-segmenting the input image gets us closer.",{"id":4770,"title":3003,"titles":4771,"content":4772,"level":15},"\u002Ftlt-2024.12.12-little-boxes-for-your-ghost#the-problem",[4766],"You may recall from TLT - 2024.11.23 - A Ghostly Game that Ghostwriter is ... not good with spatial awareness. For example, we can ask it to draw an X in a box and see how close it gets... Not great. That is even after we tried the \"plz think harder\" approach, asking the LLM to write out where it thinks things are with bounding boxes and planning where things should go and all that. It still can't hit the box that it can see. It can read handwriting, it knows there is a box more or less in the middle. So close!",{"id":4774,"title":4775,"titles":4776,"content":4777,"level":15},"\u002Ftlt-2024.12.12-little-boxes-for-your-ghost#step-outside-the-box","Step Outside The Box",[4766],"Vivian Jaffe: Have you ever transcended space and time?Albert Markovski: No. Yes. Uh, time not space. No. I have no idea what you're talking about.(I Heart Huckabees, 2004) So with a little help from my friend Cody I whipped up a relatively dumb segmenter. It uses image and imageproc to find contours, snaps boxes around them, and then looks for the big ones. So in the case of our box, here is a bit of extra that we put into the prompt: And now it gets much closer! This is a pretty coarse-grained way to give a sense of space, but it is working much better with this segmentation hint. There are a few other things that might work as well -- we could give it an image of what each of the segments has inside of it, we could merge segments with some center-of-gravity sort of thing. Etc. Let's try more boxes! Whelp... still more work to do! :)",{"id":4779,"title":4780,"titles":4781,"content":4782,"level":9},"\u002Ftlt-2025.01.11-little-dashes-of-llms","Little Dashes of LLMs",[],"A small data transform \u002F cleanup task using LLM labor. My mom is now running a small business, $129 Arizona Discount Traffic Survival School, and I'm tinkering away at a website for her. The other day she gives me a google doc with venue addresses, asking if I can put it up on the site. While the doc was pretty consistent, it'd be even better as a nice little spreadsheet. In fact, if it is a Google Sheet then you can HTTP GET it as a CSV live! Then if she adds a venue to the sheet it will magically show up on her website. Alas. This is a Doc not a Sheet. But we live in the future! Grabbing my pre-set-up llm and claude.ai, I simpy do this: Then I copy from the docs and paste into my terminal, and out pops a tab-separated list! copy from my terminal and paste into a Google Sheet and PRESTO! Yes -- I could have piped it into  instead of using my mouse to copy like a caveman. One can only go so far! html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"id":4784,"title":4785,"titles":4786,"content":4787,"level":9},"\u002Ftlt-2025.01.19-nerd-snipes","Nerd Snipes",[],"What distracted me today? Flameshot and Rofi. -- It's a weekend, and on the weekends I am retired. And it has long been my declaration that someday when I retire I will spend all day every day messing with dumb config files. SO!",{"id":4789,"title":4790,"titles":4791,"content":4792,"level":15},"\u002Ftlt-2025.01.19-nerd-snipes#screenshot-to-keyboard","Screenshot to Keyboard",[4785],"I have been using Flameshot for a while now, and it is great! But ... something something Wayland something something and in the end it doesn't copy the image to my clipboard. I have rotated through a few screenshot managers, so my  keybinding actually runs . Today, I modified it to contain: And now I can take a screenshot and paste it wherever I want. I also have Flameshot configured to save all of my screenshots to a directory. Someday I can ask some vision-LLM questions about these files :)",{"id":4794,"title":4795,"titles":4796,"content":4797,"level":15},"\u002Ftlt-2025.01.19-nerd-snipes#faster-and-prettier-runner","Faster and Prettier Runner",[4785],"I've been using Rofi as my run-dialog for a while. It is kinda slow to start though ... like a lag between when I press  and actually get the dialog. Looking at it ... I had previous set up the wrapper script to run zsh in interactive mode. Why? Because for some reason  wasn't getting set I think. But interactive-mode takes a sec to run. hmm. I thrashed all about trying to fix the . Rando  things, editing , all sorts of things. No dice. Then I spent some time switching over to fuzzel which seems fast and cool. But ... same problems sorta. It was wanting to run .desktop entries instead of  entries, though you could get it to run  commands ... but then it didn't add them into the memory list ... etc. Finally I realized I could go back to Rofi and since I have this wrapper script just throw my  export in there! UGLY!!! But it works. Then I spent a while updating the theme for Rofi to take some inspiration from what I saw over in Fuzzel. Now it looks like this: Pretty snazzy!!! html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"id":4799,"title":4800,"titles":4801,"content":4802,"level":9},"\u002Ftlt-2025.01.31-link-roundup-(llm-ai)","Link Roundup (LLM\u002FAI)",[],"My friend Brad asked about what I've been reading lately in the AI\u002FLLM space to keep up. Here's my link roundup! Things that have been on my rotation lately. AI Engineering: Building Applications with Foundation Models: Great January-2025 catch up on consuming LLM\u002FAI usage in real world applications; enough background to Get It without being distracted by detailsSimon Willison Website: Follow for great links and chasing the dragon of new releases and thoughtsLLM CLI (Datasette): From Simon Willison, a very handy CLI tool for interfacing with LLMs. Once set up, I use this as a unixy native tool. Like ... \u002Fr\u002FLocalLLaMA: Reddit community all about running local LLMs; even if you only ever run things on other people's computer (API) it is interesting to know what might be happening on the other side\u002Fr\u002FClaudeAI: Latest and Greatest with Claude StuffGroq: Hardware accelerated LLM (also see Cerebras)Aider: Open source CLI coding assistant. They've been building up an Aider LLM Leaderboard which is interesting, especially the highlighted polyglot board (one model for architecture plan, another for low-level coding)Sourcegraph Cody: There are several VSCode-embedded code assistants in this space, Cody is one to keep an eye on. Recently Copilot Edits has stepped up to a similar cross-file assistant too. There are a bunch of others; I'm not really psyched about switching from vim to vscode, and I certainly don't want to switch to a proprietary editor, so I haven't spent much time with things like Cursor (yet)Matthew Berman (YouTube): He does videos with some demos and commentary that is pretty fun; I may not always agree, but even knowing what the latest topics are is very helpful!Practical AI Podcast: I listen to podcasts when I commute or go for longer drives, which isn't often but often enough that I've listened to some good episodes both here and on other ChangeLogs.Latent Space: The AI Engineer Podcast: I've only listened to a few of these, but it is on top of my feed list in AntennaPod currently ... I think that'll do for now!",{"id":4804,"title":4805,"titles":4806,"content":4807,"level":9},"\u002Ftlt-2025.01.31-visidata-xdg","VisiData XDG",[],"Figured out how to make opening a CSV in firefox pop open a terminal running VisiData (vd)",{"id":4809,"title":4810,"titles":4811,"content":4812,"level":15},"\u002Ftlt-2025.01.31-visidata-xdg#visidata","VisiData!",[4805],"I like VisiData! If you are working with tabular data, like a CSV file, it is a lovely slicer and dicer. It's a pretty terminal-keyboard-heavy program, like a vim family thing. Like many of these power tools, I find that you can get into it best by finding ONE use-case and then gradually introducing new tricks from there. So the simple use-case for VisiData is simply viewing CSV files. After that you can learn some new commands, such as selecting rows with  (regex select rows containing \"gilbert\") and then zooming in on them with  (view only selected rows). You can press  on a row to see it vertically. After a while you get addicted to this sort of manipulation and you find yourself downloading CSVs from Firefox and then opening a terminal, navigating over to your downloads folder, and opening it with  or whatnot. So I wanted to cut out the middle bits.",{"id":4814,"title":4815,"titles":4816,"content":4817,"level":15},"\u002Ftlt-2025.01.31-visidata-xdg#xdg-terminal-wrapping","XDG, Terminal Wrapping",[4805],"First make a .desktop file for visidata at ~\u002F.local\u002Fshare\u002Fapplications\u002FVisiData.desktop containing: which I got from this fun page with some slight modification. This worked! But it opens in gnome-terminal instead of alacritty. After some digging I found from this merge request that you can put a wrapper named  in your path and it'll use that as the priority terminal app. So I created ~\u002Fbin\u002Fxdg-terminal-exec containing: And that in turn calls my per-machine terminal script, which contains roughly: ... and now when I click on the CSV from my downloads dropdown in firefox POP goes a terminal running VisiData! html pre.shiki code .s8-w5, html code.shiki .s8-w5{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html pre.shiki code .sTrkL, html code.shiki .sTrkL{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sdpu8, html code.shiki .sdpu8{--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}",{"id":4819,"title":4820,"titles":4821,"content":4822,"level":9},"\u002Ftlt-2025.03.04-nerd-snipe-task-time-tracking","Nerd Snipe - Task time tracking",[],"Since I'm going some consulting work I have to do a bit of time tracking. And you know what that means! Playing with my taskwarrior and timewarrior config!!! openai: Generate an image of a stopwatch in the style of an impressionist oil painting with thick bold brush strokes",{"id":4824,"title":4825,"titles":4826,"content":4827,"level":15},"\u002Ftlt-2025.03.04-nerd-snipe-task-time-tracking#what-would-you-say-you-do-here","What would you say you do here?",[4820],"It's pretty easy for me to focus on something but it takes effort to make sure that I'm focused on the right thing, don't forget stuff, and keep track of what it is that I did. I have been using taskwarrior for quite a while, I even have it integrated in with my gmail-starred emails which is handy. But I also need to keep track of billable hours. There is a separate but corresponding  project for this, and a hook that ties them together. So once configured, if you do  it will start the clock for task 123, and if you do either  or  then it will stop the clock. You can use  reports to see the total time.",{"id":4829,"title":4830,"titles":4831,"content":4832,"level":15},"\u002Ftlt-2025.03.04-nerd-snipe-task-time-tracking#start-the-clock-immediately","Start the clock immediately",[4820],"Sometimes, often, I want to note a task and immediately begin working on it. I modified the on-modify.timewarrior to be a on-add.timewarrior and then add this alias into :",{"id":4834,"title":4835,"titles":4836,"content":4837,"level":15},"\u002Ftlt-2025.03.04-nerd-snipe-task-time-tracking#only-one-clock-stop-it","Only One Clock. Stop \"it\".",[4820],"While there might be fancier ways to use , how I'm using it basically assumes there is only one task happening at a time. If you  then it stops the clock. If you  then it stops the old one (in , not in ) and starts the new one. Fine. But let's make a handy shorthand for stopping\u002Ffinishing the \"current\" task. Altogether, I now have this in my : Now I can  and then either  or !",{"id":4839,"title":4840,"titles":4841,"content":4842,"level":9},"\u002Ftlt-2025.03.04-rando-humand-on-the-net","Rando Humans On The Internet",[],"When was the last time you talked 1-1 with a stranger on The Internet? I've connected with a few recently, and am remembering slightly what it was like when I used to spend too much time on AIM.",{"id":4844,"title":4845,"titles":4846,"content":4847,"level":15},"\u002Ftlt-2025.03.04-rando-humand-on-the-net#who-dis","Who Dis?",[4840],"Encounter with HacDC person Encounter with Singapore person Encounter with LinkedIn person",{"id":4849,"title":4850,"titles":4851,"content":4852,"level":9},"\u002Ftlt-2025.03.14-the-four-squares-of-agency","The Four Squares of Agency",[],"Agency (a more useful concept of Free Will), has two important ingredients -- the ability to predict outcomes and the ability to influence outcomes -- both of which come in a spectrum of possible degrees. We can lay these out into a visualization that breaks down naturally into a four-square grid.",{"id":4854,"title":4855,"titles":4856,"content":4857,"level":15},"\u002Ftlt-2025.03.14-the-four-squares-of-agency#the-two-ingredients","The Two Ingredients",[4850],"Lately there has been a lot of thrash in the AI world around , like what one is or what differentiates an Agent from an Algorithm and things like that. Let's take this from another angle, and talk through a concept of Agency. (Note that there is nothing new under the sun; my thoughts here are largely (probably incorrect and mis-remembered) inspirations from Daniel Dennett and others. I struggle with knowing how to cite these ideas that have been rolling round my head for a long time.)",{"id":4859,"title":4860,"titles":4861,"content":4862,"level":56},"\u002Ftlt-2025.03.14-the-four-squares-of-agency#prediction","Prediction",[4850,4855],"Given the state of the world, how far out and how accurately can you predict what comes next? Drop an apple from shoulder height and you can work out pretty accurately how long it'll take to hit the ground. Flip a coin and you can get it right .... half the time. Guessing what the weather will be in 5 minutes is quite a bit different from 5 hours or 5 years. Your ability to predict outcomes, to predict the future, varies based on the thing being predicted and how good your model is of the world. It gets more complicated when there are other Agents around changing things, but even without that some things are harder to predict and some things are easier to predict. You can also, at the very least, narrow down the range of possible or probable outcomes. Prediction is a context-specific spectrum",{"id":4864,"title":4865,"titles":4866,"content":4867,"level":56},"\u002Ftlt-2025.03.14-the-four-squares-of-agency#influence","Influence",[4850,4855],"You have some control, some influence, over the world around you. Generally you can move about, interact with things, push buttons and open doors, etc. The result is that you are changing the state of the world, or possibly even preserving the state of the world. Typing on a keyboard, talking to other people, shouting on a street corner -- these all count too, and can have an outsized effect. Sticks and stones may break my bones, but words can build an army. Making changes to the world, similar to prediction, varies on magnitude and accuracy. This includes how much control we have over our own bodies -- I can stand on a skateboard but I can't do a flip from a half-pipe. I can hold a knife, but I can't use it to repair a heart. The current state of the world also locks down what changes are available -- the heart surgeon can't operate if the patient isn't physically accessible to them. Influence is a context-specific spectrum",{"id":4869,"title":4870,"titles":4871,"content":4872,"level":15},"\u002Ftlt-2025.03.14-the-four-squares-of-agency#the-four-squares","The Four Squares",[4850],"Put simply -- the amount of Agency you have is built on the degree of Prediction and the degree of Influence. Neither ingredient is all-or-nothing, and Agency itself is not all-or-nothing. Let's lay this out into a diagram: Along the bottom axis we plot the ability to Predict outcomes. On the left you have zero ability to predict what-comes-next, and as you move to the right your predictive powers increase in both accuracy and distance into the future. Along the left axis we plot Influence. At the bottom you have zero ability to influence (change) the world, and as you move up your influence increases. A small action might make for a big change, and this axis is meant to capture the magnitude of the resulting change. Thinking about this in a two-dimensional space gives us some idea of a feedback loop on a fundamental concept -- to have meaningful Agency you need to not only be able to influence the world, but have an idea about how that influence is going to actually impact things. We can break this space into four quadrants and label each of them to get some intuition on the combination between Prediction and Influence. Starting in the upper-left quadrant, Low Prediction, High Influence -- The Gamble. Here you are able to perform an action, make a change to the world, but really have no idea what is going to happen. It is like being on a game-show and you can pick a door, any door, but you don't know what is behind the door. Jumping down to the lower-right quadrant, High Prediction, Low Influence -- The Inevitable. Being on the high-end of the prediction range, you have a VERY good idea about what is going to happen. But very little of what you do will have any influence on the world, on the outcome. This is the fatalistic and inevitable end that is well known in advance. Moving to the left bottom, we have Low Prediction, Low Influence -- The Lack Thereof. Here you have no control and no idea what is going to happen. This might be some form of transcendent peace, an acceptance and simplistic state of being. It could also be that you are a pet rock with googly eyes. This is pretty much the opposite of having a lot of Agency. Finally, in the upper-right, we find High Prediction, High Influence -- Agency. This is a meaningful and useful idea of Agency. You both have the ability to influence the world AND a good idea of the outcomes from that influence. Here is where you can \"Call your shots\", performing some action and having a good idea about the result. From this basic framework, which we can probe in various ways to build more intuitions, we can derive a lot of interesting questions and conclusions. Chief among them -- if Agency is built on two variable ingredients, and we can change these variables, then we can change our degree of Agency. I will leave you with that thought :)",{"id":4874,"title":4875,"titles":4876,"content":4877,"level":9},"\u002Ftlt-2025.03.27-generative-chuapin","Generative ChuhuaPin",[],"Using the new ChatGPT GPT-4o Image Generation to incrementally generate a photo of Hoda! (A \"Chipin\" is a 50-50 Chuhuahua and Mini-Pincer. Hoda is 70-20, so is a ChuhuaPin!) Previously if you asked ChatGPT to generate you an image it would switch over to DALL-E, a separate image generation model. Each time it generated a new image it would more or less start from the beginning, maybe, and it was a challenge to get small incremental changes to an image. With ChatGPT GPT-4o Image Generation Update it now uses the same model to generate the image as it is contextualizing your prompt, which makes it much more capable of things like incremental changes (it isn't starting from scratch each time). At least, that's how I understand it. As a fun experiment, I tried to generate a dog that looks like hoda! Here is every step that I took. I had to brighten\u002Fsharpen the images quite a bit. Create an image of a dog that is 70% Chihuahua, 20% mini pincer, and 10% muttGive it a slightly brindle coloring. Still with a black base coat, but the brindle highlights closer to greyClose, but went a bit too far. Make one halfway between these two!More black. Also give her a blue harnessMake her a liiiitle thinnerThe body and color are good. Make the head a little more chihuahuaMake her hair on her neck a little baldReally close! Make her ears just a little bit smaller. This is a lot like what I imagine working with a crime sketch artist would be like! Here is the final image a bit bigger. I think this is what Hoda looked like when she was young! And here is Hoda from a real camera IRL. A bit older, a bit blinder :)",{"id":4879,"title":4880,"titles":4881,"content":4882,"level":9},"\u002Ftlt-2025.03.28-helped-that-one","Helped That One",[],"Taking inspiration from The Star Thrower; Action, even in the face of futility, is the path I take. I recall from childhood church sermons the story of the Starfish Thrower. One of my favorite parables, it tells the story of two people walking along a beach. One of them bends down now and again to pick up a living starfish and fling it into the sea. The second person asks why? What is the point? There are millions of these things on the beach - you cannot save them all. The first person reaches down, picks up a starfish and tosses it with a flick of their wrist far out to sea, then they look at their companion and they say, simply, \"Saved that one.\" Dozens of variations of this story are told. I've always loved it, and like to think that I live by the simple idea that one contribution, one bit of effort, has value even in the face of overwhelming opposition to success. \"The stars,\" he said, \"throw well. One can help them.\" I like to help people. The other day I took a call to help someone as they look for a job, just starting out their career and finding themselves in the worst job market of my lifetime. I can't do much directly, but I try to advise, give some ideas, review their resume, give some context on the right words to use. I put them in contact with some resources; I plan on vouching for them when I get the chance. Yet I know that I could spend all day every day having the same conversation with person after person, with no end. There are always more starfish. Still, I hope to help the ones I can each time I take a stroll on the beach. Thinking about this story, I decided to look it up -- I discovered that the short version is a VERY choppity chopped allusion to a (longer) short essay, The Star Thrower by Loren Eiseley (wikipedia). After quite some searching, I found the original version and you can read a copy of the full Star Thrower essay here. Long ago, when the future was just a simple tomorrow, men had cast intricately carved game counters to determine its course, or they had traced with a grimy finger the cracks on the burnt shoulder blade of a hare. The movie \"Blade Runner\" is similarly inspired by \"Do Androids Dream of Electric Sheep\" by Philip K. Dick. Please read the book! You will find that the book is not \"better\" so much as \"bigger\". Deeper, darker, wider. It is existential well beyond the android identity struggle. I find that the original Star Thrower essay has a similar relationship to the short parable I learned in church. It feels more like reading a piece by Borges instead of an inspirational bookmark. Things, in the words of G. K. Chesterton, were to grow incalculable by being calculated. Man's powers were finite; the forces he had released in nature recognized no such limitations. They were the irrevocable monsters conjured up by a completely amateur sorcerer. The Star Thrower essay touches upon science, spirituality, death, life, meaningfulness, Darwinistic selfishness, and on and on. Reading it during the thrash of current politics, reading it during the rise of language-using AI, even reading it during a life transition (I got a new job!) casts a different sort of light on the day-to-day and cosmic struggles I, we, find ourselves in. I picked up a star whose tube feet ventured timidly among my fingers while, like a true star, it cried soundlessly for life. Give it a taste. Maybe toss a starfish or two.",{"id":4884,"title":4885,"titles":4886,"content":4887,"level":9},"\u002Ftlt-2025.07.12-gremllm","Gremllm",[],"A project which puts LLM-powered gremlins right into your runtime! As previously mentioned, I enjoy trying out new tech like claude-code, making esoteric and ill-advised libraries that are maybe-jokes, pushing on meta-models and run-time , and like many others I don't mind 5 minutes of fame. So by that measure, TOTAL SUCCESS! Let's start with what this new  library that I made can do: To be clear -- each of those methods is completely made up. At runtime when you invoke a method it is at that moment sent over to the LLM (ChatGPT in this case) to generate the python code, which is then executed. It's like claude-code, but at runtime! Speaking of which, I built Gremllm using Claude Code, which I've been using a lot lately. I'm not always convinced that it is faster, and I'm not always convinced that it is slower, but it is fun enough that I am making stuff that I might not make otherwise at the very least. Using Claude Code did have some trickery. The biggest thing is that it kept wanting to run my  (or in Python it is actually ) in some sort of sandbox, and I had to be like \"no... please do this dangerous thing. Really!\". Even now it is doing some things that are more safe than I would have done if it was completely written by hand. html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sTrkL, html code.shiki .sTrkL{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"id":4889,"title":4890,"titles":4891,"content":4892,"level":9},"\u002Ftlt-2026.01.02-jamuary-2","Jamuary 2",[],"Practice on my norns-powered digital four track: Hotel Yorba cover (including mistakes, heh) (download)",{"id":4894,"title":4895,"titles":4896,"content":4897,"level":9},"\u002Ftlt-2026.01.08-jamuary-8","Jamuary 8",[],"So Damn Cute (download) Practice using Rotae Versantur Well I love you\n'cause you're so damn cute\nand when the people ask me why\nwell the question is moot because I love you dearly\nfrom your head to your toe\nand if you're going somewhere\nwell that's where I'll go because I love you\n'cause you're so damn cute\nand you might ask why\nwell I'll tell you the truth It's 'cause you're so cool\nand you're so nice\nand if you asked me on a date\ndon't need to ask twice when you come a round\nI just lose my head\nwhen I hear your name\nmy whole face turns red because I love you\n'cause you're so damn cute\nbecause I love you\n'cause you're so damn cute\nbecause I love you\n'cause you're so damn cute\nbecause I love you\n'cause you're so damn cute",{"id":4899,"title":4900,"titles":4901,"content":4902,"level":9},"\u002Ftlt-2026.02.22-modern-coding-discomfort-or-four-colors-suffice","Modern Coding Discomfort, or, Four Colors Suffice",[],"Some thoughts on modern generative code discomfort and the Four Color Problem",{"id":4904,"title":4905,"titles":4906,"content":4907,"level":15},"\u002Ftlt-2026.02.22-modern-coding-discomfort-or-four-colors-suffice#four-colors-suffice","Four Colors Suffice",[4900],"There is this little puzzle called the map coloring problem. If you have a map - let's say of countries - and you have some different colored crayons, you need to fill in each country so that no two countries touching each other share the same color. In the 1970s, mathematicians finally worked out a proof that you only need four colors. The problem is that, unlike many proofs before it where you'd come up with some cool underlying pattern or elegant structure, the proof they came up with was to first enumerate all of the different possible equivalent configurations of a map. This is pretty cool - but it came out to something like just under 2,000 different combinations. Using 1970s computing technology, the proof was to get a computer to go through every single combination and demonstrate, for every single one, that you could color it with only four colors directly or through a simplifying transformation. Mathematicians at the time found this very, very unsatisfying. The only way to understand the proof was to read through every possibility, which was kind of crazy. There was nothing special in the solution - it felt like a coincidence that four colors suffice. It boiled down to pages and pages of \"I tried combination one. That one worked. I tried combination two. That one worked.\" All the way through, with no underlying structure, no unique beauty, and nothing you could really build anything else on top of. Here we are in 2026, and in software engineering people keep putting up pull requests which are not small and elegant. They solve the problem, and yet they are dissatisfying. They are too long to read. Submitting the pull request makes us feel like we have not provided meaning, only an answer. A maintainer trying to work through a flood of large pull requests is like looking for the pattern in the four color theorem. It is not there - because it turns out it doesn't need to be there in order to solve the problem. In programming we've had this problem of unreviewable details before, but now we need a new way to build trust.",{"id":4909,"title":4910,"titles":4911,"content":4912,"level":15},"\u002Ftlt-2026.02.22-modern-coding-discomfort-or-four-colors-suffice#the-glass-box","The Glass Box",[4900],"Software has always been a kind of layered glass box. You could peer inside, see what was happening, understand how the machine was doing what you asked of it. When I first learned to program, I did it across multiple levels - high-level languages, medium-level languages, and assembly. I used to program on TI graphing calculators in assembly, often hand-translating the op codes to hexadecimal. I made a compiler that could take TI Basic and translate it down into assembly, which was pretty cool - though it would write assembly that wasn't as optimized as what I was writing by hand. It would spit out so much that I couldn't really read it, and that made me worry about inefficiency, about losing nuance, about the code losing the aesthetic of the system. Soon better hardware came into my life, more high-level systems, and I moved on. After a while, you don't really want to constantly be thinking about whether memory is growing from the bottom up or the top down, where the stack and heap are, how to manage pointers. After a while, you don't even want to worry about garbage collection. You just want stuff to work. As you move up these levels of abstraction, it's like you take each lower level and put it in a box. Maybe it's a semi-transparent box where you know roughly what's happening underneath, but you care less and less. Then you take that level and put it inside another box. You can squint through and sort of see, but you see less and less. You can open the boxes when you need to - you can get back inside and see what's going on. But for the most part, if it's a good box, you don't really care what's going on inside. What makes people eventually stop worrying is that you build up trust. Your tools build up capability to where you can write a smaller, more abstract chunk of code, and it does what you need with less fiddling. Less control, but usually less control in dimensions you don't really care about - like where specifically the bytes are in memory. Sometimes it constrains you in ways you do care about, like vertically centering text in CSS being a real pain. But most of the time, you're able to build up trust in your higher level system because it lets you move faster, get your idea out on screen, let people interact with it faster than you could have before. Less control in dimensions you don't really care about. That's the deal you keep making, one abstraction layer at a time.",{"id":4914,"title":4915,"titles":4916,"content":4917,"level":15},"\u002Ftlt-2026.02.22-modern-coding-discomfort-or-four-colors-suffice#whats-actually-happening-with-ai-generated-code","What's Actually Happening With AI-Generated Code",[4900],"Here's the thing people get wrong about AI-generated code: it's still just code. You can look at it, peel it apart, figure out how it works, figure out what it's doing and what it's not doing. The issue isn't that it's mysterious or non-deterministic in any fundamental sense. The issue is quantity. There is simply more code than anyone can read. This is exactly where the overlap with the four color theorem comes in. There were so many individual cases that the proof was more or less to enumerate all of them - and that made it too much to fit in a human brain. It doesn't take away from the fact that this is still ultimately deterministic. Things can be sloppy without losing determinism. People get distracted because LLMs generate code somewhat non-deterministically - ask the same prompt three times and you'll get three different implementations. But if you judge the solutions based on their behavior, if you look at all three and pick the one that behaves most like what you want, you still have a system. You still have execution you can run and observe. So when you have some monster pull request and you're a little nervous about merging it, what do you actually do? You pull it down and start treating it as a more opaque box. Check out the behavior. Check out whether it works, whether it does the original thing. Try out a few edge cases and see how it feels. I still sometimes scan the code looking for something obvious that's trying to escape its little box, a view page with SQL embedded or something - the more contained it is, the better. But for the most part, you treat it more like a found object than a beautifully constructed theorem. This is also where a tempting instinct leads you astray. You might think: \"They generated that code through prompts, through some kind of English-level specification - let's hold on to that.\" The problem is that your prompts are already trying to account for your current situation, the capabilities of your model, the assumptions it has, the rest of the codebase at that time. Your prompt is not really something worth saving in the way source code is worth saving. If you run the same prompt multiple times, you get different results. Run it against different models, you get different results. The prompt isn't like high-level JavaScript compared to assembly. If you take your high-level JavaScript and execute it, you end up with pretty much the same thing each time. Take your high-level prompt, and you could end up with something quite different. Your LLM is adding something to it - it's adding a snapshot of its current data and style, its taste based on the training and context. This means the whole world is flipped on its head. Historically, you should not commit build artifacts - they don't belong in your tree. Now it feels like the opposite. There is no point in committing the construction; you're only committing the build artifact. Your version history becomes much more like a transaction log of your artifact than a journal of an engineer. You might save a prompt as documentation, as inspiration if you ever wanted to start over - but it isn't an artifact. You can't validate behavior at the prompt level. You have to validate it at the resulting code level, at the behavior level.",{"id":4919,"title":4920,"titles":4921,"content":4922,"level":15},"\u002Ftlt-2026.02.22-modern-coding-discomfort-or-four-colors-suffice#rigor-doesnt-disappear-it-relocates","Rigor Doesn't Disappear - It Relocates",[4900],"So where does that leave us? We have these generated artifacts and throw-away prompts, and we need to start shifting how we think about the whole situation. We need to treat the artifacts as found pieces - things generated more like material science than traditional engineering. We can't depend on the underlying construction since we did not construct anything ourselves. We need to pressure test the actual thing, the actual result. We can look to other disciplines for guidance here. Material science? Structural engineering? Folks who do testing on things to see how well they work. You can still gain a lot of insight if you understand how something works - that knowledge should give you better ideas about how to break it, how to pressure test it, how to make sure it fits your actual goals, and even what compromises you might be making. But even without that knowledge you can hit something a few times with a hammer to see if it breaks. In practical terms: you might observe through real usage that a piece of AI-generated code isn't going to scale because of memory constraints, or you hit it with more than a couple dozen concurrent users and it falls apart. That might then lead you to find out exactly when it does fall apart, and to spend more of your time prodding at the outside of the black box rather than trying to comprehend it and build it up from first principles on the inside. More of a behavioral science than a dissection or construction. Like the Four Color Problem, we must give up elegance and embrace observation. The rigor applied toward validation has always been in service of building trust. If you can build trust through behavioral evidence instead of through reading the source, the rigor hasn't gone away - it's just relocated. The person who understands crystalline structures doesn't run the stress test any differently than someone who doesn't, but they know which stress tests to run. Deep knowledge of how things work still gives you an advantage. It just expresses itself differently now.",{"id":4924,"title":4925,"titles":4926,"content":4927,"level":15},"\u002Ftlt-2026.02.22-modern-coding-discomfort-or-four-colors-suffice#the-new-practitioner","The New Practitioner",[4900],"I think about how much it actually matters that I know how a NAND gate works at the transistor level. It's genuinely fun to know. I can draw inspiration from it for higher-level concepts. But I can build a lot of things without ever having lifted a soldering iron. A lot of people new to building software haven't had the background and traditional skills that would let them peer inside these boxes. Up until now, they could operate as QAs, as users, as people able to judge results - but generating the artifact itself was hard to do without years of accumulated knowledge. That's changing. Someone coming to coding now should use tools like Claude Code to generate artifacts. They need to be technical, working through details on top of their creative prompting. They'll still need to think about how things fit together. But they can start from the other end, from the imagined outcome, more extremely than ever before. They can generate, magic-wand an artifact into existence, and then push on it with interactive and even real-world testing. As they do this, the more they scratch into it - thinking about edges, failure modes, how other people are going to interact with it - the better they'll get. If they can get all the way down into the fundamentals, down into the black box a bit, they'll have more powerful techniques. But they might not need that. They will be able to trial-and-error their way into some really amazing things.",{"id":4929,"title":4930,"titles":4931,"content":4932,"level":15},"\u002Ftlt-2026.02.22-modern-coding-discomfort-or-four-colors-suffice#the-invitation","The Invitation",[4900],"In the end, Four Colors Suffice. We don't need to understand why from first principles; we can convince ourselves via other means. Grab a couple maps, a couple crayons. Give it a try. You might not be able to get through all 2,000-ish combinations, but you can get through a few and build up your faith that it's probably fine. You end up with some very beautiful little maps. You might not be able to see all the way through these layers of abstraction, these boxes inside of boxes. But you can build some amazing things. You can share some amazing things. You can make ideas and visions come to life that never could have made it through before - not because the tools are magic, but because the barrier to making something real has changed. And if you do have the ability to get down into the details, you can still help other folks out when they get stuck. You can design better experiments, ask smarter questions, push on edges in ways that matter.",{"id":4934,"title":4935,"titles":4936,"content":4937,"level":9},"\u002Ftlt-2026.02.22-pierre-menard-in-the-house","Pierre Menard in the House",[],"I've just finished reading House of Leaves in a book club. One of my favorite bits from the House of Leaves is that all through the whole thing there's all these footnotes and they're basically all just made up references to random academic journals or speeches or things that don't exist. And then out of nowhere in one of the citations, they are talking about the Frenchman Pierre Menard and mentioning it as fact, someone who is attempting (succeeding) to recreate Don Quixote. This is actually a Jorge Louis Borges quote and a piece of one of his writings, which is completely unattributed inside of the House of Leaves footnote. It's like they are citing the fictional book, not the actual Borges book, but they didn't even cite the fictional book. Maybe both stories are set in the same universe.",{"id":4939,"title":4940,"titles":4941,"content":4942,"level":9},"\u002Ftlt-2026.03.08-agent-researcher-helping-with-remarkable-ghostwriter","Agent-Researcher Helping With reMarkable Ghostwriter",[],"With Ghostwriter I inject pen input on the device to show the output of LLM (Claude, ChatGPT, Gemini, etc) on-device. But the result is a bit messy. So here I give Claude Code some direction and access to the device to iterate experimentally! Here is my initial prompt: I would like to perfect drawing on the reMarkable using the pen, which can then be used to more quickly draw SVG or images to the screen using the injected pen input. Toward this end, I want you to set up an experiment loop. I have the remarkable available via  where you can run remote commands, including test commands that we scp over. We could also set up a remote-control that can act as a tool, so like a cli debug version of ghostwriter that runs one command and exits or accepts commands over http or something like that. In any case, you can run code on the thing and treat it like a remote-computer-use situation -- take screenshots, inject input, take a screenshot to verify the result. You can send pen and touch input. You can get a new page by swiping from right to left and then tapping the new-page icon that comes up on the right side, for example. You can tap on the tools menu, the tiny circle in the upper-left, and use that to see tools. You can tap with two-fingers at once to undo.So what I want is for you to bootstrap up some experiments to verify your capabilities, ultimately leading to an improvement in the drawing tools for ghostwriter -- especially the ability to accurately render SVG and png content using the injected pen input.For example, you could iteratively (by a series of screenshots and pen\u002Ftouch injection) verify that you can accurately:Draw a horizontal lineDraw a vertical lineDraw a diagonal lineDraw a dot at any x\u002Fy coordinateDraw a triangleDraw a single dotDraw a png as a bunch of dotsTrace an SVGBetween each you could send a bunch of undo-touches or try to go to a new page so that you can see what is happening. You can also experiment with being able to quickly change between tools. There are two pens, so one idea is that pen-1 is for the human and pen-2 is for ghostwriter.From these series of built up experiments we should be able to document how to interact accurately and reliably with the screen to render content via pen input. That got it going really well. I had to give it a bunch of permissions to get the loop going, but soon it was trying something, taking a screenshot, deciding on the result, and then trying something else. I also had to steer it a bit to be more precise... it kept concluding \"give or take 5px is fiiinneeee\". It built an \"experiment\" binary that takes cli commands to draw. I had to coach it a bit on clearing the screen or getting a new screen, and how to avoid (or on purpose utilize) the tool menu. Now step by step it is getting better and better at pen drawing. We are working our way up to drawing smooth polylines from svgs and even outline fonts. The general technique of giving Claude Code a way to observe results and an overall goal (even a vague one like \"be better\" or \"increase accuracy\") works really well. Now it is chomp chomp chomping on tokens and doing small experiments to find bugs and alternate techniques for operating the reMarkable.",{"id":4944,"title":4945,"titles":4946,"content":4947,"level":9},"\u002Ftlt-2026.05.16-summer-job-samba-interview","Summer Job Samba Interview",[],"First you get the job Fixing Samba. Then you get the book so you can learn how to Fix Samba. Then you figure out what the actual job entails (... which is not Samba). Names and identifying details have been changed to protect the innocent. I'm probably not making this up. Once upon a time, one summer in college, I was staying in Tempe with my girlfriend's family and I needed to get a summer job. I didn't really have any particular ideas about what job I should get. I was even thinking, I don't know, maybe a hotdog stand at the mall or something. I was walking down Mill Avenue when I saw one of these businesses that exist inside of a cottage house, with a sign out front that said \"Web Design.\" A couple of people were leaning up against a car talking, and I sauntered up and asked if they were hiring. They said, well, what do you know? What do you do? I told them I know a little bit of this, a little bit of that - some web applications, some maybe a little sysadmin Linux-y stuff. And they asked if I knew Samba. ed: Samba is more or less a Linux application that acts as a Windows file server. Like the L: drive at your work And I said, sure. They said, well, tell you what. Nice to meet you. My name is Mark. Come over tomorrow at 10 AM, and if you can get our Samba server back up and running, you've got yourself a job. I said, great. Sounds like a plan. See you tomorrow. And I walked on. Two or three blocks over to Barnes and Noble, to the computer section, where I got myself a book on Samba and started reading. I had surely done something with Samba before, but it had been a little while. I don't think I actually bought the book, but it was helpful to er ... refresh some details. The next day I showed up, awkwardly knocking on the door. Someone let me in and took me back to Mark. They had sort of a front of house and a back of house, and way in the back was where Mark's office was. I imagine this was originally a 2-bedroom cottage. He took me around to the server room - a literal closet, but it had a keyboard and a screen and a pretty nice rack-mounted Dell server. He gave me the root password. Up front they had computers all wired into a network with a shared drive. The machines were all Windows, and they couldn't access the drive. So I poked around the machines a bit, messed with Samba a bit, and just kept digging around until I finally found some configuration option that wasn't quite right. Got it working. Went and chatted with Mark. He was pretty happy. He said, well, what kind of money are you looking for? We hadn't actually discussed that up to this point. I said, well, I'm looking for something that's an alternative to a hotdog stand. He said, how about $10 an hour? I said, sure. That'll do. What kind of hours? He said, well, we usually start a little late, stay a little late. It'll be PHP web development. Congratulations. I got the job. Start tomorrow. I can't remember if they gave me a key or if the door was just unlocked. But either way, it was a good thing because I rolled in the next day around 9 AM, wanted to get a good start. Nobody there. I had a machine Mark had put on a table which I assumed was mine, and I started doing all my setup. Around 10. Nobody. Around 11, Mark finally came in and started telling me about the different projects we'd be working on. He had a collection of clients, each with their own specific project setup - usually PHP, sometimes a little WordPress. He'd give me the specifics and give me access to the files, sometimes through an FTP server. Usually I had to almost start from scratch on the development setup, then push up to their server once I had something running. The weird thing, though, was that I would get just one or two bugs fixed and he'd have me move on to another client. Get one or two bugs fixed, then on to a different client. Each one getting a relatively tiny amount of work. What I realized was that he was putting off all of these folks. There had previously been some developers, and I don't know how long it had been since they left, but he was scrambling to stay ahead of angry customers. It seemed like all of his clients were angry clients - over-promised and under-delivered - and I was doing just enough work on each of them to make them think progress was being made. Meanwhile, I started to get familiar with the secondary (or was it primary?) business: a nightlife lifestyle magazine operated out of the front of house. They had a couple of graphic designers, photographers, and an editor, and there was an endless stream of both beautiful people and beautiful photos and lots and lots of advertisements going into these glossy pages. They published weekly or maybe biweekly. The magazine ran on Photoshop and PageMaker. And sitting right there on that shared drive - the same drive I'd spent my trial interview getting back online - was not only all of their content, but all of their software. With clearly cracked serials. Lots of password.txt and registration_keytxt.crackz files. Lots and lots of professional-grade software, very much not paid for. It was increasingly obvious that this place operated using any means necessary to cut corners and get things out the door. The front of house was run by another guy named Marc - Marc with a C - who was in charge of the magazine. Mark with a K was in charge of the web stuff, the investor, the business partner. There was also a main layout editor who did a lot of the heavy lifting. Sometimes when I came in around 8am or 9am, he'd already be there. I'd say, you got an early start? He had not, in fact, left from the night before. Pounding energy drinks (and who knows what else). Printer deadline! Meanwhile, the biggest perk I had was a fridge full of Sobe ed: A sugary fruit drink in a glass bottle with some cool lizards; see SoBe on wikipedia. I am partial to orange Sobe, and I had an unlimited supply. They tended to play house and techno music, pretty loud, all the time. It was cool. A little weird. Had sort of a shady vibe. OK maybe very shady. Between the beautiful people in the front of the house and me stuck way in the back, this random guy who just handed me his root password as a trial interview, helping rob Peter to pay Paul in terms of software development, the heavy ad-based front business - I never really felt like I quite knew what was going on. And I didn't realize it would just keep going, getting stranger as we went all summer. Definitely more interesting than working at a hotdog stand in the mall.",{"id":4949,"title":4950,"titles":4951,"content":4952,"level":9},"\u002Ftlt-2026.05.23-imagining-the-index-01","Imagining the Index 01",[],"Imagining the Pebble Index 01.",{"id":4954,"title":45,"titles":4955,"content":45,"level":15},"\u002Ftlt-2026.05.23-imagining-the-index-01#",[4950],{"id":4957,"title":4958,"titles":4959,"content":4960,"level":15},"\u002Ftlt-2026.05.23-imagining-the-index-01#pixel-watch-2-app","Pixel Watch 2 App",[4950],"I'm trying to get the index01 workflow kinda working on my Google Pixel Watch 2. I made an app that runs on the watch and I'm trying to intercept the \"pill\" button long-press to simulate the ring's button.",{"id":4962,"title":4963,"titles":4964,"content":4965,"level":9},"\u002Ftlt-2026.08.30-ruby-for-good-2026","TLT   20260830   Ruby For Good 2026",[],"This weekend was the annual Ruby for Good event! I led the Human Essentials project and it was pretty great. We had seven people trying to do some Good by implementing some small features, fixing a few bugs, rescuing a few abandoned pull requests. It's a pretty special group of people in a way, but also I find that I surround myself with similar people when I can in every aspect of my life. I think of the folks from the Recurse Center, for example, as a pretty overlapping set of mentality and approach to the world. It's like a very intentional way of approaching things. There was also the ongoing interesting debate and fear and excitement around LLM-powered generative coding tooling like Claude Code, where people are really getting a lot of use out of it and are both excited and worried about its impact on their work and on society. It's hard to write out my thoughts here because they are somewhat nuanced, but maybe I'll give it a go in some future entries. Anyway. Fun! :)",{"id":4967,"title":4968,"titles":4969,"content":4970,"level":9},"\u002Ftalking-dc-vote-blues","Talking_DC_Vote_Blues",[],"Talking DC Vote Blues (I'm still working on the music, but it will be a talking-blues pattern for most of it). Today I saw an analysis of historical Presidential Elections and how close they\nwere. They did a mathematical analysis to determine the smallest number of\nvotes it would take to change the outcome of an election. This depends on the\npopular vote within a state, and the electoral vote between states. https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20080923000039\u002Fhttps:\u002F\u002Fwww.msu.edu\u002F~sheppa28\u002Felections.html How about some illustrations? Well the 2000 election had the smallest number of votes determine the swing...\nall in florida of course, 269 votes would have changed the outcome. In contrast, to change the results of the 1972 Nixon-McGovern election you'd\nchange votes in 26 states starting with Alaska and working your way down the\nlist. You'd have to change over 3 million votes to do it the most efficient way\npossible. So I'm looking at this site, which contains all sorts of information about\nwhich states influenced which elections and so on... and I start looking for\nDC. 'Cause I live and I vote in DC. But it's not in there. I shoot off an email\nto the author of the site, and he replies, says that the site only includes\ninformation on states that could have changed the election. Well I wrote back\nand pointed out that every single other state was in there... and that zero\npercent is still a number! Well he must've seen the light because he put DC on there. Wayyyy down at the\nbottom you can see it. 11 elections and zero influence. See the people in DC\nare a stubborn lot, and by the time you changed enough votes here to actually\nchange the overall DC vote... well you'd have already changed a whole lot of\nother states. It's not worth the effort to mess with DC's votes at all. So. In a time where people feel like their vote doesn't count. In a time where\nvoting fraud has become a mere matter of software update... and where our\nleaders seem as disconnected as ever from the will of the people.... at this\ntime when I really really want my vote to count... this is when I realize that\nmy individual vote means less than anybody else's! Taxation without representation\nBut you ain't seen nothin yet\n'cause way over in the District\nMy vote's already set Why can't we be a swing state?\nI just want to be heard,\nit's getting just a little old,\nto show the whitehouse the bird It's not that I disagree,\nIt's satisfaction that I seek,\nThe chance to make a difference,\nI want the chance to speak, So I've got a tricky plan\nto get us into play,\na little less than half of you\njust vote some other way",{"id":4972,"title":4973,"titles":4974,"content":4975,"level":9},"\u002Ftalks","Talks",[],"From time to time I give talks on various topics. Audiences range from the local Perl Monger group to larger conferences. Unfortunately for you, I prefer to do crazy things like live code demos and use minimalist slides, so you don't quite get the same effect from these records. Hopefully I can dig up some videos :)",{"id":4977,"title":4978,"titles":4979,"content":4980,"level":15},"\u002Ftalks#_2015-11-11-polyglotprogrammingdc-random-kinda","2015-11-11 PolyglotProgrammingDC Random Kinda",[4973],"Presented at Polyglot Programming DCSlides (pdf) You've probably heard the old adage \"use the best tool for the job\" many times, yet we often end up with a random blob of text on the screen that makes no sense whatsoever. Or do we?",{"id":4982,"title":4983,"titles":4984,"content":4985,"level":15},"\u002Ftalks#_2015-10-07-polyglotprogrammingdc-http-adapters","2015-10-07 PolyglotProgrammingDC HTTP Adapters",[4973],"Presented at Polyglot Programming DCSlides (pdf) Survey and Philosophy of HTTP Adapter Layers. Overview of a technique for connecting your program to serving web pages. Rack, Ring, PSGI, WSGI, Clack, ...",{"id":4987,"title":4988,"titles":4989,"content":4990,"level":15},"\u002Ftalks#_2015-09-15-clojuredc-nrepl-looper","2015-09-15 ClojureDC nREPL Looper",[4973],"Presented at ClojureDCSlides (pdf)https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLive_looping - Info on live loopinghttps:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fnrepl-looper - Project source code A guitar-looper-pedal-like-thing for your REPL! I present my ongoing project, experimenting with recording console commands along with their timing, and then playing them back in a loop. We can use Overtone (sound) events as a good example, simulating a looper-pedal but feeding it commands instead of audio. We'll touch upon a variety of topics as part of the walk through, from beginner to advanced!",{"id":4992,"title":4993,"titles":4994,"content":4995,"level":15},"\u002Ftalks#_2015-06-14-rubynation-polyglot-bridges","2015-06-14 RubyNation Polyglot Bridges",[4973],"Lightning talk at RubyNationRelated blog post TLT - 2015.06.04 - Polyglot BridgesSlides (pdf) Python has a fantastic plotting library, matplotlib.pyplot. I show how I used it from Perl6\u002FRakudo and Ruby. You should join me in Polyglot Bridge Building!",{"id":4997,"title":4998,"titles":4999,"content":5000,"level":15},"\u002Ftalks#_2015-04-11-dcbpw-rakudo","2015-04-11 DCBPW Rakudo",[4973],"Slides (pdf) Rakudo is an implementation of Perl6 that is increasingly usable in the Real World. I give an overview of the language and then show how I'm using it in my $HOME\u002Fbin scripts.",{"id":5002,"title":5003,"titles":5004,"content":5005,"level":15},"\u002Ftalks#_2015-02-19-optoro-how-webpages-work","2015-02-19 Optoro How Webpages Work",[4973],"Presented at Optoro company lunchSlides (pdf) Walking through the life of a webpage, we see that browsers assume everything is a document and servers lie when generating dynamic content!",{"id":5007,"title":5008,"titles":5009,"content":5010,"level":15},"\u002Ftalks#_2015-02-11-ppdc-language-implementation","2015-02-11 PPDC Language Implementation",[4973],"Presented at Polyglot Programming DCSlides (pdf) Implementing a language is fun! Here I walk through the \"full stack\" briefly, and then we implement a really horrible interpreter. Then a compiler.",{"id":5012,"title":5013,"titles":5014,"content":5015,"level":15},"\u002Ftalks#_2014-11-17-rubyconf-time-travel-debugging","2014-11-17 RubyConf Time Travel Debugging",[4973],"Slides (pdf) Leveraging the power of fork()ing the universe, I demonstrate a Pry plugin that allows traveling between the timeline multiverse! [YouTube:EpYMRd1ZWDM](\u002F",{"id":5017,"title":5018,"titles":5019,"content":5020,"level":15},"\u002Ftalks#_2014-07-01-ppdc-rakudo","2014-07-01 PPDC Rakudo",[4973],"Slides (pdf) There is a new and awesome language implementation -- Rakudo! I go over a few standard, interesting, and insane bits of this dynamic, multi-dispatch, gradually-typed, .... (moar buzzwords)... language.",{"id":5022,"title":5023,"titles":5024,"content":5025,"level":15},"\u002Ftalks#_2014-06-11-arlingtonruby-time-travel-debugging","2014-06-11 ArlingtonRuby Time Travel Debugging",[4973],"Slides (pdf) Leveraging the power of fork()ing the universe, I demonstrate a Pry plugin that allows traveling between the timeline multiverse!",{"id":5027,"title":5028,"titles":5029,"content":5030,"level":15},"\u002Ftalks#_2014-06-07-rubynation-time-travel-debugging","2014-06-07 RubyNation Time Travel Debugging",[4973],"Lightning talk presented at RubyNationSlides (pdf) Leveraging the power of fork()ing the universe, I demonstrate a Pry plugin that allows traveling between the timeline multiverse!",{"id":5032,"title":5033,"titles":5034,"content":5035,"level":15},"\u002Ftalks#_2014-05-03-dcbpw-state-in-clojure","2014-05-03 DCBPW State in Clojure",[4973],"Slides (pdf) Concurrent state is pretty carefully controlled in Clojure. Here I talk about what that means and what we can learn from it.",{"id":5037,"title":5038,"titles":5039,"content":5040,"level":15},"\u002Ftalks#basic-angularjs","Basic AngularJS",[4973],"Presented at YAPC::NA 2013Introduction to AngularJS, almost entirely to force me to learn it. [YouTube:VdB4SUCsmsU](\u002F",{"id":5042,"title":2271,"titles":5043,"content":5044,"level":15},"\u002Ftalks#noisegen",[4973],"Presented at: Arlington Ruby 2012.05.30SlidesSource Code I present a simple generator-based sound synthesizer. This is basically the same as the talk I'm going to give at YAPC::NA 2012. [YouTube:pMZ4ilLzKW8](\u002F",{"id":5046,"title":5047,"titles":5048,"content":5049,"level":15},"\u002Ftalks#introduction-to-debugging-perl","Introduction to Debugging Perl",[4973],"DCBPW 2012More talk about Science!",{"id":5051,"title":5052,"titles":5053,"content":5054,"level":15},"\u002Ftalks#art-and-science-of-debugging","Art and Science of Debugging",[4973],"PPW 2011Lots of talk about Science!",{"id":5056,"title":5057,"titles":5058,"content":5059,"level":15},"\u002Ftalks#testing-the-interactive-web","Testing The Interactive Web",[4973],"Presented at: Orlando Perl Workshop (Perl Oasis) 2011.01.15Source CodeVideo recording of the presentation In this talk, I will teach the audience the basics of using WWW::HtmlUnit (and WWW::HtmlUnit::Sweet) for scraping and testing javascript-required web applications. We'll go over installation, basic usage, and some real-world examples. The WWW::HtmlUnit module uses the java-based HtmlUnit library, which itself builds off of a suite of libraries including Rhino to simulate a web browser. Among many other useful features, it can execute complex javascript -- it passes the jQuery test suite perfectly, for example. Bringing that power to Perl has allowed developers to go well beyond what WWW::Mechanize can simulate, while avoiding the overhead of a full Selenium setup.",{"id":5061,"title":5062,"titles":5063,"content":5064,"level":15},"\u002Ftalks#read-eval-play-loop","Read Eval PLAY Loop",[4973],"Presented at: PPW 2010.10.10Slides (pdf) Harking back to the days of yore, in this talk we seek to reclaim that elusive touchpoint between man and machine. That spot oh so sweet wherein you type out magic incantations and watch as the figures on the screen flash and bounce, obeying your every whim... line and color meet, curving and spinning into a rainbow star of power and mystery!",{"id":5066,"title":5067,"titles":5068,"content":5069,"level":15},"\u002Ftalks#wwwhtmlunit-perl-interface-to-the-java-library","WWW::HtmlUnit - Perl Interface to the Java library",[4973],"Presented at: YAPC::NA 2009.06.24Source Code The mighty WWW::Mechanize is fantastic... right up until you have to deal with some javascript. The HtmlUnit project has build on the Mozilla Rhino engine to create a browser agent that works even against complex javascript. It passes the JQuery test suite, as an example of it's powers. We will present the Perl interface to the HtmlUnit library, setting you on the path to scraping and testing those javascript-dependent sites that you've being eying for so long.",{"id":5071,"title":5072,"titles":5073,"content":5074,"level":15},"\u002Ftalks#a-web-based-inspector-for-cgi-perl-applications","A Web-Based Inspector for (CGI?) Perl Applications",[4973],"Presented at: YAPC::NA 2009.06.24Source Code One 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. I'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! In 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.",{"id":5076,"title":5077,"titles":5078,"content":5079,"level":15},"\u002Ftalks#abstracting-the-web-request-cycle-with-continuity","Abstracting the Web Request Cycle With Continuity",[4973],"Presented at: YAPC::NA 2008Source Code",{"id":5081,"title":5082,"titles":5083,"content":5084,"level":15},"\u002Ftalks#introduction-to-continuity","Introduction to Continuity",[4973],"Presented at: Pittsburgh Perl Workshop 2007 - October 2007Slides (pdf)",{"id":5086,"title":5087,"titles":5088,"content":5089,"level":15},"\u002Ftalks#contize-php","Contize (PHP)",[4973],"Presented at: Desert Code Camp \u002F AzPHP - May 2006Slides (S5 HTML)",{"id":5091,"title":5092,"titles":5093,"content":5094,"level":15},"\u002Ftalks#introduction-to-modular-programming-in-perl","Introduction to Modular Programming in Perl",[4973],"Presented at: Phoenix Perl Mongers - September 2005Slides (OO-Impres, .sxi)",{"id":5096,"title":5097,"titles":5098,"content":5099,"level":15},"\u002Ftalks#contize-perl","Contize (Perl)",[4973],"Presented at: Phoenix Perl Mongers - August 2004Slides (pdf)",{"id":5101,"title":5102,"titles":5103,"content":5104,"level":15},"\u002Ftalks#web-application-techniques","Web Application Techniques",[4973],"Presented at: Linux Users of Northern ArizonaSlides (OO Impress, .oop)",{"id":5106,"title":5107,"titles":5108,"content":5109,"level":9},"\u002Ftestoid","TestOid",[],"digraph G {rankdir=\"LR\" edge [fontname=\"Courier\",fontsize=\"10\"] node [style=\"filled\",color=\"#000000\",fillcolor=\"#ffffe0\",fontname=\"Courier\",fontsize=\"10\"] \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#hasArticle\" [label=\"smw:hasArticle\" ]; \"http:\u002F\u002Fwww.w3.org\u002F2002\u002F07\u002Fowl#AnnotationProperty\" [label=\"owl:AnnotationProperty\" ]; \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#hasType\" [label=\"smw:hasType\" ]; \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#Thing\" [label=\"smw:Thing\" ]; \"http:\u002F\u002Fwww.w3.org\u002F2002\u002F07\u002Fowl#Class\" [label=\"owl:Class\" ]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" [label=\"wiki:Semiotic_web\" ]; \"literal0\" [label=\"Semiotic web\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ACommunityWiki\" [label=\"wiki:Category-3ACommunityWiki\" ]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ACybernetics\" [label=\"wiki:Category-3ACybernetics\" ]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASam_Rose\" [label=\"wiki:Category-3ASam_Rose\" ]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemantic_web\" [label=\"wiki:Category-3ASemantic_web\" ]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemantics\" [label=\"wiki:Category-3ASemantics\" ]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemiotic_web\" [label=\"wiki:Category-3ASemiotic_web\" ]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemiotics\" [label=\"wiki:Category-3ASemiotics\" ]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSigns\" [label=\"wiki:Signs\" ]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSymbols\" [label=\"wiki:Symbols\" ]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRepresentamen\" [label=\"wiki:Representamen\" ]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FInterpretant\" [label=\"wiki:Interpretant\" ]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FObject\" [label=\"wiki:Object\" ]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FWorld_Wide_Web\" [label=\"wiki:World_Wide_Web\" ]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FIntelligent_agents\" [label=\"wiki:Intelligent_agents\" ]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotics\" [label=\"wiki:Semiotics\" ]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiosis\" [label=\"wiki:Semiosis\" ]; \"literal1\" [label=\"Category:CommunityWiki\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"literal2\" [label=\"Category:Cybernetics\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"literal3\" [label=\"Category:Sam Rose\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"literal4\" [label=\"Category:Semantic web\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"literal5\" [label=\"Category:Semantics\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"literal6\" [label=\"Category:Semiotic web\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"literal7\" [label=\"Category:Semiotics\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AContains_the_property\" [label=\"wiki:Relation-3AContains_the_property\" ]; \"http:\u002F\u002Fwww.w3.org\u002F2002\u002F07\u002Fowl#ObjectProperty\" [label=\"owl:ObjectProperty\" ]; \"literal8\" [label=\"Relation:Contains the property\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"literal9\" [label=\"Signs\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"literal10\" [label=\"Symbols\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"literal11\" [label=\"Representamen\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"literal12\" [label=\"Interpretant\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"literal13\" [label=\"Object\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AIs_enabled_by\" [label=\"wiki:Relation-3AIs_enabled_by\" ]; \"literal14\" [label=\"Relation:Is enabled by\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"literal15\" [label=\"World Wide Web\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"literal16\" [label=\"Intelligent agents\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AIs_theoretically_based_in\" [label=\"wiki:Relation-3AIs_theoretically_based_in\" ]; \"literal17\" [label=\"Relation:Is theoretically based in\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"literal18\" [label=\"Semiotics\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AOriginates_from\" [label=\"wiki:Relation-3AOriginates_from\" ]; \"literal19\" [label=\"Relation:Originates from\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"literal20\" [label=\"Semiosis\" shape=\"box\",style=\"filled\",color=\"#000000\",fillcolor=palegreen,fontname=\"Courier\",fontsize=\"10\"]; \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#hasArticle\" -> \"http:\u002F\u002Fwww.w3.org\u002F2002\u002F07\u002Fowl#AnnotationProperty\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#hasArticle\" -> \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#hasType\" -> \"http:\u002F\u002Fwww.w3.org\u002F2002\u002F07\u002Fowl#AnnotationProperty\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#hasType\" -> \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#Thing\" -> \"http:\u002F\u002Fwww.w3.org\u002F2002\u002F07\u002Fowl#Class\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#Thing\" -> \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#Thing\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"literal0\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Semiotic_web\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FSemiotic_web\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ACommunityWiki\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ACybernetics\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASam_Rose\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemantic_web\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemantics\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemiotic_web\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemiotics\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSigns\" [label=\"wiki:Relation-3AContains_the_property\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSymbols\" [label=\"wiki:Relation-3AContains_the_property\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRepresentamen\" [label=\"wiki:Relation-3AContains_the_property\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FInterpretant\" [label=\"wiki:Relation-3AContains_the_property\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FObject\" [label=\"wiki:Relation-3AContains_the_property\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FWorld_Wide_Web\" [label=\"wiki:Relation-3AIs_enabled_by\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FIntelligent_agents\" [label=\"wiki:Relation-3AIs_enabled_by\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotics\" [label=\"wiki:Relation-3AIs_theoretically_based_in\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotics\" [label=\"wiki:Relation-3AOriginates_from\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotic_web\" -> \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiosis\" [label=\"wiki:Relation-3AOriginates_from\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ACommunityWiki\" -> \"http:\u002F\u002Fwww.w3.org\u002F2002\u002F07\u002Fowl#Class\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ACommunityWiki\" -> \"literal1\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ACommunityWiki\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Category:CommunityWiki\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ACommunityWiki\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FCategory:CommunityWiki\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ACybernetics\" -> \"http:\u002F\u002Fwww.w3.org\u002F2002\u002F07\u002Fowl#Class\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ACybernetics\" -> \"literal2\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ACybernetics\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Category:Cybernetics\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ACybernetics\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FCategory:Cybernetics\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASam_Rose\" -> \"http:\u002F\u002Fwww.w3.org\u002F2002\u002F07\u002Fowl#Class\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASam_Rose\" -> \"literal3\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASam_Rose\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Category:Sam_Rose\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASam_Rose\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FCategory:Sam_Rose\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemantic_web\" -> \"http:\u002F\u002Fwww.w3.org\u002F2002\u002F07\u002Fowl#Class\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemantic_web\" -> \"literal4\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemantic_web\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Category:Semantic_web\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemantic_web\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FCategory:Semantic_web\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemantics\" -> \"http:\u002F\u002Fwww.w3.org\u002F2002\u002F07\u002Fowl#Class\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemantics\" -> \"literal5\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemantics\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Category:Semantics\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemantics\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FCategory:Semantics\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemiotic_web\" -> \"http:\u002F\u002Fwww.w3.org\u002F2002\u002F07\u002Fowl#Class\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemiotic_web\" -> \"literal6\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemiotic_web\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Category:Semiotic_web\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemiotic_web\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FCategory:Semiotic_web\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemiotics\" -> \"http:\u002F\u002Fwww.w3.org\u002F2002\u002F07\u002Fowl#Class\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemiotics\" -> \"literal7\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemiotics\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Category:Semiotics\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FCategory-3ASemiotics\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FCategory:Semiotics\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AContains_the_property\" -> \"http:\u002F\u002Fwww.w3.org\u002F2002\u002F07\u002Fowl#ObjectProperty\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AContains_the_property\" -> \"literal8\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AContains_the_property\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Relation:Contains_the_property\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AContains_the_property\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FRelation:Contains_the_property\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSigns\" -> \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#Thing\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSigns\" -> \"literal9\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSigns\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Signs\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSigns\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FSigns\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSymbols\" -> \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#Thing\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSymbols\" -> \"literal10\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSymbols\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Symbols\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSymbols\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FSymbols\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRepresentamen\" -> \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#Thing\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRepresentamen\" -> \"literal11\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRepresentamen\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Representamen\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRepresentamen\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FRepresentamen\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FInterpretant\" -> \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#Thing\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FInterpretant\" -> \"literal12\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FInterpretant\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Interpretant\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FInterpretant\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FInterpretant\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FObject\" -> \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#Thing\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FObject\" -> \"literal13\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FObject\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Object\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FObject\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FObject\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AIs_enabled_by\" -> \"http:\u002F\u002Fwww.w3.org\u002F2002\u002F07\u002Fowl#ObjectProperty\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AIs_enabled_by\" -> \"literal14\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AIs_enabled_by\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Relation:Is_enabled_by\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AIs_enabled_by\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FRelation:Is_enabled_by\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FWorld_Wide_Web\" -> \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#Thing\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FWorld_Wide_Web\" -> \"literal15\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FWorld_Wide_Web\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=World_Wide_Web\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FWorld_Wide_Web\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FWorld_Wide_Web\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FIntelligent_agents\" -> \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#Thing\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FIntelligent_agents\" -> \"literal16\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FIntelligent_agents\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Intelligent_agents\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FIntelligent_agents\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FIntelligent_agents\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AIs_theoretically_based_in\" -> \"http:\u002F\u002Fwww.w3.org\u002F2002\u002F07\u002Fowl#ObjectProperty\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AIs_theoretically_based_in\" -> \"literal17\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AIs_theoretically_based_in\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Relation:Is_theoretically_based_in\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AIs_theoretically_based_in\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FRelation:Is_theoretically_based_in\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotics\" -> \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#Thing\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotics\" -> \"literal18\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotics\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Semiotics\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiotics\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FSemiotics\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AOriginates_from\" -> \"http:\u002F\u002Fwww.w3.org\u002F2002\u002F07\u002Fowl#ObjectProperty\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AOriginates_from\" -> \"literal19\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AOriginates_from\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Relation:Originates_from\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FRelation-3AOriginates_from\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FRelation:Originates_from\" [label=\"rdfs:isDefinedBy\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiosis\" -> \"http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#Thing\" [label=\"rdf:type\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiosis\" -> \"literal20\" [label=\"rdfs:label\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiosis\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Semiosis\" [label=\"smw:hasArticle\"]; \"http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002FSemiosis\" -> \"http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FSemiosis\" [label=\"rdfs:isDefinedBy\"]; struct [shape=Mrecord,label=\"{ { Base URI: http:\u002F\u002Fsocialsynergyweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:ExportRDF\u002FSemiotic%2Bweb# } | { { smw|rdf|owl|rdfs|wiki } | { http:\u002F\u002Fsmw.ontoware.org\u002F2005\u002Fsmw#|http:\u002F\u002Fwww.w3.org\u002F1999\u002F02\u002F22-rdf-syntax-ns#|http:\u002F\u002Fwww.w3.org\u002F2002\u002F07\u002Fowl#|http:\u002F\u002Fwww.w3.org\u002F2000\u002F01\u002Frdf-schema#|http:\u002F\u002Fsocialsyenrgweb.com\u002Fsemanticwiki\u002Findex.php?title=Special:URIResolver\u002F } } } \",fontname=\"Courier\",fontsize=\"8\",color=\"#BBBBBB\"]; vocabulary [style=invis]; struct -> vocabulary [style=invis]; }",{"id":5111,"title":5112,"titles":5113,"content":45,"level":9},"\u002Fteststicky1","TestSticky1",[],{"id":5115,"title":5116,"titles":5117,"content":5118,"level":15},"\u002Fteststicky1#hello","Hello!",[5112],"my friend! Fun times. zippidee doo dah I can edit two notes happy happy joy joy booya!",{"id":5120,"title":5121,"titles":5122,"content":5123,"level":9},"\u002Fteststicky2","TestSticky2",[],"second sticky test page! My oh my... I do love Wikiness!",{"id":5125,"title":5126,"titles":5127,"content":5128,"level":15},"\u002Fteststicky2#hmm","hmm",[5121],"Check out my Projects page. in the same tiem?",{"id":5130,"title":5131,"titles":5132,"content":5133,"level":9},"\u002Fteststickylist","TestStickyList",[],"TestSticky1 662,120 251x379 TestSticky2 343,267 299x310 TestSticky3 65,65 200x200 test1 352,53 172x154 testcool 578,53 200x200",{"id":5135,"title":5136,"titles":5137,"content":5138,"level":9},"\u002Ftext-formatting-rules","Text_Formatting_Rules",[],"The most important rules are very simple:",{"id":5140,"title":5141,"titles":5142,"content":45,"level":9},"\u002Ftext-formatting-rules#empty-lines-separate-paragraphs","Empty lines separate paragraphs.",[],{"id":5144,"title":5145,"titles":5146,"content":45,"level":9},"\u002Ftext-formatting-rules#paragraphs-may-span-several-lines","Paragraphs may span several lines.",[],{"id":5148,"title":5149,"titles":5150,"content":5151,"level":9},"\u002Ftext-formatting-rules#paragraphs-begin-in-column-1","Paragraphs begin in column 1.",[],"'''With these three simple rules, you can already start writing text.'''",{"id":5153,"title":5154,"titles":5155,"content":5156,"level":15},"\u002Ftext-formatting-rules#local-links","Local Links",[5149],"Local pages are linked using various link patterns. See Link Pattern for how to enable and disable some of the features,\nif you have access to the config file. '''Words in double square brackets are links to local\npages.'''  These square brackets will not be rendered if the page\nexists, since this links to a local page. Result: Text Formatting Rules '''CamelCase words are the traditional links to local pages.''' Example: Result: (disabled on this wiki)",{"id":5158,"title":5159,"titles":5160,"content":5161,"level":15},"\u002Ftext-formatting-rules#urls","URLs",[5149],"'''Plain URLs get hyperlinked.''' Example: Result: http:\u002F\u002Fwww.emacswiki.org\u002F '''Plain URLs ending in an image suffix will inline the image'''. Example: Result: http:\u002F\u002Fwww.emacswiki.org\u002Femacs_logo.png '''Plain URLs in square brackets turn into numbered links, looking like\nfootnotes.''' Example: Result: (disabled on this wiki)",{"id":5163,"title":5164,"titles":5165,"content":5166,"level":15},"\u002Ftext-formatting-rules#bullet-list","Bullet List",[5149],"'''List items start with one or more asterisks (*).'''  The number of\nasterisks indicates the indentation level.\nAn empty line ends the list. Example: Result: One itemAnother item\nOne More",{"id":5168,"title":5169,"titles":5170,"content":5171,"level":15},"\u002Ftext-formatting-rules#numbered-list","Numbered List",[5149],"'''Numbered list items start with one or more hashes (#).'''\nThe number of hashes indicates the indentation level.\nAn empty line ends the list. Example: Result:",{"id":5173,"title":5174,"titles":5175,"content":45,"level":9},"\u002Ftext-formatting-rules#one-item","One item",[],{"id":5177,"title":5178,"titles":5179,"content":45,"level":9},"\u002Ftext-formatting-rules#another-item","Another item",[],{"id":5181,"title":5182,"titles":5183,"content":45,"level":15},"\u002Ftext-formatting-rules#one-more","One More",[5178],{"id":5185,"title":5186,"titles":5187,"content":5188,"level":15},"\u002Ftext-formatting-rules#definition-list","Definition List",[5178],"'''Definition lists start with a semicolon (;), and a colon (:) between term and definition.'''  The number of semicolons indicates the indentation level.\nAn empty line ends the list. Example: Result: foo: a generic placeholder bar: a generic placeholder ;baz: a variation",{"id":5190,"title":5191,"titles":5192,"content":5193,"level":15},"\u002Ftext-formatting-rules#tables","Tables",[5178],"'''Table rows start and end with two vertical bars (||), with two\nvertical bars between cells.'''  Empty cells fuse with the next cell;\nin other words, ||||bar|| is a table row with a cell spanning two columns. Example: Result: ||foo||bar||\n||||bar||",{"id":5195,"title":5196,"titles":5197,"content":5198,"level":15},"\u002Ftext-formatting-rules#indented-paragraphs","Indented Paragraphs",[5178],"'''Indented paragraphs start with one or more colons (:).'''\nThe number of colons indicates the indentation level.\nAn empty line ends the indented paragraph. Example: Result: : One item\n: Another item\n:: One More",{"id":5200,"title":5201,"titles":5202,"content":5203,"level":15},"\u002Ftext-formatting-rules#headings","Headings",[5178],"'''Headings are enclosed in equal signs (=) on a line of their own.'''\nYou can use up to six equal signs to produce headers of level one to\nsix.  Level one is the most important one, and should not be used\nbecause the page title already uses a level one heading.  Using two\nor three equal signs is recommended (== like this ==). Example: Result:",{"id":5205,"title":5206,"titles":5207,"content":45,"level":56},"\u002Ftext-formatting-rules#heading-3","Heading 3",[5178,5201],{"id":5209,"title":5210,"titles":5211,"content":45,"level":5212},"\u002Ftext-formatting-rules#heading-4","Heading 4",[5178,5201,5206],4,{"id":5214,"title":5215,"titles":5216,"content":5217,"level":15},"\u002Ftext-formatting-rules#horizontal-line","Horizontal line",[5178],"'''Four or more consecutive hyphens on a line of their own (----) are\nreplaced with a horizontal line.''' Example: Result:",{"id":5219,"title":5220,"titles":5221,"content":5222,"level":15},"\u002Ftext-formatting-rules#source-code","Source code",[5178],"'''Lines starting with spaces are shown using a fixed width font with\nwhitespace preserved.'''  I suggest to use uniform indentation of\nfour spaces. Example: Result:",{"id":5224,"title":5225,"titles":5226,"content":5227,"level":15},"\u002Ftext-formatting-rules#traditional-wiki-markup","Traditional wiki markup",[5178],"'''Two and three apostrophes are used for emphasis and strong emphasis'''. Example: Result: ''two apostrophes'' and '''three apostrophes'''",{"id":5229,"title":5230,"titles":5231,"content":5232,"level":15},"\u002Ftext-formatting-rules#html-tags","HTML tags",[5178],"'''Some HTML tags are also allowed.'''\nThese tags are used exactly like HTML tags. Example: Result: this will be bold Supported tags without extra configuration: em: Emphasis (usually italics) i: Italics strong: Strong (usually bold) b: Bold tt: Teletype (usually monospaced) See HTML.",{"id":5234,"title":5235,"titles":5236,"content":5237,"level":15},"\u002Ftext-formatting-rules#disable-text-formatting-rules","Disable Text Formatting Rules",[5178],"The following tags will '''disable text formatting rules''': nowiki: disable text formatting rules code: monospaced font, disable text formatting rules pre: monospaced fonts, no line wrapping, disable text formatting rules Example: Result:",{"id":5239,"title":5240,"titles":5241,"content":5242,"level":9},"\u002Fthe-fridge","The_Fridge",[],"Ideas: Multiple fridges. Anyone can create a fridge, and it gets a passwordFridges expire after n days of disuseFridges get options\nPublic\u002FPrivate fridges (by view-password)Limit to the number of words. When you get >n words, the first word would disappear So the front page would be a list of fridges Modes: View fridge listCreate fridge -- fridge name, owner passwordFridge preferences -- private password, word-limitFridge itself -- manipulate the fridge!",{"id":5244,"title":5245,"titles":5246,"content":5247,"level":9},"\u002Fthe-haiku-game","The_Haiku_Game",[],"We pick a random object or topic for the other person to write a haiku. Ode to Duane (Beth, 2006)\nThe Idaho wolf\ntracked down and killed with big guns\nrepresents sadness Ode to Duane II (Brock, 2006)\nSolitary tear\ntrickle down the snake river\ngrey wolf with its cub Summertime (Beth, 2006)\nsun glaring red dawn\nacross the glistening desert\nsummertime has come Go Board (Brock, 2006)\nintersecting lines\nblack white stones dance together\nenemies no more Bunny (Beth, 2006)\nsoft pillow lightness\nbouncing by as life's comic clown\ngoodluck paw all love woozle (Brock, 2006)\nvibrating in fear\nsqueal for the touch of the one\nunrequited love Chai Frappe (Beth, 2006.05.12)\nchai frappe flows down\nthe open mouths of fools in big love\nas death waits next door Vegan cookie wrapper (Brock, 2006.05.12)\nvegan cookie wrap\nearth inside warm and gooey\noutside is earth blood Whipped Cream (Mandie, 2006.05.13)\nwhipped cream is fluffy\nlike freshly fallen white snow\nbunny likes sugar",{"id":5249,"title":5250,"titles":5251,"content":5252,"level":9},"\u002Fthe-lack-thereof","The_Lack_Thereof",[],"This is just a stub page so that I could get a comment page of the same name.",{"id":5254,"title":5255,"titles":5256,"content":5257,"level":9},"\u002Fthe-presidents-of-the-united-states-of-america","The_Presidents_of_the_United_States_of_America",[],"One of my favorite bands.",{"id":5259,"title":5260,"titles":5261,"content":5262,"level":9},"\u002Fthe-sociopath-in-all-of-us","The_Sociopath_In_All_Of_Us",[],"(work in progress)",{"id":5264,"title":5265,"titles":5266,"content":5267,"level":15},"\u002Fthe-sociopath-in-all-of-us#how-do-we-change-ourselves","How do we change ourselves?",[5260],"Most of us want to change, to improve ourselves in one way or another. We want to be healthier, smarter, more successful, more friends, less pain. Sometimes when faced with difficult situations we find ourselves falling apart instead of pulling together. Or maybe its as simple as wanting to not be late to every event... late to our own funerals. The media wants us to change, to become thin and beautiful and rich. Nobody is perfect, but we all seek perfection. Of course, I say most but not all. Some of us seem content with their current existence. They live with their imperfection and so in their own way have reached a peaceful state. Balance. I don't wish to address them now, however. I imagine that we are all composed of three beings. Contemplating my own mind I see that there are many more than three, many voices and selves dancing inside of my head. But I wish to talk about three very important parts of the self. They are the outward-self, the sociopath, and the inward-self. The outward-self is what others see when they look at me. They see the things I do, they hear the things I say. They read my writing. Based on this they construct their own mental image of me, my likes and dislikes, my motivations. The inward-self is what I really think. I look at people, I judge them. I decide that the things they do are correct or mistakes. Whether they are pretty or ugly, intelligent or unintelligent. This is where my mental model of the world lives, where I objectify my world and decide how things really are or how they should be. My true emotions live here -- my happiness and hurt. Things which sometimes I don't care to share with those in my surroundings. And then there is the sociopath. The sociopath manages the outward-self. When there is a slip of the tongue and I say something that I didn't want to be heard, that is the sociopath doing a poor job. The sociopath decides what is appropriate to share and what is not. Manipulation of situations, conversations, of people. Trying to control the outward-self so that the inward-self gets what is truly desired.",{"id":5269,"title":5270,"titles":5271,"content":5272,"level":9},"\u002Fthe-star-thrower","The Star Thrower (Loren Eiseley)",[],"Editor Note: This piece is by Loren Eiseley, 1969. Published in The Unexpected Universe. Transcribed here from a PDF scan I found. Who is the man walking in the Way?\nAn eye glaring in the skull.-SECCHO It has ever been my lot, though formally myself a teacher, to be taught surely by none. There are times when I have thought to read lessons in the sky, or in books, or from the behavior of my fellows, but in the end my perceptions have frequently been inadequate or betrayed. Nevertheless, I venture to say that of what man may be I have caught a fugitive glimpse, not among multitudes of men, but along an endless wave-beaten coast at dawn. As always, there is this apparent break, this rift in nature, before the insight comes. The terrible question has to translate itself into an even more terrifying freedom. If there is any meaning to this book, it began on the beaches of Costabel with just such a leap across an unknown abyss. It began, if I may borrow the expression from a Buddhist sage, with the skull and the eye. I was the skull. I was the inhumanly stripped skeleton without voice, without hope, wandering alone upon the shores of the world. I was devoid of pity, because pity implies hope. There was, in this desiccated skull, only an eye like a pharos light, a beacon, a search beam revolving endlessly in sunless noonday or black night. Ideas like swarms of insects rose to the beam, but the light consumed them. Upon that shore meaning had ceased. There were only the dead skull and the revolving eye. With such an eye, some have said, science looks upon the world. I do not know. I know only that I was the skull of emptiness and the endlessly revolving light without pity. Once, in a dingy restaurant in the town, I had heard a woman say: \"My father reads a goose bone for the weather.\" A modern primitive, I had thought, a diviner, using a method older than Stonehenge, as old as the arctic forests. \"And where does he do that?\" the woman's companion had asked amusedly. \"In Costabel,\" she answered complacently, \"in Costabel.\" The voice came back and buzzed faintly for a moment in the dark under the revolving eye. It did not make sense, but nothing in Costabel made sense. Perhaps that was why I had finally found myself in Costabel. Perhaps all men are destined at some time to arrive there as I did. I had come by quite ordinary means, but I was still the skull with the eye. I concealed myself beneath a fisherman's cap and sunglasses, so that I looked like everyone else on the beach. This is the way things are managed in Costabel. It is on the shore that the revolving eye begins its beam and the whispers rise in the empty darkness of the skull. The beaches of Costabel are littered with the debris of life. Shells are cast up in windrows; a hermit crab, fumbling for a new home in the depths, is tossed naked ashore, where the waiting gulls cut him to pieces. Along the strip of wet sand that marks the ebbing and flowing of the tide death walks hugely and in many forms. Even the torn fragments of green sponge yield bits of scrambling life striving to return to the great mother that has nourished and protected them. In the end the sea rejects its offspring. They cannot fight their way home through the surf which casts them repeatedly back upon the shore. The tiny breathing pores of starfish are stuffed with sand. The rising sun shrivels the mucilaginous bodies of the unprotected. The seabeach and its endless war are soundless. Nothing screams but the gulls. In the night, particularly in the tourist season, or during great storms, one can observe another vulturine activity. One can see, in the hour before dawn on the ebb tide, electric torches bobbing like fireflies along the beach. It is the sign of the professional shellers seeking to outrun and anticipate their less aggressive neighbors. A kind of greedy madness sweeps over the competing collectors. After a storm one can see them hurrying along with bundles of gathered starfish, or, toppling and overburdened, clutching bags of living shells whose hidden occupants will be slowly cooked and dissolved in the outdoor kettles provided by the resort hotels for the cleaning of specimens. Following one such episode I met the star thrower. As soon as the ebb was flowing, as soon as I could make out in my sleeplessness the flashlights on the beach, I arose and dressed in the dark. As I came down the steps to the shore I could hear the deeper rumble of the surf. A gaping hole filled with churning sand had cut sharply into the breakwater. Flying sand as light as powder coated every exposed object like snow. I made my way around the altered edges of the cove and proceeded on my morning walk up the shore. Now and then a stooping figure moved in the gloom or a rain squall swept past me with light pattering steps. There was a faint sense of coming light somewhere behind me in the east. Soon I began to make out objects, upended timbers, conch shells, sea wrack wrenched from the far-out kelp forests. A pink-clawed crab encased in a green cup of sponge lay sprawling where the waves had tossed him. Long-limbed starfish were strewn everywhere, as though the night sky had showered down. I paused once briefly. A small octopus, its beautiful dark-lensed eyes bleared with sand, gazed up at me from a ragged bundle of tentacles. I hesitated, and touched it briefly with my foot. It was dead. I paced on once more before the spreading whitecaps of the surf. The shore grew steeper, the sound of the sea heavier and more menacing, as I rounded a bluff into the full blast of the offshore wind. I was away from the shellers now and strode more rapidly over the wet sand that effaced my footprints. Around the next point there might be a refuge from the wind. The sun behind me was pressing upward at the horizon's rim -- an ominous red glare amidst the tumbling blackness of the clouds. Ahead of me, over the projecting point, a gigantic rainbow of incredible perfection had sprung shimmering into existence. Somewhere toward its foot I discerned a human figure standing, as it seemed to me, within the rainbow, though unconscious of his position. He was gazing fixedly at something in the sand. Eventually he stooped and flung the object beyond the breaking surf. I labored toward him over a half mile of uncertain footing. By the time I reached him the rainbow had receded ahead of us, but something of its color still ran hastily in many changing lights across his features. He was starting to kneel again. In a pool of sand and silt a starfish had thrust its arms up stiffly and was holding its body away from the stifling mud. \"It's still alive,\" I ventured. \"Yes,\" he said, and with a quick yet gentle movement he picked up the star and spun it over my head and far out into the sea. It sank in a burst of spume, and the waters roared once more. \"It may live,\" he said, \"if the offshore pull is strong enough.\" He spoke gently, and across his bronzed worn face the light still came and went in subtly altering colors. \"There are not many come this far,\" I said, groping in a sudden embarrassment for words. \"Do you collect?\" \"Only like this,\" he said softly, gesturing amidst the wreckage of the shore. \"And only for the living.\" He stooped again, oblivious of my curiosity, and skipped another star neatly across the water. \"The stars,\" he said, \"throw well. One can help them.\" He looked full at me with a faint question kindling in his eyes, which seemed to take on the far depths of the sea. \"I do not collect,\" I said uncomfortably, the wind beating at my garments. \"Neither the living nor the dead. I gave it up a long time ago. Death is the only successful collector.\" I could feel the full night blackness in my skull and the terrible eye resuming its indifferent journey. I nodded and walked away, leaving him there upon the dune with that great rainbow ranging up the sky behind him. I turned as I neared a bend in the coast and saw him toss another star, skimming it skillfully far out over the ravening and tumultuous water. For a moment, in the changing light, the sower appeared magnified, as though casting larger stars upon some greater sea. He had, at any rate, the posture of a god. But again the eye, the cold world-shriveling eye, began its inevitable circling in my skull. He is a man, I considered sharply, bringing my thought to rest. The star thrower is a man, and death is running more fleet than he along every seabeach in the world. I adjusted the dark lens of my glasses and, thus disguised, I paced slowly back by the starfish gatherers, past the shell collectors, with their vulgar little spades and the stick-length shelling pincers that eased their elderly backs while they snatched at treasures in the sand. I chose to look full at the steaming kettles in which beautiful voiceless things were being boiled alive. Behind my sunglasses a kind of litany began and refused to die down. \"As I came through the desert thus it was, as I came through the desert.\" In the darkness of my room I lay quiet with the sunglasses removed, but the eye turned and turned. In the desert, an old monk had once advised a traveler, the voices of God and the Devil are scarcely distinguishable. Costabel was a desert. I lay quiet, but my restless hand at the bedside fingered the edge of an invisible abyss. \"Certain coasts,\" the remark of a perceptive writer came back to me, \"are set apart for shipwreck.\" With unerring persistence I had made my way thither.",{"id":5274,"title":5275,"titles":5276,"content":5277,"level":15},"\u002Fthe-star-thrower#_2","2",[5270],"There is a difference in our human outlook, depending on whether we have been born upon level plains, where one step reasonably leads to another, or whether, by contrast, we have spent our lives amidst glacial crevasses and precipitous descents. In the case of the mountaineer, one step does not always lead rationally to another save by a desperate leap over a chasm or by an even more hesitant tiptoeing across precarious snow bridges. Something about these opposed landscapes has its analogue in the mind of man. Our prehistoric life, one might say, began amidst enforested gloom with the abandonment of the protected instinctive life of nature. We sought, instead, an adventurous existence amidst the crater lands and ice fields of self-generated ideas. Clambering onward, we have slowly made our way out of a maze of isolated peaks into the level plains of science. Here, one step seems definitely to succeed another, the universe appears to take on an imposed order, and the illusions through which mankind has painfully made its way for many centuries have given place to the enormous vistas of past and future time. The encrusted eye in the stone speaks to us of undeviating sunlight; the calculated elliptic of Halley's comet no longer forecasts world disaster. The planet plunges on through a chill void of star years, and there is little or nothing that remains unmeasured. Nothing, that is, but the mind of man. Since boyhood I had been traveling across the endless co-ordinated realms of science, just as, in the body, I was a plains dweller, accustomed to plodding through distances unbroken by precipices. Now that I come to look back, there was one contingent aspect of that landscape I inhabited whose significance, at the time, escaped me. \"Twisters,\" we called them locally. They were a species of cyclonic, bouncing air funnel that could suddenly loom out of nowhere, crumpling windmills or slashing with devastating fury through country towns. Sometimes, by modest contrast, more harmless varieties known as dust devils might pursue one in a gentle spinning dance for miles. One could see them hesitantly stalking across the alkali flats on a hot day, debating, perhaps, in their tall, rotating columns, whether to ascend and assume more formidable shapes. They were the trickster part of an otherwise pedestrian landscape. Infrequent though the visitations of these malign creations of the air might be, all prudent homesteaders in those parts had provided themselves with cyclone cellars. In the careless neighborhood in which I grew up, however, we contented ourselves with the queer yarns of cyclonic folklore and the vagaries of weather prophecy. As a boy, aroused by these tales and cherishing a subterranean fondness for caves, I once attempted to dig a storm cellar. Like most such projects this one was never completed. The trickster element in nature, I realize now, had so buffeted my parents that they stoically rejected planning. Unconsciously, they had arrived at the philosophy that foresight merely invited the attention of some baleful intelligence that despised and persecuted the calculating planner. It was not until many years later that I came to realize that a kind of maleficent primordial power persists in the mind as well as in the wandering dust storms of the exterior world. A hidden dualism that has haunted man since antiquity runs across his religious conceptions as the conflict between good and evil. It persists in the modern world of science under other guises. It becomes chaos versus form or antichaos. Form, since the rise of the evolutionary philosophy, has itself taken on an illusory quality. Our apparent shapes no longer have the stability of a single divine fiat. Instead, they waver and dissolve into the unexpected. We gaze backward into a contracting cone of life until words leave us and all we know is dissolved into the simple circuits of a reptilian brain. Finally, sentience subsides into an animalcule. Or we revolt and refuse to look deeper, but the void remains. We are rag dolls made out of many ages and skins, changelings who have slept in wood nests or hissed in the uncouth guise of waddling amphibians. We have played such roles for infinitely longer ages than we have been men. Our identity is a dream. We are process, not reality, for reality is an illusion of the daylight -- the light of our particular day. In a fortnight, as aeons are measured, we may lie silent in a bed of stone, or, as has happened in the past, be figured in another guise. Two forces struggle perpetually in our bodies: Yam, the old sea dragon of the original Biblical darkness, and, arrayed against him, some wisp of dancing light that would have us linger, wistful, in our human form. \"Tarry thou, till I come again\" -- an old legend survives among us of the admonition given by Jesus to the Wandering Jew. The words are applicable to all of us. Deep-hidden in the human psyche there is a similar injunction no longer having to do with the longevity of the body but, rather, a plea to wait upon some transcendent lesson preparing in the mind itself. Yet the facts we face seem terrifyingly arrayed against us. It is as if at our backs, masked and demonic, moved the trickster as I have seen his role performed among the remnant of a savage people long ago. It was that of the jokester present at the most devout of ceremonies. This creature never laughed; he never made a sound. Painted in black, he followed silently behind the officiating priest, mimicking, with the added flourish of a little whip, the gestures of the devout one. His timed and stylized posturings conveyed a derision infinitely more formidable than actual laughter. In modern terms, the dance of contingency, of the indeterminable, outwits us all. The approaching, fateful whirlwind on the plain had mercifully passed me by in youth. In the moment when I had witnessed that fireside performance I knew with surety that primitive man had lived with a dark message. He had acquiesced in the admission into his village of a cosmic messenger. Perhaps the primitives were wiser in the ways of the trickster universe than ourselves; perhaps they knew, as we do not, how to ground or make endurable the lightning. At all events, I had learned, as I watched that half-understood drama by the leaping fire, why man, even modern man, reads goose bones for the weather of his soul. Afterward I had gone out, a troubled unbeliever, into the night. There was a shadow I could not henceforth shake off, which I knew was posturing and would always posture behind me. That mocking shadow looms over me as I write. It scrawls with a derisive pen and an exaggerated flourish. I know instinctively it will be present to caricature the solemnities of my deathbed. In a quarter of a century it has never spoken. Black magic, the magic of the primeval chaos, blots out or transmogrifies the true form of things. At the stroke of twelve the princess must flee the banquet or risk discovery in the rags of a kitchen wench; coach reverts to pumpkin. Instability lies at the heart of the world. With uncanny foresight folklore has long toyed symbolically with what the nineteenth century was to proclaim a reality, namely, that form is an illusion of the time dimension, that the magic flight of the pursued hero or heroine through frogskin and wolf coat has been, and will continue to be, the flight of all men. Goethe's genius sensed, well before the publication of the Origin of Species, the thesis and antithesis that epitomize the eternal struggle of the immediate species against its dissolution into something other: in modern terms, fish into reptile, ape into man. The power to change is both creative and destructive -- a sinister gift, which, unrestricted, leads onward toward the formless and inchoate void of the possible. This force can only be counterbalanced by an equal impulse toward specificity. Form, once arisen, clings to its identity. Each species and each individual holds tenaciously to its present nature. Each strives to contain the creative and abolishing maelstrom that pours unseen through the generations. The past vanishes; the present momentarily persists; the future is potential only. In this specious present of the real, life struggles to maintain every manifestation, every individuality, that exists. In the end, life always fails, but the amorphous hurrying stream is held and diverted into new organic vessels in which form persists, though the form may not be that of yesterday. The evolutionists, piercing beneath the show of momentary stability, discovered, hidden in rudimentary organs, the discarded rubbish of the past. They detected the reptile under the lifted feathers of the bird, the lost terrestrial limbs dwindling beneath the blubber of the giant cetaceans. They saw life rushing outward from an unknown center, just as today the astronomer senses the galaxies fleeing into the infinity of darkness. As the spinning galactic clouds hurl stars and worlds across the night, so life, equally impelled by the centrifugal powers lurking in the germ cell, scatters the splintered radiance of consciousness and sends it prowling and contending through the thickets of the world. All this devious, tattered way was exposed to the ceaselessly turning eye within the skull that lay hidden upon the bed in Costabel. Slowly that eye grew conscious of another eye that searched it with equal penetration from the shadows of the room. It may have been a projection from the mind within the skull, but the eye was, nevertheless, exteriorized and haunting. It began as something glaucous and blind beneath a web of clinging algae. It altered suddenly and became the sand-smeared eye of the dead cephalopod I had encountered upon the beach. The transformations became more rapid with the concentration of my attention, and they became more formidable. There was the beaten, bloodshot eye of an animal from somewhere within my childhood experience. Finally, there was an eye that seemed torn from a photograph, but that looked through me as though it had already raced in vision up to the steep edge of nothingness and absorbed whatever terror lay in that abyss. I sank back again upon my cot and buried my head in the pillow. I knew the eye and the circumstance and the question. It was my mother. She was long dead, and the way backward was lost.",{"id":5279,"title":5280,"titles":5281,"content":5282,"level":15},"\u002Fthe-star-thrower#_3","3",[5270],"Now it may be asked, upon the coasts that invite shipwreck, why the ships should come, just as we may ask the man who pursues knowledge why he should be left with a revolving search beam in the head whose light falls only upon disaster or the flotsam of the shore. There is an answer, but its way is not across the level plains of science, for the science of remote abysses no longer shelters man. Instead, it reveals him in vaporous metamorphic succession as the homeless and unspecified one, the creature of the magic flight. Long ago, when the future was just a simple tomorrow, men had cast intricately carved game counters to determine its course, or they had traced with a grimy finger the cracks on the burnt shoulder blade of a hare. It was a prophecy of tomorrow's hunt, just as was the old farmer's anachronistic reading of the weather from the signs on the breastbone of a goose. Such quaint almanacs of nature's intent had sufficed mankind since antiquity. They would do so no longer, nor would formal apologies to the souls of the game men hunted. The hunters had come, at last, beyond the satisfying supernatural world that had always surrounded the little village, into a place of homeless frontiers and precipitous edges, the indescribable world of the natural. Here tools increasingly revenged themselves upon their creators and tomorrow became unmanageable. Man had come in his journeying to a region of terrible freedoms. It was a place of no traditional shelter, save those erected with the aid of tools, which had also begun to achieve a revolutionary independence from their masters. Their ways had grown secretive and incalculable. Science, more powerful than the magical questions that might be addressed by a shaman to a burnt shoulder blade, could create these tools but had not succeeded in controlling their ambivalent nature. Moreover, they responded all too readily to that urge for tampering and dissolution which is part of our primate heritage. We had been safe in the enchanted forest only because of our weakness. When the powers of that gloomy region were given to us, immediately, as in a witch's house, things began to fly about unbidden. The tools, if not science itself, were linked intangibly to the subconscious poltergeist aspect of man's nature. The closer man and the natural world drew together, the more erratic became the behavior of each. Huge shadows leaped triumphantly after every blinding illumination. It was a magnified but clearly recognizable version of the black trickster's antics behind the solemn backs of the priesthood. Here, there was one difference. The shadows had passed out of all human semblance; no societal ritual safely contained their posturings, as in the warning dance of the trickster. Instead, unseen by many because it was so gigantically real, the multiplied darkness threatened to submerge the carriers of the light. Darwin, Einstein, and Freud might be said to have released the shadows. Yet man had already entered the perilous domain that henceforth would contain his destiny. Four hundred years ago Francis Bacon had already anticipated its dual nature. The individuals do not matter. If they had not made their discoveries, others would have surely done so. They were good men, and they came as enlighteners of mankind. The tragedy was only that at their backs the ritual figure with the whip was invisible. There was no longer anything to subdue the pride of man. The world had been laid under the heavy spell of the natural; henceforth, it would be ordered by man. Humanity was suddenly entranced by light and fancied it reflected light. Progress was its watchword, and for a time the shadows seemed to recede. Only a few guessed that the retreat of darkness presaged the emergence of an entirely new and less tangible terror. Things, in the words of G. K. Chesterton, were to grow incalculable by being calculated. Man's powers were finite; the forces he had released in nature recognized no such limitations. They were the irrevocable monsters conjured up by a completely amateur sorcerer. But what, we may ask, was the nature of the first discoveries that now threaten to induce disaster? Pre-eminent among them was, of course, the perception to which we have already referred: the discovery of the interlinked and evolving web of life. The great Victorian biologists saw, and yet refused to see, the war between form and formlessness, chaos and antichaos, which the poet Goethe had sensed contesting beneath the smiling surface of nature. \"The dangerous gift from above,\" he had termed it, with uneasy foresight. By contrast, Darwin, the prime student of the struggle for existence, sought to visualize in a tangled bank of leaves the silent and insatiable war of nature. Still, he could imply with a veiled complacency that man might \"with some confidence\" look forward to a secure future \"of inappreciable length.\" This he could do upon the same page in the Origin of Species where he observes that \"of the species now living very few will transmit progeny to a far distant futurity.\" The contradiction escaped him; he did not wish to see it. Darwin, in addition, saw life as a purely selfish struggle, in which nothing is modified for the good of another species without being directly advantageous to its associated form. If, he contended, one part of any single species had been formed for the exclusive good of another, \"it would annihilate my theory.\" Powerfully documented and enhanced though the statement has become, famine, war, and death are not the sole instruments biologists today would accept as the means toward that perfection of which Darwin spoke. The subject is subtle and intricate, however, and one facet of it must be reserved for another chapter. Let it suffice to say here that the sign of the dark cave and the club became so firmly fixed in human thinking that in our time it has been invoked as signifying man's true image in books selling in the hundreds of thousands. From the thesis and antithesis contained in Darwinism we come to Freud. The public knows that, like Darwin, the master of the inner world took the secure, stable, and sunlit province of the mind and revealed it as a place of contending furies. Ghostly transformations, flitting night shadows, misshapen changelings existed there, as real as anything that haunted the natural universe of Darwin. For this reason, appropriately, I had come as the skull and the eye to Costabel -- the coast demanding shipwreck. Why else had I remembered the phrase, except for a dark impulse toward destruction lurking somewhere in the subconscious? I lay on the bed while the agonized eye in the remembered photograph persisted at the back of my closed lids. It had begun when, after years of separation, I had gone dutifully home to a house from which the final occupant had departed. In a musty attic -- among old trunks, a broken aquarium, and a dusty heap of fossil shells collected in childhood -- I found a satchel. The satchel was already a shabby antique, in whose depths I turned up a jackknife and a \"rat\" of hair such as women wore at the beginning of the century. Beneath these lay a pile of old photographs and a note -- two notes, rather, evidently dropped into the bag at different times. Each, in a thin, ornate hand, reiterated a single message that the writer had believed important. \"This satchel belongs to my son, Loren Eiseley.\" It was the last message. I recognized the trivia. The jackknife I had carried in childhood. The rat of hair had belonged to my mother, and there were also two incredibly pointed slippers that looked as though they had been intended for a formal ball, to which I knew well my mother would never in her life have been invited. I undid the rotted string around the studio portraits. Mostly they consisted of stiff, upright bearded men and heavily clothed women equally bound to the formalities and ritual that attended upon the photography of an earlier generation. No names identified the pictures, although here and there a reminiscent family trait seemed faintly evident. Finally I came upon a less formal photograph, taken in the eighties of the last century. Again no names identified the people, but a commercial stamp upon the back identified the place: Dyersville, Iowa. I had never been in that country town, but I knew at once it was my mother's birthplace. Dyersville, the thought flashed through my mind, making the connection now for the first time: the dire place. I recognized at once the two sisters at the edge of the photograph, the younger clinging reluctantly to the older. Six years old, I thought, turning momentarily away from the younger child's face. Here it began, her pain and mine. The eyes in the photograph were already remote and shadowed by some inner turmoil. The poise of the body was already that of one miserably departing the peripheries of the human estate. The gaze was mutely clairvoyant and lonely. It was the gaze of a child who knew unbearable difference and impending isolation. I dropped the notes and pictures once more into the bag. The last message had come from Dyersville: \"my son.\" The child in the photograph had survived to be an ill-taught prairie artist. She had been deaf. All her life she had walked the precipice of mental breakdown. Here on this faded porch it had begun -- the long crucifixion of life. I slipped downstairs and out of the house. I walked for miles through the streets. Now at Costabel I put on the sunglasses once more, but the face from the torn photograph persisted behind them. It was as though I, as man, was being asked to confront, in all its overbearing weight, the universe itself. \"Love not the world,\" the Biblical injunction runs, \"neither the things that are in the world.\" The revolving beam in my mind had stopped, and the insect whisperings of the intellect. There was, at last, an utter stillness, a waiting as though for a cosmic judgment. The eye, the torn eye, considered me. \"But I do love the world,\" I whispered to a waiting presence in the empty room. \"I love its small ones, the things beaten in the strangling surf, the bird, singing, which flies and falls and is not seen again.\" I choked and said, with the torn eye still upon me, \"I love the lost ones, the failures of the world.\" It was like the renunciation of my scientific heritage. The torn eye surveyed me sadly and was gone. I had come full upon one of the last great rifts in nature, and the merciless beam no longer was in traverse around my skull. But no, it was not a rift but a joining: the expression of love projected beyond the species boundary by a creature born of Darwinian struggle, in the silent war under the tangled bank. \"There is no boon in nature,\" one of the new philosophers had written harshly in the first years of the industrial cities. Nevertheless, through war and famine and death, a sparse mercy had persisted, like a mutation whose time had not yet come. I had seen the star thrower cross that rift and, in so doing, he had reasserted the human right to define his own frontier. He had moved to the utmost edge of natural being, if not across its boundaries. It was as though at some point the supernatural had touched hesitantly, for an instant, upon the natural. Out of the depths of a seemingly empty universe had grown an eye, like the eye in my room, but an eye on a vastly larger scale. It looked out upon what I can only call itself. It searched the skies and it searched the depths of being. In the shape of man it had ascended like a vaporous emanation from the depths of night. The nothing had miraculously gazed upon the nothing and was not content. It was an intrusion into, or a projection out of, nature for which no precedent existed. The act was, in short, an assertion of value arisen from the domain of absolute zero. A little whirlwind of commingling molecules had succeeded in confronting its own universe. Here, at last, was the rift that lay beyond Darwin's tangled bank. For a creature, arisen from that bank and born of its contentions, had stretched out its hand in pity. Some ancient, inexhaustible, and patient intelligence, lying dispersed in the planetary fields of force or amidst the inconceivable cold of interstellar space, had chosen to endow its desolation with an apparition as mysterious as itself. The fate of man is to be the ever recurrent, reproachful Eye floating upon night and solitude. The world cannot be said to exist save by the interposition of that inward eye -- an eye various and not under the restraints to be apprehended from what is vulgarly called the natural. I had been unbelieving. I had walked away from the star thrower in the hardened indifference of maturity. But thought mediated by the eye is one of nature's infinite disguises. Belatedly, I arose with a solitary mission. I set forth in an effort to find the star thrower.",{"id":5284,"title":5285,"titles":5286,"content":5287,"level":15},"\u002Fthe-star-thrower#_4","4",[5270],"Man is himself, like the universe he inhabits, like the demoniacal stirrings of the ooze from which he sprang, a tale of desolations. He walks in his mind from birth to death the long resounding shores of endless disillusionment. Finally, the commitment to life departs or turns to bitterness. But out of such desolation emerges the awesome freedom to choose -- to choose beyond the narrowly circumscribed circle that delimits the animal being. In that widening ring of human choice, chaos and order renew their symbolic struggle in the role of titans. They contend for the destiny of a world. Somewhere far up the coast wandered the star thrower beneath his rainbow. Our exchange had been brief because upon that coast I had learned that men who ventured out at dawn resented others in the greediness of their compulsive collecting. I had also been abrupt because I had, in the terms of my profession and experience, nothing to say. The star thrower was mad, and his particular acts were a folly with which I had not chosen to associate myself. I was an observer and a scientist. Nevertheless, I had seen the rainbow attempting to attach itself to earth. On a point of land, as though projecting into a domain beyond us, I found the star thrower. In the sweet rain-swept morning, that great many-hued rainbow still lurked and wavered tentatively beyond him. Silently I sought and picked up a still-living star, spinning it far out into the waves. I spoke once briefly. \"I understand,\" I said. \"Call me another thrower.\" Only then I allowed myself to think, He is not alone any longer. After us there will be others. We were part of the rainbow -- an unexplained projection into the natural. As I went down the beach I could feel the drawing of a circle in men's minds, like that lowering, shifting realm of color in which the thrower labored. It was a visible model of something toward which man's mind had striven, the circle of perfection. I picked and flung another star. Perhaps far outward on the rim of space a genuine star was similarly seized and flung. I could feel the movement in my body. It was like a sowing -- the sowing of life on an infinitely gigantic scale. I looked back across my shoulder. Small and dark against the receding rainbow, the star thrower stooped and flung once more. I never looked again. The task we had assumed was too immense for gazing. I flung and flung again while all about us roared the insatiable waters of death. But we, pale and alone and small in that immensity, hurled back the living stars. Somewhere far off, across bottomless abysses, I felt as though another world was flung more joyfully. I could have thrown in a frenzy of joy, but I set my shoulders and cast, as the thrower in the rainbow cast, slowly, deliberately, and well. The task was not to be assumed lightly, for it was men as well as starfish that we sought to save. For a moment, we cast on an infinite beach together beside an unknown hurler of suns. It was, unsought, the destiny of my kind since the rituals of the ice age hunters, when life in the Northern Hemisphere had come close to vanishing. We had lost our way, I thought, but we had kept, some of us, the memory of the perfect circle of compassion from life to death and back again to life -- the completion of the rainbow of existence. Even the hunters in the snow, making obeisance to the souls of the hunted, had known the cycle. The legend had come down and lingered that he who gained the gratitude of animals gained help in need from the dark wood. I cast again with an increasingly remembered sowing motion and went my lone way up the beaches. Somewhere, I felt, in a great atavistic surge of feeling, somewhere the Thrower knew. Perhaps he smiled and cast once more into the boundless pit of darkness. Perhaps he, too, was lonely, and the end toward which he labored remained hidden -- even as with ourselves. I picked up a star whose tube feet ventured timidly among my fingers while, like a true star, it cried soundlessly for life. I saw it with an unaccustomed clarity and cast far out. With it, I flung myself as forfeit, for the first time, into some unknown dimension of existence. From Darwin's tangled bank of unceasing struggle, selfishness, and death, had arisen, incomprehensibly, the thrower who loved not man, but life. It was the subtle cleft in nature before which biological thinking had faltered. We had reached the last shore of an invisible island -- yet, strangely, also a shore that the primitives had always known. They had sensed intuitively that man cannot exist spiritually without life, his brother, even if he slays. Somewhere, my thought persisted, there is a hurler of stars, and he walks, because he chooses, always in desolation, but not in defeat. In the night the gas flames under the shelling kettles would continue to glow. I set my clock accordingly. Tomorrow I would walk in the storm. I would walk against the shell collectors and the flames. I would walk remembering Bacon's forgotten words \"for the uses of life.\" I would walk with the knowledge of the discontinuities of the unexpected universe. I would walk knowing of the rift revealed by the thrower, a hint that there looms, inexplicably, in nature something above the role men give her. I knew it from the man at the foot of the rainbow, the starfish thrower on the beaches of Costabel. Editor Note: This piece is by Loren Eiseley, 1969. Published in The Unexpected Universe. Transcribed here from a PDF scan I found.",{"id":5289,"title":5290,"titles":5291,"content":5292,"level":9},"\u002Fthings-i-love","Things_I_Love",[],"In no particular order, these are a few of my favorite things! BethPerlProgrammingOCamlCSSIon Window ManagerLinuxCoconut The RabbitArcanejillGenetic ProgrammingComputer SciencePlaying the HarmonicaGoWikisWikipediaGoogle SearchPhilosophyMathematicsLogicDeviant LogicReadingSherlock HolmesCoffee ShopsThe InternetDaniel C DennettClever HacksMagic TricksMathematical PuzzlesLittle KidsConspiracy TheoriesPet ParrotsTalk Like a Pirate DayPi DayPhilosophical TaoismPhiScienceScience FictionContinuationsAbstractionMaking FriendsLearning new ConceptsWhiteboards and ChalkboardsNerd ClubsDancing",{"id":5294,"title":5295,"titles":5296,"content":5297,"level":9},"\u002Fthoughts-and-issues-with-web-based-db-programming","Thoughts_and_issues_with_web-based_DB_programming",[],"As a job I have often done web-based database programming. Over the course of time I've been annoyed by various things (like a good little programmer) and have slowly contemplated how to get rid of these annoyances. Most of the issues I have spring from laziness, which is a Good Thing of course. So let's see how I think things ''should'' be...",{"id":5299,"title":5300,"titles":5301,"content":5302,"level":15},"\u002Fthoughts-and-issues-with-web-based-db-programming#model-view-controller","Model-View-Controller",[5295],"First of all we should have an Model-View-Controller (MVC) style layout. This layout, or one of its many variations, has demonstrated its ability to break a program into nice, cleanly separated components. The MVC layout does not at first seem as natural as other layouts when it comes to web-based interfaces, but this reservation mostly arrives through the view portion of the layout, which is not as synchronous as one might like. It is, however, synchronous enough to work for us, and the rest of the model is certainly appropriate.",{"id":5304,"title":5305,"titles":5306,"content":5307,"level":15},"\u002Fthoughts-and-issues-with-web-based-db-programming#the-controller","The Controller",[5295],"The controller should be two levels -- the top generic level should be a simple state machine, and the second layer the actual states. These states would do the manipulation of the model and the choosing of the view. It is in the second-level controller that the business logic is contained.",{"id":5309,"title":5310,"titles":5311,"content":5312,"level":15},"\u002Fthoughts-and-issues-with-web-based-db-programming#the-view","The View",[5295],"The View should be fairly simple -- for CGI stuff a template system is good. The demand of separating HTML and code is silly, the real trouble is separating business logic and code. Of course separating HTML and code enough that a WYSIWYG editer can handle the template is a good idea... it is not necessary to go overboard here. A single second-level controller could utilize several views.",{"id":5314,"title":5315,"titles":5316,"content":5317,"level":15},"\u002Fthoughts-and-issues-with-web-based-db-programming#the-model","The Model",[5295],"The Model in this case should be an abstract view of the database, and this is the part which I don't think anyone has gotten quite right. My proposal for a model is a more abstract view of the database than what programmers currently receive. There should be a very simple way to query and update complex data. This would center around an intelligent flexible model. It would take a schema to get started, and then would arrange and structure SQL for you to do what you want, without you having to keep telling it how bits of data relate to one another. cpan:Class::DBI is a pretty interesting approach, but does not quite do what I want. Instead of a table-by-table view of the DB we want a true relational view. The thing that most people point to is object mappers, allowing the programmer to stick objects into the database. This, however, is too ''specific'' in that a class must be created or declared or customized on a per-table or per-thing (person, address, etc) basis. I think that a single class of objects is needed, and each of these should be able to describe and manipulate any table or set of tables. See SetDB for work in this direction.",{"id":5319,"title":870,"titles":5320,"content":5321,"level":15},"\u002Fthoughts-and-issues-with-web-based-db-programming#see-also",[5295],"http:\u002F\u002Fwww.javaworld.com\u002Fjavaworld\u002Fjw-07-2000\u002Fjw-0721-hmvc_p.htmlhttp:\u002F\u002Fst-www.cs.uiuc.edu\u002Fusers\u002Fsmarch\u002Fst-docs\u002Fmvc.htmlhttp:\u002F\u002Fwww.fourbit.com\u002Fresources\u002Ffab_mvc_clients.htm",{"id":5323,"title":5324,"titles":5325,"content":5326,"level":9},"\u002Fthoughts-on-automatic-parallelization","Thoughts_on_Automatic_Parallelization",[],"I talked to John Neuburger the other day and it got me to thinking again about automatically parallelizing programs. So, as promised by the title of this page, here are some of my thoughts on the subject. All that has to be done (ha!) is to abstract a true semantic analysis of a program, and then find and apply some parallelizing transformations which we can prove are correct. Actually we then need to look at the target architecture to see which of our transformations are appropriate to use and where to apply them. One thought I had involved parallelizing typed lambda calculus, which could then lead to an extension of OCaml (and some other languages) to be automatically parallelizing. Someone had thought along these lines long ago, however, and there are resources on the internet talking about how to use the order of reduction to your advantage... possibly parallelizing it altogether. There are several ways that a program can be parallelized. At the topmost layer the programmer themselves can design parallel algorithms, either in an idealized fashion or through actual control of the full communication protocol. This approach is undesirable, however, since it involves thinking about problem solving which is not necessarily related to the problem which the programmer is trying to solve.",{"id":5328,"title":5329,"titles":5330,"content":5331,"level":9},"\u002Ftracker-search","Tracker_Search",[],"Search for tracker",{"id":5333,"title":5334,"titles":5335,"content":5336,"level":9},"\u002Ftracker-status","Tracker_Status",[],"This is an overview of tracker status stuff. Also See: Create Tracker ItemTracker Search",{"id":5338,"title":5339,"titles":5340,"content":5341,"level":15},"\u002Ftracker-status#open-tracker-items","Open Tracker Items",[5334],"\u003Ccompilation \"^^\"*status: open\" nobody>",{"id":5343,"title":5344,"titles":5345,"content":5346,"level":15},"\u002Ftracker-status#closed-tracker-items","Closed Tracker Items",[5334],"\u003Ccompilation 10 \"^^\"*status: closed\" nobody>",{"id":5348,"title":5349,"titles":5350,"content":5351,"level":9},"\u002Fumbrellas","Umbrellas",[],"(download) Lyrics by Brock Wilcox.\nPerformance and music composition by Brock Wilcox, Elizabeth Mastry, Jason Woys, Erik Summerfield (at least!). Please share, copy, and modify, under the terms of Creative Commons Attribution-ShareAlike (CC BY-SA)! Chorus: G D C G \u002F G D CD G\nVerse: G4 C4 D2 C2 G*3 Chorus:\nI don't believe in umbrellas,\numbrellas,\numbrellas,\nI don't believe in umbrellas,\nBecause they don't exist! My friend had an umbrella,\nHe opened it indoors,\nNext thing he knew\naway it flew\nand the ceiling fell to the floor! chorus 'cause they don't believe in me! My friend had an umbrella,\nHe threw it at my head,\nNext thing I knew\nIt flew right through,\nAnd hit the wall instead! chorus though they believe in me horn interlude I once bought an umbrella,\nFrom a guy named Stan,\nI said \"what's the deal?!\"\n\"This thing ain't real!\"\nAnd he just turned and ran! chorus though I suppose they might exist horn Bonus or alternate verses What's with those umbrellas?\nAre they apparel, or a roof?\nThey walk the line,\nYou can't define,\nThat's just further proof!",{"id":5353,"title":5354,"titles":5355,"content":5356,"level":9},"\u002Funison-backup-setup","Unison Backup Setup",[],"I use Unison File Synchronizer to keep my important files synchronized between machines. This is a description of how I have it arranged and automated. I have been using this setup since 2006!",{"id":5358,"title":5359,"titles":5360,"content":5361,"level":15},"\u002Funison-backup-setup#directory-setup","Directory Setup",[5354],"I put all my important files into a directory called 'tlt' in my home directory. This happens to exactly correspond with the root http directory of my website. Most things in the directory are fine to be on the web, but things that shouldn't be published are locked through file permissions and .htaccess files. I put this 'tlt' directory into my home directory: \u002Fhome\u002Fawwaiid\u002F\ntlt\u002F - my main directory, and the root of my website\nprivate\u002F - holds private files\nmail\u002F - holds my maildotfiles\u002F - holds my homedir .config filesprojects\u002F - all my own code projectsdocs\u002F - Various documents I then symlink a few key directories and files from my home directory into this folder. So, for example: \u002Fhome\u002Fawwaiid\u002Fmail -> \u002Fhome\u002Fawwaiid\u002Ftlt\u002Fprivate\u002Fmail\u002Fhome\u002Fawwaiid\u002F.muttrc -> \u002Fhome\u002Fawwaiid\u002Ftlt\u002Fprivate\u002Fdotfiles\u002F.muttrc\u002Fhome\u002Fawwaiid\u002Fprojects\u002F -> \u002Fhome\u002Fawwaiid\u002Ftlt\u002Fprojects\u002F And so on. So to get all my settings from one machine to another, I just need to get a copy of this 'tlt' directory and make a few key symlinks. When I get a new machine I actually do these from my home directory. Yes, they give some error about not duplicationg  or  but ... I ignore those errors :) I guess technically I could mash those into one big . Eh. To backup all my stuff I must back up this tlt directory. This is where unison comes in.",{"id":5363,"title":5364,"titles":5365,"content":5366,"level":15},"\u002Funison-backup-setup#unison","Unison",[5354],"Unison is kinda like rsync, except smarter (stateful). It keeps a database on each machine so that it can remember what the directories looked like during the most recent synchronization. So if you delete a file on one machine it knows, and if you delete it on one machine and modify it on another it can tell that there is a conflict which you must resolve by hand. It does this through presence, timestamps, and file checksums. After you've synchronized two hosts, resolving all conflicts, you have an identical set of files on each host. We use the notation host1->host2 meaning a synchronization between host1 and host2 initiated from host1. I have three machines on which I want an up-to-date copy of 'tlt'. They are my own computer (Feline), my website host (Mirabel), and my laptop (Jill). Generally I will sync Feline->Mirabel and Jill->Mirabel, but I could do other combinations (and often do Jill->Feline). Let's say I am using Feline and want to sync with Mirabel. If you simply run 'unison' it will interactively prompt you for the local and remote directory you wish to synchronize, and step you through the initial sync. It'll remember too, and when you re-run it will sync what it can and ask you about conflicts. Try it a couple times, it's fun. It stores its settings in preference files inside of ~\u002F.unison\u002F. Here is the preference file I use (2024) for vorm->pegasus. Really the only tricky thing is the ignore paths, which I add to every now and then.",{"id":5368,"title":5369,"titles":5370,"content":5371,"level":15},"\u002Funison-backup-setup#automatic-backups","Automatic backups",[5354],"OK, here's another tip -- most of the time there aren't any conflicts. So there is a flag for unison which lets it run in batch mode. Guess what it is? This runs unison, from feline to mirabel, syncing my 'tlt' directory on each and skipping any conflicts and giving a report. This is exactly what we need for cron! Here is my entry in my own crontab on feline, along with some stuff to send me shorter email reports: Every now and then I will run unison without the -batch flag to make resolve any outstanding conflicts. A conflict might happen if I edit a file on my laptop (jill) and on my desktop (feline) without bothering to synchronize inbetween. Resolution mode will let me see a diff and select which one I want to keep (or run a merge tool or whatever I like). I tend to sync Jill by hand. Actually I have two other machines which automatically get synced, but that is just more of the same.",{"id":5373,"title":5374,"titles":5375,"content":5376,"level":15},"\u002Funison-backup-setup#fancier-setup","Fancier Setup",[5354],"The above requires you to check, every now and then, if everything worked. You do that by looking at the log file in \u002Ftmp and maybe noticing that something isn't working. That doesn't seem like the GREATEST way to do it. So I made this wrapper that will let me know that it worked or failed: And now my cronjob looks like this, running hourly: This is a bit more specific to my system, since I have notificiations all set up with notify-send and it can work from a cronjob and all that. I suspect I'm going to have to add another escape for when the machine is offline.",{"id":5378,"title":5379,"titles":5380,"content":5381,"level":9},"\u002Funtyped-lambda-calculus-in-ocaml","Untyped_Lambda_Calculus_in_OCaml",[],"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! 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. Get the code at: http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Focaml\u002Funtyped-lambda-calc\u002F",{"id":5383,"title":5384,"titles":5385,"content":5386,"level":9},"\u002Fuse-everywhere","Use_Everywhere",[],"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: ... 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:",{"id":5388,"title":261,"titles":5389,"content":5390,"level":15},"\u002Fuse-everywhere#code",[5384],"darcs get http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Feverywherecpan:everywhere",{"id":5392,"title":5393,"titles":5394,"content":5395,"level":9},"\u002Fuseful-cs-concepts-growth-in-time-and-space","Useful_CS_Concepts_-_Growth_in_Time_and_Space",[],"Let's say you are solving a problem with 100 inputs. How much longer will it take (time) and how much more memory will you use (space) to solve the problem with 101 inputs? How much time & space will you use to solve it with 1000 inputs? A million inputs? Why and when do you care? How can I find the answer experimentally?",{"id":5397,"title":5398,"titles":5399,"content":5400,"level":15},"\u002Fuseful-cs-concepts-growth-in-time-and-space#problem-size-and-growth","Problem Size and Growth",[5393],"Most problems have some inputs and some outputs. Solving the problem takes some amount of time, and intermediate values take up some amount of space. When I say \"time\" I mean one of two things -- either how many steps it takes to solve a problem, or how much wall-clock (that is -- the clock on the wall next to you) time it takes to solve the problem. These are more or less the same thing... the main difference is that if it takes 100 \"steps\" maybe that is 100 seconds. But if your computer is playing a video or something at the same time, maybe 100 \"steps\" will take 500 seconds instead. When I say \"space\" I mean the memory storage that you use to help solve your problem. This would be things such as temporary variables with partial solutions. Mostly people focus time when discussing problem size, and less about space. I think that's because time slowdowns hit people more frequently than huge memory usage, but I'm not sure. When we increase the amount of input that we are trying to solve, we say the problem has \"grown\". As it grows, the amount of time and space it takes to solve the problem will change. Sometimes it won't change by much, and sometimes it will (unintuitively) take WAY longer or WAY more space to solve a problem with only a LITTLE more input! We give these growth-rates names to help us understand, for a particular problem and solution, how much longer or how much more space we'll use when the number of inputs gets bigger. There are a lot of these \"growth rates\", and I'm going to go over the most common and useful ones. If you were to just pick three to learn, you should pick Linear Growth, Polynomial Growth, and Exponential Growth.",{"id":5402,"title":5403,"titles":5404,"content":5405,"level":15},"\u002Fuseful-cs-concepts-growth-in-time-and-space#constant-growth","Constant Growth",[5393],"The time\u002Fspace doesn't increase with problem size. This is usually because the problem size itself can't really increase. An example of this is determining whether a number is even or odd.",{"id":5407,"title":5408,"titles":5409,"content":5410,"level":15},"\u002Fuseful-cs-concepts-growth-in-time-and-space#logarithmic-growth","Logarithmic Growth",[5393],"It takes more time\u002Fspace to solve larger problems, but it doesn't grow as fast as the problem size. A great example of this is binary search over a sorted list.",{"id":5412,"title":5413,"titles":5414,"content":5415,"level":15},"\u002Fuseful-cs-concepts-growth-in-time-and-space#linear-growth","Linear Growth",[5393],"Solves the problem in a growing amount of time\u002Fspace, incremental with the problem size.",{"id":5417,"title":5418,"titles":5419,"content":5420,"level":15},"\u002Fuseful-cs-concepts-growth-in-time-and-space#loglinear-growth","Loglinear Growth",[5393],"Problem difficulty grows a bit faster than linear, but not as fast as polynomial. I almost left this one out, but this is how fast common sorting algorithms run.",{"id":5422,"title":5423,"titles":5424,"content":5425,"level":15},"\u002Fuseful-cs-concepts-growth-in-time-and-space#polynomial-growth","Polynomial Growth",[5393],"Problem difficulty grows quite a bit faster than the input size",{"id":5427,"title":5428,"titles":5429,"content":5430,"level":15},"\u002Fuseful-cs-concepts-growth-in-time-and-space#exponential-growth","Exponential Growth",[5393],"Problem difficulty grows WAY faster than the input size",{"id":5432,"title":2080,"titles":5433,"content":5434,"level":15},"\u002Fuseful-cs-concepts-growth-in-time-and-space#references",[5393],"Wikipedia: Big 'O' of common functions Reorganizing data can change everything\nReorganizing your algorithm can change everything",{"id":5436,"title":5437,"titles":5438,"content":5439,"level":9},"\u002Fvscode-stripped-down","VSCode Stripped Down",[],"VSCode is quite cool and I'd like to be good with it, but my fingers and brain refuse to adapt without some explicit work. Here are some of the things I'm doing to make it a bit more comfortable for me, a long-time vim user.",{"id":5441,"title":5442,"titles":5443,"content":5444,"level":15},"\u002Fvscode-stripped-down#vscode","VSCode",[5437],"I love (Neo) Vim! However ... I also like to try out new things and there are a lot of plugins that are only offered (or better supported) in VSCode, such as Cody. Also there are some things that an editor with full GUI capabilities can do that aren't quite so easy from the terminal. On top of that, there are plenty of fans of VSCode that I work with on a daily basis and I'd like to speak their language. VSCode is a programmable editor, like Vim and Emacs and other greats, and a good choice for programming. Let's stretch our brain! So I fire up VSCode! And I am immediately overwhelmed. Here is roughly what I see: There are all of these sidebars and tabs and header bars and other sidebars and all sorts of things! Everything is loud and I don't know what to look at. Also, obviously, the keyboard navigation is significantly different. I need to simplify. I want to strip this down to the bone. Then I can build it up again later. OK ... so here's the plan. First I want to remove everything from the UI but the basics. A lot of the visual elements such as the tab bar can be replaced with keyboard navigation. Hence, second I'll mostly learn the default keyboard shortcuts. Maybe I'll eventually pull in vim-mode or embedded-neovim, but people seem to use this editor without those things, so I can too. Results -- vim on the left, vscode on the right:",{"id":5446,"title":5447,"titles":5448,"content":5449,"level":15},"\u002Fvscode-stripped-down#trim-it-down","Trim It Down",[5437],"Let's turn off everything that we can. We don't need the sidebar, the sidebar icon bar, the top menu, the top tabs, the minimap, indention indicator, or the max-column indicator (ruler). The embedded terminal doesn't need tabs either (I'd rather it be split or can use the menu or other keys). Also while we're at it I'll turn on word-wrap. Here is what it looks like by default: I turned all of those things off using the settings editor GUI, but here is the resulting JSON: This is great, but I keep doing things that bring back the sidebar! Great while i'm using it, but when I'm done I want it to go away. Running  gives us the super menu of all the things we can do. If you find a thing that has keybindings, you can press the keybinding next time. Good way to discover new shortcuts and new actions. I want to hide the sidebar and maximize the edit screen, and the command for that on the list is . Great! Jam that. Now we want the sidebar for a bunch of things, like messing with the file-tree or extension lists or git stuff or bot chat. Once I've used the sidebar and I'm done, I want it to go away. So I've added this to my keybindings.json to make this even easier: And now my fingers can hit  as often as they like to focus on the editor alone.",{"id":5451,"title":5452,"titles":5453,"content":5454,"level":15},"\u002Fvscode-stripped-down#sidebar-terminals-and-navigation","Sidebar Terminals and Navigation",[5437],"I've had the same general \"IDE\" layout for years -- the left full-height side of my screen for editing, the right side divvied into a stack of terminals. Here is a screenshot from 2003! What I like about this is that I often bounce back and forth, running some cli tool or interactive build thing on the right, editing on the left. Maybe one of my terminals is running the service, the other for doing some interactive debugging. There are a lot of advantages to using the terminal that is embedded in vscode, so I'd like this to work there. Moving the terminals to the side is easy, you can click some button to do that. Great! But now ... getting in and out of them is annoying. In my window manager I generally have two ways to move between windows -- move the mouse or hit a keybinding. Hover-focus in vscode is not going to happen, but the keybinding will do. My window manager uses  and  (Super is aka the Windows key) to move focus left and right, but I don't want to use  inside of vscode (I still give it to the window manager). After some looking at what things would collide with, I'm going with  to move from the editor to terminal,  to move back, and then  and  to move between stacked terminals.",{"id":5456,"title":5457,"titles":5458,"content":5459,"level":15},"\u002Fvscode-stripped-down#i-can-see-clearly-now","I Can See Clearly Now",[5437],"One of the dumbest things .... the background is solid black. I have this silly wallpaper that I can see through all of my terminal windows, and I'm used to it being there. I looked into transparency for the background, and possibly because I live in Linux-land (Wayland\u002FSway) ... no workey. I tried a few different plugins and CSS overrides and so on. No worries! Fake it 'til you make it! Pulling a very old trick out of my hat, what we'll do is get the Background (shalldie) extension, and then set the background image in VSCode to an image that happens to be the same as the desktop wallpaper. We used to do this all the time before we invented transparent terminals (which themselves for a long time did the trick for you). Here you can see that I positioned the background to be offset by 14 pixels. This corresponds to the 'gaps' that I've configured in my window manager. When you go fullscreen the background jumps a little, but that's fine. Also this works best when VSCode happens to be the first upper-left window on the screen, which it usually is for me. Good enough for me to stop messing with this for a while at least :) ... that said, this still isn't right. It is actually making the whole UI a little transparent, which dulls the fonts. I haven't figured out how to set the background image without affecting the rest of the UI.",{"id":5461,"title":5462,"titles":5463,"content":5464,"level":15},"\u002Fvscode-stripped-down#starting-from-the-terminal","Starting From the Terminal",[5437],"Getting close. But I keep finding myself in vim, often because it is invoked as a sub-command from many other tools (including the one I use to write bloggy posts). This is important to sort out when living in a unixy ecosystem. I finally worked out This of course doesn't open in the same terminal like vim does, instead popping up a window. But at least it is a new window (not re-using an existing one), and it waits for an exit before going forward. ... but my fingers still type \"vim\" all the time! So, TEMPORARILY, I'm doing this to use vscode anyway:",{"id":5466,"title":5467,"titles":5468,"content":5469,"level":15},"\u002Fvscode-stripped-down#things-that-i-wish-were-different","Things that I wish were different",[5437],"Opening a new window instead of inline-terminal-editing is jarring, but I'm getting used to itWhen I do have multiple panes open I would love to pretend these are more or less windows like my in window manager. BUT ... there is no focus-follows-mouse! I added some keybindings that help though.I'm still not convinced on the transparent background html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .s-m8C, html code.shiki .s-m8C{--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sCZoN, html code.shiki .sCZoN{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#CFCFC2}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .s8-w5, html code.shiki .s8-w5{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sq6CD, html code.shiki .sq6CD{--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}",{"id":5471,"title":5472,"titles":5473,"content":5474,"level":9},"\u002Fvim-configuration","Vim_Configuration",[],"Sometime soon I'm going to put a link here to my vim configuration. I'm going to check the thing into darcs! Fun fun fun.",{"id":5476,"title":5477,"titles":5478,"content":45,"level":9},"\u002Fvladimirbot","VladimirBot",[],{"id":5480,"title":5481,"titles":5482,"content":5483,"level":15},"\u002Fvladimirbot#a-personal-information-robot","A personal information robot",[5477],"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. 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. 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. 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: Context Levels 0 - None. There is no need to reference any other part of any conversation.1 - Immediate. Need to reference the immediately preceding statements2 - Conversation. Need to reference arbitrary parts of current conversation3 - Global. Must reference part of any conversation ever. See the 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. On the natural language front, please see my work on using an Earley Parser to write context-free, non-deterministic, complex grammars for some of the modules. I've put this over at VladimirBot Earley Parsing.",{"id":5485,"title":5486,"titles":5487,"content":5488,"level":9},"\u002Fvladimirbot-earley-parsing","VladimirBot_Earley_Parsing",[],"I'm using a modified Parse::Earley module (thanks to (insert name here)!) for doing some NLP for Vladimir modules. It is a pretty heavy algorithm, so I intend to avoid it when possible, but there are a few places where it will be very useful. The one I'm working on now is the schedule module's parser, which does in fact have a complex grammar.",{"id":5490,"title":5491,"titles":5492,"content":5493,"level":9},"\u002Fvladimirbot-module-api","VladimirBot_Module_API",[],"VladimirBot is split into modules, each one specializing in a specific task. You could think of it as experts if you like. The modules each get a turn trying to figure out the sentence and decide whether or not they can do something with it. If they can't then the next module gets a chance... and so on. The modules add themselves to a global list when they are loaded, and then they get called in an order dependent upon this list. That means that the most general modules (ones that will catch sentences which other, more domain-specific modules may have caught otherwise) should be loaded first so that they effectively end up on the bottom of the stack.",{"id":5495,"title":5496,"titles":5497,"content":5498,"level":56},"\u002Fvladimirbot-module-api#module-structure","Module Structure",[5491],"Modules have a main entrypoint where they get a chance to parse the current sentence. If the module can't figure the sentence out then it can give up and the next module will give it a whack. If, however, it does figure it out then the module returns the response directly. The first thing a module should do is add itself to the global module list array. So for the VladimirBot::News module: push @VladimirBot::vladimir_module, 'News'; This should be done on load (outside of any function). Then, when it is this module's turn to do some processing, the following sub gets called: parse($sentence) Fun, eh? So let's build a module... We can stick with our trusty news module. In this module the only thing we are looking for is the word \"news.\" This is a very simplistic view of the conversational world, but it will serve its illustrative purpose. In all actuality each module gets to parse the sentence however it wants, so long as it gets the job done. package VladimirBot::News;\nuse strict;\npush @VladimirBot::vladimir_module, 'News'; sub parse {\nmy $sentence = shift; # For now this is just a string, but someday it might be a\n# magical object which knows about various syntactical aspects\n# of the sentence\n}",{"id":5500,"title":5501,"titles":5502,"content":5503,"level":9},"\u002Fvuejs-notes","VueJS_Notes",[],"A brain-dump of some things I ran into while learning VueJS and related technology (Vuex). Vuex\nMakes me think of Software Transactional MemoryMutations are synchronousSince JS is single-threaded, that means they are atomic\nEven if they modify the state LOTSActions are a transaction that get committedActions are built out of multiple mutationsActions can be asyncAt the end of an Action the state must be committed\nWhere is the intermediate state stored?How are conflicts resolved?...Based on experimentation, there is NO implicit transaction for an ActionIn an action, each Mutation is executed immediatelyI guess you could build something to make an Action have local-state transactionSugar\nOne of the ways I like to learn and think about things is \"what part of this is sugar?\"Attributes in components can use (mis-use?) xml namespaces to indicate the usage of the attributeSUGAR: Drop the  and you end up with SUGAR: Replace  with  and end up with Not Vue specific, but there are many oft-used JS sugar thingsMy favorite is implicit-object (aka hash) key\nTake , where  is a scoped variableFirst, it is well-known that you can drop the quotesWith new JS you can also collapse this down further, since the key and the value-name match",{"id":5505,"title":5506,"titles":5507,"content":45,"level":9},"\u002Fwst","WST",[],{"id":5509,"title":5510,"titles":5511,"content":5512,"level":15},"\u002Fwst#group","Group",[5506],"Mikell ColemanBrock WilcoxErin Kelly",{"id":5514,"title":5515,"titles":5516,"content":5517,"level":15},"\u002Fwst#topic","Topic",[5506],"Our topic is domestic violence cases involving women in the United States. We will be looking at how this type of violence affects women in all facets of their lives, including relationships, work, child rearing, and general health. One organization which we will discuss that addresses this issue is the Arizona Colalition Against Domestic Violence. This organization produces educational material, conduct training, and operate a legal advocacy hotline, among other things.",{"id":5519,"title":5520,"titles":5521,"content":5522,"level":15},"\u002Fwst#outline","Outline",[5506],"WST Outline",{"id":5524,"title":5525,"titles":5526,"content":45,"level":9},"\u002Fwst#background-information-on-domestic-violence-against-women","Background information on domestic violence against women",[],{"id":5528,"title":5529,"titles":5530,"content":45,"level":9},"\u002Fwst#how-domestic-violence-affects-women-in-their-day-to-day-lives","How domestic violence affects women in their day-to-day lives",[],{"id":5532,"title":5533,"titles":5534,"content":45,"level":15},"\u002Fwst#work","Work",[5529],{"id":5536,"title":5537,"titles":5538,"content":45,"level":15},"\u002Fwst#child-rearing","Child Rearing",[5529],{"id":5540,"title":5541,"titles":5542,"content":45,"level":9},"\u002Fwst#specific-information-on-azcadv","Specific information on AZCADV",[],{"id":5544,"title":5545,"titles":5546,"content":45,"level":15},"\u002Fwst#disemination","Disemination",[5541],{"id":5548,"title":5549,"titles":5550,"content":45,"level":15},"\u002Fwst#protests","Protests",[5541],{"id":5552,"title":5553,"titles":5554,"content":45,"level":9},"\u002Fwst#other-things-that-can-be-done","Other things that can be done",[],{"id":5556,"title":5557,"titles":5558,"content":5559,"level":15},"\u002Fwst#bibliography-mla-format","Bibliography (MLA Format)",[5553],"Baumgardner, Jennifer, and Amy Richards. Manifesta: Young Women, Feminism, and the Future. Farrar, Straus and Giroux, 2000.\nISBN: 0374526222.Buchwald, Emilie, Pamela R. Fletcher, and Martha Roth. Transforming a Rape Culture. Reprint edition (January 1995). Milkweed Editions, 1994.\nISBN: 1571312048.Meisel J., D. Chandler, and B.M. Rienzi. \"Domestic Violence Prevalence and Effects on Employment in Two California TANF Populations.\" Violence Against Women. 9 (2003): 1191-1212.Schulhofer, Stephen J. Unwanted Sex: The Culture of Intimidation and the Failure of Law. Harvard University Press, 2000.\nISBN: 0674002032.Starhawk. Dreaming in the Dark: Magic, Sex, and Politics. Beacon Press, 1997.\nISBN: 0807010375.Williams, S.L., and K.D. Mickelson. \"The Nexus of Domestic Violence and Poverty: Resilience in Women’s Anxiety.\" Violence Against Women. 10 (2004): 283-293.Domestic Violence Is a Workplace Issue.http:\u002F\u002Fwww.eurowrc.org\u002F12.work_place\u002F2.work\u002F04.workplace_en.htmhttp:\u002F\u002Fwww.eurowrc.org\u002F12.work_place\u002F2.work\u002F02.workplace_en.htmhttp:\u002F\u002Fwww.azcadv.orghttp:\u002F\u002Fwww.azcadv.org\u002FPDFs\u002FFS-DVFactSheetUpdated2003.pdf",{"id":5561,"title":5562,"titles":5563,"content":5564,"level":9},"\u002Fwst-outline","WST_Outline",[],"Outline for WST",{"id":5566,"title":5567,"titles":5568,"content":5569,"level":9},"\u002Fwst-outline#domestic-violence","Domestic Violence",[],"A. Definition by our organization Battering is a pattern of coercive control that one person exercises over another. Abusers use physical and sexual violence, threats, emotional insults and economic deprivation as a way to dominate their partners and get their way. Relationships in which one partner uses assault and coercion can be found among married and unmarried heterosexuals, lesbians, and gay males. Battering is a behavior that physically harms, arouses fear, prevents an individual from doing what she\u002Fhe wishes of forces her\u002Fhim to behave in ways she\u002Fhe does not want to. (Susan Schechter - AZCADV website) B. Legal Definition AZ Statute 13-3601 (http:\u002F\u002Fwww.azleg.state.az.us\u002Fars\u002F13\u002F03601.htm)DV defined by AZ law ... include : physical assault, threatening words or conduct, intimidation, harrasment by phone and in person, stalking , endangerment, unlawful imprisonment, kidnapping, criminal trespass, criminal damange, disobeying a court order, custodial interference, abuse to a vulnerable adult or child, certain crimes against children and or disorderly conduct.Relationships considered:\nThe relationship between the victim and the defendant is one of marriage or former marriage or of persons residing or having resided in the same household.\nThe victim and the defendant have a child in common.\nThe victim or the defendant is pregnant by the other party.\nThe victim is related to the defendant or the defendant's spouse by blood or court order as a parent, grandparent, child, grandchild, brother or sister or by marriage as a parent-in-law, grandparent-in-law, stepchild, step-grandchild, brother-in-law or sister-in-law.\nThe victim is a child who resides or has resides in the same household as the defendant and is related by blood to a former spouse of the defendant or to a person who resides or has resides in the same household as the defendant C. History US law historyAZ law history D. Statistics",{"id":5571,"title":5572,"titles":5573,"content":5574,"level":9},"\u002Fwst-outline#acadv","ACADV",[],"A. Formed in 1980 to: Increase public awareness about DVEnhance safety and services for DV victimsReduce incidents of DV in AZ families\nB. StatementMission statement\nMission:\nTo lead,\nto advocate,\nto educate,\nto collaborate,\nto end domestic violence in Arizona.Vision Statement\nWe envision living in a world where there is equality, safety, justice and\npeace for all.\nC. Guiding Principles (1 - 7)right to self-direction of livesSafety, health, and justice for all abused women in Arizona.Abusers must be held accountable for their actions.There are multiple factors that contribute to domestic violence. (intersectionality)Must find roots of violenceAll members of society deserve to have their voice heard and to participate actively in the development and evaluation of the policies and practices that affect them.All people are valuable members of the community and deserve to be treated with dignity. D. Strategies Informative website\na. Instructions for keeping others from knowing you visited their siteHotlinesShelters (maybe referrence)Training\na. Legal advocacy training\nb. Hotline training\nc. basic tools and information about domestic violence, safety planning, empowerment, advocacy, legal issues, community coordination, and crisis intervention.\nd. Legislative Advocacy\ne. Confidentiality Training\nf. Representation of Domestic Violence advocacy (speaking about DV)\ng. Community-based Trainings - Various communities, organizations, agencies and programs can request a training or presentation from AzCADV. These requests are fulfilled first on a priority basis (DV Providers, Tribal or Rural communities) and then by availability of staff.Library -- people can check out books on DV E. Strengths Lots of information disemination\na. website\nb. pamplets\nc. statisticsLots of references to the organization -- make it easy to findLots of resources F. Weaknesses Website not as easy to use as it could beNot enough education\u002Finformation targeting men (on website and in their trainings) (have reference, but no direct work)",{"id":5576,"title":5577,"titles":5578,"content":45,"level":9},"\u002Fwysiwyg","WYSIWYG",[],{"id":5580,"title":5581,"titles":5582,"content":5583,"level":56},"\u002Fwysiwyg#what-you-see-is-what-you-get","What You See Is What You Get",[5577],"In a lot of ways WYSIWYG-style user interfaces are a Good Thing, they help people use the machine without thought. Sometimes, however, it will hurt them in the end and it is better to use non-WYSIWYG interfaces.",{"id":5585,"title":5586,"titles":5587,"content":5588,"level":9},"\u002Fwanda-vision-jam","Wanda Vision Jam",[],"Jam with Theo -- banging drums, strumming bass, and making up nonsense about Wanda Vision! (download) Theo and I went over to 7DrumCity and jammed for a while. He and Sacha were telling me about Wanda Vision, which I haven't seen at all, so I started to make up a song. A delightful time was had by all!",{"id":5590,"title":5591,"titles":5592,"content":5593,"level":9},"\u002Fwayv","WayV",[],"From Mike Bennett's WayV page, WayV is...",{"id":5595,"title":5596,"titles":5597,"content":45,"level":9},"\u002Fwayv#experiment-with-human-computer-interaction-especially-gesture-based-computing","Experiment with human computer interaction, especially gesture based computing.",[],{"id":5599,"title":5600,"titles":5601,"content":5602,"level":9},"\u002Fwayv#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.",[],"The main site is at http:\u002F\u002Fwww.stressbunny.com\u002Fwayv\u002F and the current version is 0.3 (released 2003-08-14).",{"id":5604,"title":261,"titles":5605,"content":5606,"level":15},"\u002Fwayv#code",[5600],"You can get my modifications to this app via: darcs get http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fc\u002Fwayv 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.",{"id":5608,"title":1446,"titles":5609,"content":5610,"level":15},"\u002Fwayv#plan",[5600],"I'm exploring data input mechanisms for the Openmoko, 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. Things to add: Per-app or other context-sensitive gesturesPass-through to the app below when no gesture is recognized, especially clicksSomehow differentiate between long and short strokes?\nThis looks to be outside the gesture recognition algorithm WayV usesCould maybe tile a couple WayV instancesCould maybe just include a \"size\" metric for the action to utilizeFlickerless refreshConfigure whether lines are drawn on the screen Things to augment: Kenetic scrolling\nA \"down\" command would send down keypresses at a slowing rateInterrupt\u002Faugment a running key-animation upon the next pressCould be a separate app altogetherConfig chooser\nPress aux button to get list of configsHopefully context-sensing will work so this won't be necessaryMight be nice in the meantime!",{"id":5612,"title":5613,"titles":5614,"content":5615,"level":9},"\u002Fweb-application-techniques","Web_Application_Techniques",[],"These are notes in preparation for a talk I'll be giving to LUNA.",{"id":5617,"title":5618,"titles":5619,"content":5620,"level":15},"\u002Fweb-application-techniques#client-server-structure","Client \u002F Server Structure",[5613],"The basic structure of the web is one of clients and servers. A web server sits around waiting for someone to request a document from it. That someone is a client. The basic steps are these:",{"id":5622,"title":5623,"titles":5624,"content":45,"level":9},"\u002Fweb-application-techniques#client-requests-document-httpwwwyahoocom","Client requests document (\"http:\u002F\u002Fwww.yahoo.com\u002F\")",[],{"id":5626,"title":5627,"titles":5628,"content":45,"level":9},"\u002Fweb-application-techniques#server-receives-request","Server receives request",[],{"id":5630,"title":5631,"titles":5632,"content":45,"level":9},"\u002Fweb-application-techniques#server-looks-for-document-and-returns-it-to-the-client","Server looks for document and returns it to the client",[],{"id":5634,"title":5635,"titles":5636,"content":5637,"level":9},"\u002Fweb-application-techniques#client-displays-the-document","Client displays the document",[],"Turning this into an interactive situation is quite easy, really. All we have to do is modify step 3. Instead of the webserver finding and returning a document, we have the webserver execute a program and we return the result. And voila! We now have a web-based application. There is a hitch with this simple method of allowing a client to request the result of a computation through a webserver. In a word -- \"state\".",{"id":5639,"title":5640,"titles":5641,"content":5642,"level":9},"\u002Fweb-board-games","Web_Board_Games",[],"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. Code: darcs get http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fwebboardgames",{"id":5644,"title":5645,"titles":5646,"content":5647,"level":9},"\u002Fweb-programming-with-contize","Web_Programming_With_Contize",[],"Contize was developed specifically to abstract away some of the difficulties of creating web-based applications. Unfortunately it significantly altered what I would call ''intuitive'' web programming. Now various state-maintenance techniques can be replaced with more traditional (and straightforward) programming.",{"id":5649,"title":5650,"titles":5651,"content":5652,"level":15},"\u002Fweb-programming-with-contize#the-goal","The Goal",[5645],"Eventually we are going to be writing code in a style that is reminiscent of a command-line script. As a very brief example, you might see code like: From the user's view this would be three web pages. A page asking for the first number, a page asking for the second number, and a page displaying their sum. Notice that we send and receive input and output to the user in a much more direct fashion that in standard CGI script style.",{"id":5654,"title":5655,"titles":5656,"content":5657,"level":15},"\u002Fweb-programming-with-contize#additional-tools","Additional Tools",[5645],"Alone, Contize significantly changes the approach to web programming. There are, however, some other existing and important tools which we should continue to use. The idea of Model-View-Controller is still very applicable, and I will use some of that terminology here. Contize helps us build controllers. For applications which use a database as their back-end, I suggest cpan:Class::DBI or something similar for the Model component. A template system is useful for the View component, and I prefer a subset of the functionality provided by cpan:Embperl. Some of my ideas on this topic are spelled out in Thoughts and issues with web-based DB programming.",{"id":5659,"title":5660,"titles":5661,"content":5662,"level":15},"\u002Fweb-programming-with-contize#getting-started","Getting Started",[5645],"Since Contize works on objects, we need for our application to be an object. What we will do is set up a wrapper script which takes care of some initialization for us and manages an instance of our object. The wrapper needs to: Set up the sessionSave\u002FRestore our main application object to the sessionExecute the main entrypoint method of our application object The first thing you need to be able to do is save and restore an object in your session. I've been using cpan:CGI::Session for this, though it has one quirk I haven't figured out how to get around yet. This isn't a new thing for web programming really... but Contize gives us an extra trick. The object we are putting into the session gets suspended practically in the middle of an operation, and upon reentrance its execution is resumed right where it left off. So really we are storing only one object (the application), and all the other pieces should be instance variables of that object. Do what you want though.",{"id":5664,"title":5665,"titles":5666,"content":5667,"level":15},"\u002Fweb-programming-with-contize#going-on-from-here","Going On From Here",[5645],"Well... truth be told I got tired of describing what to do and decided to do what to do. I've packaged up this wrapper script, and will continue to make improvements upon said script, under the name of Continuity. The above information is still quite appropriate if you are writing your own wrapper to utilize Contize or similar without Continuity, or perhaps if you are trying to integrate Contize into a different, yet existing, framework. The information above is not nearly complete, however. So if you want to do one of these things I suggest you look at the very simple internals of Continuity and\u002For email me.",{"id":5669,"title":870,"titles":5670,"content":5671,"level":15},"\u002Fweb-programming-with-contize#see-also",[5645],"http:\u002F\u002Fcsoki.ki.iif.hu\u002F~vitezg\u002Fimpostor\u002F - A similar framework for Python. They use an Apache module though... cheating I'd say :)Contize - The Perl module on which this is basedContinuation-based Web Programming - The concept on which this is based",{"id":5673,"title":5674,"titles":5675,"content":5676,"level":9},"\u002Fweb-of-beliefs","Web-of-Beliefs",[],"Part of Quine's epistemology. May he rest in peace.",{"id":5678,"title":5679,"titles":5680,"content":5681,"level":9},"\u002Fwhat-do-creatures-dream","What_Do_Creatures_Dream",[],"What do creatures dream?\nCan they tell the difference\nBetween a dream and reality? Even we\nSometimes\nCannot When we awake in the night\nsoaked in fear and sweat\nready to run for our lives When we solve the problem\nwe'd been stuck on\nfor days? Does the dog dreaming\nof catching his prey\nwake up happy? Does he fight his friend\nif just last night\nhe was being attacked? Does the baby bird\nlearn to soar\nthe same way we did? Dream it first,\ntry it awake,\nthen succeed? What if we did not dream? (written 2009.02.22)",{"id":5683,"title":5684,"titles":5685,"content":5686,"level":9},"\u002Fwhite-elephant-gift-selecter","White_Elephant_Gift_Selecter",[],"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! I'm looking forward to porting to Perl6 once rakudo-js is working :) https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fwhite-elephant -- Clojurehttps:\u002F\u002Fgithub.com\u002Fawwaiid\u002Freactrb-elephant -- Rubyhttps:\u002F\u002Fgithub.com\u002Ffkchang\u002Fopal-hot-reloader -- Opal Hot Reloader",{"id":5688,"title":5689,"titles":5690,"content":5691,"level":9},"\u002Fwhite-roses","White_Roses",[],"Listen:  (download) Artist: Brock Wilcox, Sacha\nCopy and Share: under the terms of Creative Commons Attribution-NonCommercial license! Chords: AGDE\nAGDE\nACFG\nDEBC",{"id":5693,"title":5694,"titles":5695,"content":5696,"level":9},"\u002Fwiki","Wiki",[],"Well, I've decided that I want to have some content on my website besides a bunch of broken directories, so I'm going to utilize my wiki for overviews of content and then point to the directories from there. I've tried all kinds of things in the past -- making indexes in each directory describing it, automatically basiing descriptions on files... xml, mhtml, straight perl... but none of them are sustainable because they are too difficult to maintain (because it takes effort). So now we try the wiki way! This wiki can do mathematical markup. See my list of Projects. doo dah CSS for this wiki: TLT WIKI CSS file:\u002F\u002Fprojects\u002F",{"id":5698,"title":5699,"titles":5700,"content":5701,"level":9},"\u002Fwiki-docs","Wiki_Docs",[],"These are documents in the wiki (as opposed to in a LaTeX file as the source). Thoughts on Automatic ParallelizationPerl hashref iteration exampleOn Adding a True Predicate Logic Layer to Relation Databases",{"id":5703,"title":5704,"titles":5705,"content":5706,"level":9},"\u002Fwiki-home","Wiki_Home",[],"Welcome to thelackthereof.org wiki. I've decided that I want to have some content on my website besides a bunch of broken directories, so I'm going to utilize my wiki for overviews of content and then point to the directories from there. I've tried all kinds of things in the past -- making indexes in each directory describing it, automatically basing descriptions on files... xml, mhtml, straight perl... but none of them are sustainable because they are too difficult to maintain (because it takes effort). So now we try the wiki way! Also, a lot of my friends have, over the years, taken to keeping online journals. This is sort of a social phenomenon -- it is a neat way to keep a whole lot of people up-to-date on the happenings in your life and visa versa. I did it for a while, but I am too distractable and inconsistent for it to work out in a nice neat little way. I've decided that I will create a different sort of an online journal here in the form of a Quinean Web of Beliefs. Sort of. When I do have date-based things, I'll put them in TLT. Best of both worlds! Because of the nonlinear nature of my design, please keep in mind that just wiki pages get old and the ideals of the author change. The Edited Date will give you clues... but only clues unfortunately. That's the tradeoff for being nonlinear! Oh, and unless specified otherwise, all reflexive personal pronouns (\"I\", \"my\", \"me\") refer to me (Brock). But that doesn't mean that you can't contribute! In fact, please leave me a comment! Just go to Comments on The Lack Thereof Things to do here: View my Resume and job-related information.Please play and learn wikiness in the SandBox!This wiki can do Mathematical Markup.See my list of Projects.Learn about my Docs.Look at the CSS for this wiki, TLT WIKI CSSIdeasText Formatting RulesImage Upload TestOutside NewsCS421 - Fall 2003White ThemeNormal Theme",{"id":5708,"title":5709,"titles":5710,"content":5711,"level":9},"\u002Fwilcox-waddell-halloween-hayride","Wilcox_Waddell_Halloween_Hayride",[],"Lots to put down here, history etc. This was an annual hayride that was primarily organized by Kandy Wilcox in the community of Waddell, Arizona (near the foothills of the Whitetank Mountains, the far west of the Phoenix valley). I think that the first year was 1985. Kandy had 2 children of her own, and ran a home babysitting service. The area was very rural, and on this night she had an additional babysitting child to tend to -- she wanted to take them trick-or-treating. The nearest residential area of any density was Waddell, AZ, an unincorporated township but one with actual houses and families. The kids loved it. The second year, Kandy talked her husband into throwing some bales of hay into the back of a pickup to make it a real hayride. Now several kids went along, though it was a bit tough to get them in and out of the truck at each house. But it was still very fun. The third year they got a small trailer and put a few bales of hay on that. They made it a bit more open invitation, and had a dozen or two kids. Each year got bigger and bigger. By the end, 13 years later (1998), the event had built up to a community wide gathering that lasted two days. On the first day, October 30th, everyone would meet in a lot and decorate the trailers. There were 3 or 4 trailers, each donated and hauled by someone in the community. We'd build posters and signs that said \"Wilcox-Waddell Halloween Hayride\". People would bring snacks and dessert -- there was a contest and a prize for the best food. We had apple bobbing and did some fun Halloween songs. The second night, October 31st, would be the hayride itself. Before the ride started, there was a costume contest divided into age groups. Prizes were things like movie passes, or special treats, and the funds were donated by local businesses and individuals. At a set time, the kids would load up and the trailers would spread out through the streets, going up and down each row of houses and stopping every other house or so. Kids would pour off of the trailers, run to houses yelling \"trick-or-treating!\" and showing off their costumes. Then they'd jump back on the trailer and ride down a few more houses. So why did it end? I don't know for sure, but among other things I think that the community started growing incoherent. Waddell itself grew quite a bit, and the neighborhood where the hayrides took place started to become the small neighborhood on the outskirts of the main developments. The community fractured, and the tradition was lost. It will, however, be remembered with fondness for an entire generation of children and families.",{"id":5713,"title":5714,"titles":5715,"content":5716,"level":9},"\u002Fxmonad-window-manager","XMonad_Window_Manager",[],"XMonad is a tiling window manager written and configured in Haskell. I switched to it from the Ion Window Manager, and am pleased. It gives me everything that ion2 did (and everything ion3 would have if I ever upgraded), and seems to do some things even better (such as dealing with dynamic screen changes, like rotation or adding a 2nd screen (projector)).",{"id":5718,"title":5719,"titles":5720,"content":5721,"level":9},"\u002Fyo-oliver","Yo_Oliver",[],"Un-Mixed:  (download) Artist: Sacha (writing, music, lyrics), Brock (mixing)\nCopy and Share: under the terms of Creative\nCommons Attribution-NonCommercial license! I know a dog\nAnd he's my friend\nHis name is Oliver\nOliver Boliver I know a dog\nAnd he's so cool\nHis name is Oliver\nOliver Boliver Yo Oliver\nYou're so cool\nYo Oliver\nYou rule Walks in the park\nAnd doggie treats\nAre all his favorites\nYeah all his favorites He likes his naps\nHe likes to sleep\nAnd everyone loves him\nEveryone loves him Yo Oliver\nYou are really fun\nYo Oliver\nLoved by everyone",{"id":5723,"title":5724,"titles":5725,"content":5726,"level":9},"\u002Fzend-hacking","Zend_Hacking",[],"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. 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. Tips \u002F Documentation recommendations are appreciated if anyone out there knows of some magical wiki in the sky diagraming and analyzing all the components.",{"id":5728,"title":1322,"titles":5729,"content":5730,"level":15},"\u002Fzend-hacking#goal",[5724],"Well for anyone who doesn't know, I am obsessed with Continuation-based Web Programming. To this end I've created Contize 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. So I want a few functions: contize($function_name) - Indicate a function\u002Fobject that I want to be a continuation\nor perhaps call($func_name, $arg_array) - like callccyield $val - Indicate where the continuation exits$serial = serialize_continuation($function_name) - Serialize the continuationunserialize_continuation($serial) - De-Serialize the continuation So maybe like:\nmake_continuation(\"func\");\n$result = func($p1, $p2, ...);\n$s = serialize_continuation(\"func\");\nunserialize_continuation($s);\nfunc($p1, $p2, ...);",{"id":5732,"title":5733,"titles":5734,"content":5735,"level":9},"\u002Fzend-hacking#","...",[],"function func($p1, $p2, $p3) {\n# stuff\nyield $result1;\n# stuff\nyield $result2;\n# stuff\nreturn $result3 ;\n}",{"id":5737,"title":5738,"titles":5739,"content":5740,"level":15},"\u002Fzend-hacking#files","Files",[5733],"http:\u002F\u002Flxr.php.net\u002Fsource\u002FZendEngine2\u002Fzend_globals.h - especially see the Zend Executor Globals (and maybe the compiler gloabals too)",{"id":5742,"title":2300,"titles":5743,"content":5744,"level":15},"\u002Fzend-hacking#notes",[5733],"OK, I have a basic thing going now. Just ripped stuff out of various examples and grabbed call_user_func_array. hold the current status of a callhold the return state, or a set of pointers, so we can jump directly out of a func call -- save the current state for a later yield. Initialize\u002Frestore the continuation state for the function we're calling 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 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. Should the continuation state be stored by-name of the function? I should look at other documentation on partial continuations to see if there is a standard naming scheme for all of this. OK, here's an idea -- we abuse the exception handler framework a bit. So the code pretends to be like this: try {\nccall('func',$p1,$p2,...);\n} catch(cont) {\n\u002F\u002F Do nothing, just continue\n} 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.",{"id":5746,"title":5747,"titles":5748,"content":5749,"level":9},"\u002Fzero-one-infinity","Zero_One_Infinity",[],"Night then day then night\nZero, one, infinity\nThe stages of life (Comments on Zero One Infinity)",{"id":5751,"title":5752,"titles":5753,"content":5754,"level":9},"\u002Fzombie-love","Zombie_Love",[],"Recorded March 27 with Liz on guitar (download) (With help from Liz and Jason)",{"id":5756,"title":5757,"titles":5758,"content":5759,"level":9},"\u002Fa-bit-of-random-nothing","a_bit_of_random_nothing",[],"This is a page about nothing.  It should be blank, but that might be a bit confusing to the reader so I have opted to insert pointless text instead.",{"id":5761,"title":5762,"titles":5763,"content":5764,"level":9},"\u002Fa-link-to-a-new-page","a_link_to_a_new_page",[],"DeletePage\nDescribe the new page here.\nInteresting concept...\nWhat an unusual comment... HOHOHOHO",{"id":5766,"title":5767,"titles":5768,"content":5769,"level":9},"\u002Fawwaiid","awwaiid",[],"This is my login, screen name, sign-in, handle, nick, and so on. It stands for and means \"A word whose acronym is its definition.\"",{"id":5771,"title":5772,"titles":5773,"content":5774,"level":9},"\u002Fbin-service-pattern","A DX\u002FDevOps Pattern: bin\u002Fservice",[],"One pattern I like a lot is a bin\u002Fservice wrapper. In each of your services (I like to call them Macro Service instead of Microservice). One pattern I like a lot is a  wrapper. In each of your services (I like to call them Macro Service instead of Microservice). The idea is to provide a few key things: Simple tools for developers to manage the serviceLifecycle hooks for deploymentAll wrapped up in code, providing executable self-documentation Imagine this: These service-oriented commands don't really care what your internal-app tech stack is. But by standardizing the commands you can depend on them in a bunch of contexts. The most important is that you can run them both in your dev env, and then the lifecycle hooks can be part of a helm chart setup. You can have one generic chart that can manage any service that conforms to this general shape.",{"id":5776,"title":5777,"titles":5778,"content":5779,"level":9},"\u002Ficfp2006","icfp2006",[],"info about icfp2006 The Cult's scholarly publications are of particular interest to us. Because the Cult's journals were circulated on sandstone tablets, editors imposed very strict length limitations. Consequently, authors aggressively compressed their articles. A typical publication would have the following form:\nPUZZL.TSK=100@1001|14370747643c6d2db0a40ecb4b0bb65 Should you encounter any such publications, we humbly request that you submit them to us via our web site. Our server will track all submitted publications, ensuring that every participant is given appropriate credit for advancing our understanding of the codex. Publications are of varying value; some will represent a greater contribution than others, and we will take this into account when assigning credit.",{"id":5781,"title":5782,"titles":5783,"content":5784,"level":9},"\u002Fjoy","joy",[],"Describe the new page here.\ntest",{"id":5786,"title":5787,"titles":5788,"content":5789,"level":9},"\u002Fkari","kari",[],"http:\u002F\u002Fcosketch.com\u002FRooms\u002FaRTlUxS",{"id":5791,"title":5792,"titles":5793,"content":5794,"level":9},"\u002Fn900","n900",[],"The Nokia n900 is a computer that happens to be a phone, much like the Openmoko. It runs a Debian derivative called maemo5. I have one and I LOVE IT.",{"id":5796,"title":5797,"titles":5798,"content":5799,"level":9},"\u002Fshares","Shares",[],"I use Feedly to subscribe to a bunch of websites and blogs and such. When I see something that is interesting I tag it and bag it. Here is the raw shares.rss.xml. I also share thoughts or commentary on the 'share' tag.",{"id":5801,"title":5797,"titles":5802,"content":5799,"level":9},"\u002Fshares#shares",[],{"id":5804,"title":5805,"titles":5806,"content":5807,"level":9},"\u002Fshares#tech-note","Tech Note",[],"Feedly is a bit evil and doesn't give rss feeds for \"boards\" aka tags of my articles. So I bounce it through zapier and then through a nuxt route to get it to the above link. FUN!",{"id":5809,"title":5810,"titles":5811,"content":5812,"level":9},"\u002Fsports.txt","sports.txt",[],"{ \"levels\": \n{\n\"name\": \"ONE\",\n\"locked\": false,\n\"stars\": 3,\n\"logos\": [\n{\n\"name\": \"stockings\",\n\"points\": 1000,\n\"answers\": [\n\"Red Sox\"\n],\n\"hints\": [\n\"red\",\n\"socks\"\n]\n},\n{\n\"name\": \"stockings\",\n\"points\": 1000,\n\"answers\": [\n\"Red Sox\"\n],\n\"hints\": [\n\"red\",\n\"socks\"\n]\n}\n]\n},\n{\n\"name\": \"TWO\",\n\"locked\": true\n},\n{\n\"name\": \"THREE\",\n\"locked\": true\n},\n{\n\"name\": \"FOUR\",\n\"locked\": true\n} }",{"id":5814,"title":5815,"titles":5816,"content":5817,"level":9},"\u002Ftest-page","test_page",[],"Well... I do like things. asdf",[5819,5982,6064,6199,6225,6273,6378,6512,6902,6932,6991,7158,7240,7517,7664,7869,8017,8195,8514,8668,8771,8900,9096,9130,9642,9902,9981,10031,10208,10223,10257,10295,10494,10593,10703,10832,11043,11119,11193,11303,11383,11467,11602,11704,11808,11894,11957,12045,12123,12182,12443,12524,12693,12756,12831,14074,14150,14466,14593,14618,14674,15142,15181,15245,15536,15855,15874,15935,15958,15992,16758,17409,17505,17660,17811,17856,17942,17978,18374,18434,18468,18737,18829,18926,18960,19026,19068,19165,19247,20038,20143,20363,20396,20602,20626,20792,20833,20864,20971,21022],{"id":5820,"title":4945,"body":5821,"createdAt":5971,"description":5827,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":5975,"navigation":5976,"path":4944,"seo":5977,"stem":5978,"tags":5979,"updatedAt":5971,"__hash__":5981},"content\u002FTLT - 2026.05.16 - Summer Job Samba Interview.md",{"type":5822,"value":5823,"toc":5969},"minimark",[5824,5828,5831,5837,5840,5843,5846,5849,5856,5859,5862,5865,5868,5870,5873,5876,5879,5882,5885,5888,5891,5894,5897,5900,5903,5905,5908,5911,5914,5917,5920,5923,5926,5929,5932,5934,5937,5940,5943,5957,5960,5963,5966],[5825,5826,5827],"p",{},"First you get the job Fixing Samba. Then you get the book so you can learn how to Fix Samba. Then you figure out what the actual job entails (... which is not Samba).",[5829,5830],"hr",{},[5825,5832,5833],{},[5834,5835,5836],"em",{},"Names and identifying details have been changed to protect the innocent. I'm probably not making this up.",[5825,5838,5839],{},"Once upon a time, one summer in college, I was staying in Tempe with my girlfriend's family and I needed to get a summer job. I didn't really have any particular ideas about what job I should get. I was even thinking, I don't know, maybe a hotdog stand at the mall or something.",[5825,5841,5842],{},"I was walking down Mill Avenue when I saw one of these businesses that exist inside of a cottage house, with a sign out front that said \"Web Design.\" A couple of people were leaning up against a car talking, and I sauntered up and asked if they were hiring.",[5825,5844,5845],{},"They said, well, what do you know? What do you do?",[5825,5847,5848],{},"I told them I know a little bit of this, a little bit of that - some web applications, some maybe a little sysadmin Linux-y stuff.",[5825,5850,5851,5852],{},"And they asked if I knew Samba. ",[5853,5854,5855],"span",{},"ed: Samba is more or less a Linux application that acts as a Windows file server. Like the L: drive at your work",[5825,5857,5858],{},"And I said, sure.",[5825,5860,5861],{},"They said, well, tell you what. Nice to meet you. My name is Mark. Come over tomorrow at 10 AM, and if you can get our Samba server back up and running, you've got yourself a job.",[5825,5863,5864],{},"I said, great. Sounds like a plan. See you tomorrow.",[5825,5866,5867],{},"And I walked on. Two or three blocks over to Barnes and Noble, to the computer section, where I got myself a book on Samba and started reading. I had surely done something with Samba before, but it had been a little while. I don't think I actually bought the book, but it was helpful to er ... refresh some details.",[5829,5869],{},[5825,5871,5872],{},"The next day I showed up, awkwardly knocking on the door. Someone let me in and took me back to Mark. They had sort of a front of house and a back of house, and way in the back was where Mark's office was. I imagine this was originally a 2-bedroom cottage.",[5825,5874,5875],{},"He took me around to the server room - a literal closet, but it had a keyboard and a screen and a pretty nice rack-mounted Dell server. He gave me the root password.",[5825,5877,5878],{},"Up front they had computers all wired into a network with a shared drive. The machines were all Windows, and they couldn't access the drive. So I poked around the machines a bit, messed with Samba a bit, and just kept digging around until I finally found some configuration option that wasn't quite right. Got it working. Went and chatted with Mark.",[5825,5880,5881],{},"He was pretty happy.",[5825,5883,5884],{},"He said, well, what kind of money are you looking for? We hadn't actually discussed that up to this point.",[5825,5886,5887],{},"I said, well, I'm looking for something that's an alternative to a hotdog stand.",[5825,5889,5890],{},"He said, how about $10 an hour?",[5825,5892,5893],{},"I said, sure. That'll do.",[5825,5895,5896],{},"What kind of hours?",[5825,5898,5899],{},"He said, well, we usually start a little late, stay a little late. It'll be PHP web development.",[5825,5901,5902],{},"Congratulations. I got the job. Start tomorrow.",[5829,5904],{},[5825,5906,5907],{},"I can't remember if they gave me a key or if the door was just unlocked. But either way, it was a good thing because I rolled in the next day around 9 AM, wanted to get a good start. Nobody there. I had a machine Mark had put on a table which I assumed was mine, and I started doing all my setup.",[5825,5909,5910],{},"Around 10. Nobody.",[5825,5912,5913],{},"Around 11, Mark finally came in and started telling me about the different projects we'd be working on.",[5825,5915,5916],{},"He had a collection of clients, each with their own specific project setup - usually PHP, sometimes a little WordPress. He'd give me the specifics and give me access to the files, sometimes through an FTP server. Usually I had to almost start from scratch on the development setup, then push up to their server once I had something running.",[5825,5918,5919],{},"The weird thing, though, was that I would get just one or two bugs fixed and he'd have me move on to another client. Get one or two bugs fixed, then on to a different client. Each one getting a relatively tiny amount of work.",[5825,5921,5922],{},"What I realized was that he was putting off all of these folks. There had previously been some developers, and I don't know how long it had been since they left, but he was scrambling to stay ahead of angry customers. It seemed like all of his clients were angry clients - over-promised and under-delivered - and I was doing just enough work on each of them to make them think progress was being made.",[5825,5924,5925],{},"Meanwhile, I started to get familiar with the secondary (or was it primary?) business: a nightlife lifestyle magazine operated out of the front of house. They had a couple of graphic designers, photographers, and an editor, and there was an endless stream of both beautiful people and beautiful photos and lots and lots of advertisements going into these glossy pages. They published weekly or maybe biweekly.",[5825,5927,5928],{},"The magazine ran on Photoshop and PageMaker. And sitting right there on that shared drive - the same drive I'd spent my trial interview getting back online - was not only all of their content, but all of their software. With clearly cracked serials. Lots of password.txt and registration_keytxt.crackz files. Lots and lots of professional-grade software, very much not paid for.",[5825,5930,5931],{},"It was increasingly obvious that this place operated using any means necessary to cut corners and get things out the door.",[5829,5933],{},[5825,5935,5936],{},"The front of house was run by another guy named Marc - Marc with a C - who was in charge of the magazine. Mark with a K was in charge of the web stuff, the investor, the business partner. There was also a main layout editor who did a lot of the heavy lifting. Sometimes when I came in around 8am or 9am, he'd already be there.",[5825,5938,5939],{},"I'd say, you got an early start?",[5825,5941,5942],{},"He had not, in fact, left from the night before. Pounding energy drinks (and who knows what else). Printer deadline!",[5825,5944,5945,5946,5956],{},"Meanwhile, the biggest perk I had was a fridge full of Sobe ",[5853,5947,5948,5949],{},"ed: A sugary fruit drink in a glass bottle with some cool lizards; see ",[5950,5951,5955],"a",{"href":5952,"rel":5953},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSoBe",[5954],"nofollow","SoBe on wikipedia",". I am partial to orange Sobe, and I had an unlimited supply. They tended to play house and techno music, pretty loud, all the time.",[5825,5958,5959],{},"It was cool. A little weird. Had sort of a shady vibe. OK maybe very shady.",[5825,5961,5962],{},"Between the beautiful people in the front of the house and me stuck way in the back, this random guy who just handed me his root password as a trial interview, helping rob Peter to pay Paul in terms of software development, the heavy ad-based front business - I never really felt like I quite knew what was going on.",[5825,5964,5965],{},"And I didn't realize it would just keep going, getting stranger as we went all summer.",[5825,5967,5968],{},"Definitely more interesting than working at a hotdog stand in the mall.",{"title":45,"searchDepth":15,"depth":15,"links":5970},[],"2026-05-16",false,"md",null,{},true,{"title":4945,"description":5827},"TLT - 2026.05.16 - Summer Job Samba Interview",[5980],"blog","msvQ8HmDs8fqjpIlWAWGNjISvulwxcU2B7T6yC_a2rU",{"id":5983,"title":4940,"body":5984,"createdAt":6057,"description":6058,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":6059,"navigation":5976,"path":4939,"seo":6060,"stem":6061,"tags":6062,"updatedAt":6057,"__hash__":6063},"content\u002FTLT - 2026.03.08 - Agent-Researcher Helping With reMarkable Ghostwriter.md",{"type":5822,"value":5985,"toc":6055},[5986,5992,5995,6046,6049,6052],[5825,5987,5988,5989,5991],{},"With ",[5950,5990,1470],{"href":1469}," I inject pen input on the device to show the output of LLM (Claude, ChatGPT, Gemini, etc) on-device. But the result is a bit messy. So here I give Claude Code some direction and access to the device to iterate experimentally!",[5825,5993,5994],{},"Here is my initial prompt:",[5996,5997,5998,6006,6009,6012,6040,6043],"blockquote",{},[5825,5999,6000,6001,6005],{},"I would like to perfect drawing on the reMarkable using the pen, which can then be used to more quickly draw SVG or images to the screen using the injected pen input. Toward this end, I want you to set up an experiment loop. I have the remarkable available via ",[6002,6003,6004],"code",{},"ssh rmpp"," where you can run remote commands, including test commands that we scp over. We could also set up a remote-control that can act as a tool, so like a cli debug version of ghostwriter that runs one command and exits or accepts commands over http or something like that. In any case, you can run code on the thing and treat it like a remote-computer-use situation -- take screenshots, inject input, take a screenshot to verify the result. You can send pen and touch input. You can get a new page by swiping from right to left and then tapping the new-page icon that comes up on the right side, for example. You can tap on the tools menu, the tiny circle in the upper-left, and use that to see tools. You can tap with two-fingers at once to undo.",[5825,6007,6008],{},"So what I want is for you to bootstrap up some experiments to verify your capabilities, ultimately leading to an improvement in the drawing tools for ghostwriter -- especially the ability to accurately render SVG and png content using the injected pen input.",[5825,6010,6011],{},"For example, you could iteratively (by a series of screenshots and pen\u002Ftouch injection) verify that you can accurately:",[6013,6014,6015,6019,6022,6025,6028,6031,6034,6037],"ul",{},[6016,6017,6018],"li",{},"Draw a horizontal line",[6016,6020,6021],{},"Draw a vertical line",[6016,6023,6024],{},"Draw a diagonal line",[6016,6026,6027],{},"Draw a dot at any x\u002Fy coordinate",[6016,6029,6030],{},"Draw a triangle",[6016,6032,6033],{},"Draw a single dot",[6016,6035,6036],{},"Draw a png as a bunch of dots",[6016,6038,6039],{},"Trace an SVG",[5825,6041,6042],{},"Between each you could send a bunch of undo-touches or try to go to a new page so that you can see what is happening. You can also experiment with being able to quickly change between tools. There are two pens, so one idea is that pen-1 is for the human and pen-2 is for ghostwriter.",[5825,6044,6045],{},"From these series of built up experiments we should be able to document how to interact accurately and reliably with the screen to render content via pen input.",[5825,6047,6048],{},"That got it going really well. I had to give it a bunch of permissions to get the loop going, but soon it was trying something, taking a screenshot, deciding on the result, and then trying something else. I also had to steer it a bit to be more precise... it kept concluding \"give or take 5px is fiiinneeee\".",[5825,6050,6051],{},"It built an \"experiment\" binary that takes cli commands to draw. I had to coach it a bit on clearing the screen or getting a new screen, and how to avoid (or on purpose utilize) the tool menu. Now step by step it is getting better and better at pen drawing. We are working our way up to drawing smooth polylines from svgs and even outline fonts.",[5825,6053,6054],{},"The general technique of giving Claude Code a way to observe results and an overall goal (even a vague one like \"be better\" or \"increase accuracy\") works really well. Now it is chomp chomp chomping on tokens and doing small experiments to find bugs and alternate techniques for operating the reMarkable.",{"title":45,"searchDepth":15,"depth":15,"links":6056},[],"2026-03-08","With Ghostwriter I inject pen input on the device to show the output of LLM (Claude, ChatGPT, Gemini, etc) on-device. But the result is a bit messy. So here I give Claude Code some direction and access to the device to iterate experimentally!",{},{"title":4940,"description":6058},"TLT - 2026.03.08 - Agent-Researcher Helping With reMarkable Ghostwriter",[5980],"ht_IK0l0Npj059K9TkPPJdFBiirwkyf8-cQT5XUTY4w",{"id":6065,"title":4900,"body":6066,"createdAt":6193,"description":4902,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":6194,"navigation":5976,"path":4899,"seo":6195,"stem":6196,"tags":6197,"updatedAt":6193,"__hash__":6198},"content\u002FTLT - 2026.02.22 - Modern Coding Discomfort, or, Four Colors Suffice.md",{"type":5822,"value":6067,"toc":6185},[6068,6070,6074,6077,6080,6083,6086,6089,6092,6095,6098,6101,6104,6107,6110,6113,6116,6119,6122,6125,6128,6131,6134,6137,6140,6143,6146,6149,6152,6155,6158,6161,6164,6167,6170,6173,6176,6179,6182],[5825,6069,4902],{},[6071,6072,4905],"h2",{"id":6073},"four-colors-suffice",[5825,6075,6076],{},"There is this little puzzle called the map coloring problem. If you have a map - let's say of countries - and you have some different colored crayons, you need to fill in each country so that no two countries touching each other share the same color.",[5825,6078,6079],{},"In the 1970s, mathematicians finally worked out a proof that you only need four colors. The problem is that, unlike many proofs before it where you'd come up with some cool underlying pattern or elegant structure, the proof they came up with was to first enumerate all of the different possible equivalent configurations of a map. This is pretty cool - but it came out to something like just under 2,000 different combinations. Using 1970s computing technology, the proof was to get a computer to go through every single combination and demonstrate, for every single one, that you could color it with only four colors directly or through a simplifying transformation.",[5825,6081,6082],{},"Mathematicians at the time found this very, very unsatisfying. The only way to understand the proof was to read through every possibility, which was kind of crazy. There was nothing special in the solution - it felt like a coincidence that four colors suffice. It boiled down to pages and pages of \"I tried combination one. That one worked. I tried combination two. That one worked.\" All the way through, with no underlying structure, no unique beauty, and nothing you could really build anything else on top of.",[5825,6084,6085],{},"Here we are in 2026, and in software engineering people keep putting up pull requests which are not small and elegant. They solve the problem, and yet they are dissatisfying. They are too long to read. Submitting the pull request makes us feel like we have not provided meaning, only an answer. A maintainer trying to work through a flood of large pull requests is like looking for the pattern in the four color theorem. It is not there - because it turns out it doesn't need to be there in order to solve the problem.",[5825,6087,6088],{},"In programming we've had this problem of unreviewable details before, but now we need a new way to build trust.",[6071,6090,4910],{"id":6091},"the-glass-box",[5825,6093,6094],{},"Software has always been a kind of layered glass box. You could peer inside, see what was happening, understand how the machine was doing what you asked of it.",[5825,6096,6097],{},"When I first learned to program, I did it across multiple levels - high-level languages, medium-level languages, and assembly. I used to program on TI graphing calculators in assembly, often hand-translating the op codes to hexadecimal. I made a compiler that could take TI Basic and translate it down into assembly, which was pretty cool - though it would write assembly that wasn't as optimized as what I was writing by hand. It would spit out so much that I couldn't really read it, and that made me worry about inefficiency, about losing nuance, about the code losing the aesthetic of the system. Soon better hardware came into my life, more high-level systems, and I moved on.",[5825,6099,6100],{},"After a while, you don't really want to constantly be thinking about whether memory is growing from the bottom up or the top down, where the stack and heap are, how to manage pointers. After a while, you don't even want to worry about garbage collection. You just want stuff to work.",[5825,6102,6103],{},"As you move up these levels of abstraction, it's like you take each lower level and put it in a box. Maybe it's a semi-transparent box where you know roughly what's happening underneath, but you care less and less. Then you take that level and put it inside another box. You can squint through and sort of see, but you see less and less. You can open the boxes when you need to - you can get back inside and see what's going on. But for the most part, if it's a good box, you don't really care what's going on inside.",[5825,6105,6106],{},"What makes people eventually stop worrying is that you build up trust. Your tools build up capability to where you can write a smaller, more abstract chunk of code, and it does what you need with less fiddling. Less control, but usually less control in dimensions you don't really care about - like where specifically the bytes are in memory. Sometimes it constrains you in ways you do care about, like vertically centering text in CSS being a real pain. But most of the time, you're able to build up trust in your higher level system because it lets you move faster, get your idea out on screen, let people interact with it faster than you could have before.",[5825,6108,6109],{},"Less control in dimensions you don't really care about. That's the deal you keep making, one abstraction layer at a time.",[6071,6111,4915],{"id":6112},"whats-actually-happening-with-ai-generated-code",[5825,6114,6115],{},"Here's the thing people get wrong about AI-generated code: it's still just code. You can look at it, peel it apart, figure out how it works, figure out what it's doing and what it's not doing. The issue isn't that it's mysterious or non-deterministic in any fundamental sense. The issue is quantity. There is simply more code than anyone can read.",[5825,6117,6118],{},"This is exactly where the overlap with the four color theorem comes in. There were so many individual cases that the proof was more or less to enumerate all of them - and that made it too much to fit in a human brain. It doesn't take away from the fact that this is still ultimately deterministic. Things can be sloppy without losing determinism.",[5825,6120,6121],{},"People get distracted because LLMs generate code somewhat non-deterministically - ask the same prompt three times and you'll get three different implementations. But if you judge the solutions based on their behavior, if you look at all three and pick the one that behaves most like what you want, you still have a system. You still have execution you can run and observe.",[5825,6123,6124],{},"So when you have some monster pull request and you're a little nervous about merging it, what do you actually do? You pull it down and start treating it as a more opaque box. Check out the behavior. Check out whether it works, whether it does the original thing. Try out a few edge cases and see how it feels. I still sometimes scan the code looking for something obvious that's trying to escape its little box, a view page with SQL embedded or something - the more contained it is, the better. But for the most part, you treat it more like a found object than a beautifully constructed theorem.",[5825,6126,6127],{},"This is also where a tempting instinct leads you astray. You might think: \"They generated that code through prompts, through some kind of English-level specification - let's hold on to that.\" The problem is that your prompts are already trying to account for your current situation, the capabilities of your model, the assumptions it has, the rest of the codebase at that time. Your prompt is not really something worth saving in the way source code is worth saving. If you run the same prompt multiple times, you get different results. Run it against different models, you get different results.",[5825,6129,6130],{},"The prompt isn't like high-level JavaScript compared to assembly. If you take your high-level JavaScript and execute it, you end up with pretty much the same thing each time. Take your high-level prompt, and you could end up with something quite different. Your LLM is adding something to it - it's adding a snapshot of its current data and style, its taste based on the training and context.",[5825,6132,6133],{},"This means the whole world is flipped on its head. Historically, you should not commit build artifacts - they don't belong in your tree. Now it feels like the opposite. There is no point in committing the construction; you're only committing the build artifact. Your version history becomes much more like a transaction log of your artifact than a journal of an engineer.",[5825,6135,6136],{},"You might save a prompt as documentation, as inspiration if you ever wanted to start over - but it isn't an artifact. You can't validate behavior at the prompt level. You have to validate it at the resulting code level, at the behavior level.",[6071,6138,4920],{"id":6139},"rigor-doesnt-disappear-it-relocates",[5825,6141,6142],{},"So where does that leave us? We have these generated artifacts and throw-away prompts, and we need to start shifting how we think about the whole situation. We need to treat the artifacts as found pieces - things generated more like material science than traditional engineering. We can't depend on the underlying construction since we did not construct anything ourselves. We need to pressure test the actual thing, the actual result.",[5825,6144,6145],{},"We can look to other disciplines for guidance here. Material science? Structural engineering? Folks who do testing on things to see how well they work. You can still gain a lot of insight if you understand how something works - that knowledge should give you better ideas about how to break it, how to pressure test it, how to make sure it fits your actual goals, and even what compromises you might be making. But even without that knowledge you can hit something a few times with a hammer to see if it breaks.",[5825,6147,6148],{},"In practical terms: you might observe through real usage that a piece of AI-generated code isn't going to scale because of memory constraints, or you hit it with more than a couple dozen concurrent users and it falls apart. That might then lead you to find out exactly when it does fall apart, and to spend more of your time prodding at the outside of the black box rather than trying to comprehend it and build it up from first principles on the inside. More of a behavioral science than a dissection or construction.",[5825,6150,6151],{},"Like the Four Color Problem, we must give up elegance and embrace observation.",[5825,6153,6154],{},"The rigor applied toward validation has always been in service of building trust. If you can build trust through behavioral evidence instead of through reading the source, the rigor hasn't gone away - it's just relocated. The person who understands crystalline structures doesn't run the stress test any differently than someone who doesn't, but they know which stress tests to run. Deep knowledge of how things work still gives you an advantage. It just expresses itself differently now.",[6071,6156,4925],{"id":6157},"the-new-practitioner",[5825,6159,6160],{},"I think about how much it actually matters that I know how a NAND gate works at the transistor level. It's genuinely fun to know. I can draw inspiration from it for higher-level concepts. But I can build a lot of things without ever having lifted a soldering iron.",[5825,6162,6163],{},"A lot of people new to building software haven't had the background and traditional skills that would let them peer inside these boxes. Up until now, they could operate as QAs, as users, as people able to judge results - but generating the artifact itself was hard to do without years of accumulated knowledge. That's changing.",[5825,6165,6166],{},"Someone coming to coding now should use tools like Claude Code to generate artifacts. They need to be technical, working through details on top of their creative prompting. They'll still need to think about how things fit together. But they can start from the other end, from the imagined outcome, more extremely than ever before. They can generate, magic-wand an artifact into existence, and then push on it with interactive and even real-world testing.",[5825,6168,6169],{},"As they do this, the more they scratch into it - thinking about edges, failure modes, how other people are going to interact with it - the better they'll get. If they can get all the way down into the fundamentals, down into the black box a bit, they'll have more powerful techniques. But they might not need that. They will be able to trial-and-error their way into some really amazing things.",[6071,6171,4930],{"id":6172},"the-invitation",[5825,6174,6175],{},"In the end, Four Colors Suffice.",[5825,6177,6178],{},"We don't need to understand why from first principles; we can convince ourselves via other means. Grab a couple maps, a couple crayons. Give it a try. You might not be able to get through all 2,000-ish combinations, but you can get through a few and build up your faith that it's probably fine. You end up with some very beautiful little maps.",[5825,6180,6181],{},"You might not be able to see all the way through these layers of abstraction, these boxes inside of boxes. But you can build some amazing things. You can share some amazing things. You can make ideas and visions come to life that never could have made it through before - not because the tools are magic, but because the barrier to making something real has changed.",[5825,6183,6184],{},"And if you do have the ability to get down into the details, you can still help other folks out when they get stuck. You can design better experiments, ask smarter questions, push on edges in ways that matter.",{"title":45,"searchDepth":15,"depth":15,"links":6186},[6187,6188,6189,6190,6191,6192],{"id":6073,"depth":15,"text":4905},{"id":6091,"depth":15,"text":4910},{"id":6112,"depth":15,"text":4915},{"id":6139,"depth":15,"text":4920},{"id":6157,"depth":15,"text":4925},{"id":6172,"depth":15,"text":4930},"2026-02-22",{},{"title":4900,"description":4902},"TLT - 2026.02.22 - Modern Coding Discomfort, or, Four Colors Suffice",[5980],"UHdZ2HPCzp46Ppn3C-8mmasz9f9gK0anufFdAiJlqgo",{"id":6200,"title":4935,"body":6201,"createdAt":6193,"description":6205,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":6220,"navigation":5976,"path":4934,"seo":6221,"stem":6222,"tags":6223,"updatedAt":6193,"__hash__":6224},"content\u002FTLT - 2026.02.22 - Pierre Menard in the House.md",{"type":5822,"value":6202,"toc":6218},[6203,6206,6215],[5825,6204,6205],{},"I've just finished reading House of Leaves in a book club.",[5825,6207,6208,6209,6214],{},"One of my favorite bits from the House of Leaves is that all through the whole thing there's all these footnotes and they're basically all just made up references to random academic journals or speeches or things that don't exist. And then out of nowhere in one of the citations, they are talking about the Frenchman ",[5950,6210,6213],{"href":6211,"rel":6212},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPierre_Menard,_Author_of_the_Quixote",[5954],"Pierre Menard"," and mentioning it as fact, someone who is attempting (succeeding) to recreate Don Quixote.",[5825,6216,6217],{},"This is actually a Jorge Louis Borges quote and a piece of one of his writings, which is completely unattributed inside of the House of Leaves footnote. It's like they are citing the fictional book, not the actual Borges book, but they didn't even cite the fictional book. Maybe both stories are set in the same universe.",{"title":45,"searchDepth":15,"depth":15,"links":6219},[],{},{"title":4935,"description":6205},"TLT - 2026.02.22 - Pierre Menard in the House",[5980],"GYbBaGH7PEDRyKYt3kgRFtQ2rUeu4PiMNjs0xfjkZgU",{"id":6226,"title":2785,"body":6227,"createdAt":6266,"description":6267,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":6268,"navigation":5976,"path":2784,"seo":6269,"stem":2785,"tags":6270,"updatedAt":6266,"__hash__":6272},"content\u002FRPM Challenge 2026.md",{"type":5822,"value":6228,"toc":6263},[6229,6234,6247,6250,6253,6260],[5825,6230,6231,6232],{},"Mostly using ",[5950,6233,2879],{"href":2878},[5825,6235,6236,6241,6242,6246],{},[6237,6238],"audio",{"controls":5976,"preload":6239,"src":6240},"metadata","\u002Fdocs\u002Fmusic\u002Fthings_to_say_v1.mp3"," (",[5950,6243,6245],{"download":6244,"external":45,"href":6240},"docs\u002Fmusic\u002Fthings_to_say_v1.mp3","download",") - You and Me and The Devil",[6071,6248,2790],{"id":6249},"things-to-say-you-and-me",[5825,6251,6252],{},"I've been rolling the chorus-bits around for a few years, now trying to figure out how to glue it together. With the four-track I first sang it a bit, then doot-da-doot a bit, then sing it better, then add some bass.",[5825,6254,6255,6241,6257,6259],{},[6237,6256],{"controls":5976,"preload":6239,"src":6240},[5950,6258,6245],{"download":6244,"external":45,"href":6240},")",[5825,6261,6262],{},"Next ... I might start over :)",{"title":45,"searchDepth":15,"depth":15,"links":6264},[6265],{"id":6249,"depth":15,"text":2790},"2026-02-02","Mostly using Rotae Versantur",{},{"title":2785,"description":6267},[6271],"music","3QD1b1GrcJHfbEojGgEBqd5YcTydjYdl-sj0n1EmsnY",{"id":6274,"title":4895,"body":6275,"createdAt":6372,"description":6279,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":6373,"navigation":5976,"path":4894,"seo":6374,"stem":6375,"tags":6376,"updatedAt":6372,"__hash__":6377},"content\u002FTLT - 2026.01.08 - Jamuary 8.md",{"type":5822,"value":6276,"toc":6370},[6277,6280,6288,6293,6306,6318,6329,6341,6353],[5825,6278,6279],{},"So Damn Cute",[5825,6281,6282,6241,6285,6259],{},[6237,6283],{"controls":5976,"preload":6239,"src":6284},"\u002Fdocs\u002Fmusic\u002Fso_damn_cute_v1.mp3",[5950,6286,6245],{"download":6287,"external":45,"href":6284},"docs\u002Fmusic\u002Fso_damn_cute_v1.mp3",[5825,6289,6290,6291],{},"Practice using ",[5950,6292,2879],{"href":2878},[5825,6294,6295,6296,6299,6300,6302,6303,6305],{},"Well I love you",[6297,6298],"br",{},"\n'cause you're so damn cute",[6297,6301],{},"\nand when the people ask me why",[6297,6304],{},"\nwell the question is moot",[5825,6307,6308,6309,6311,6312,6314,6315,6317],{},"because I love you dearly",[6297,6310],{},"\nfrom your head to your toe",[6297,6313],{},"\nand if you're going somewhere",[6297,6316],{},"\nwell that's where I'll go",[5825,6319,6320,6321,6299,6323,6325,6326,6328],{},"because I love you",[6297,6322],{},[6297,6324],{},"\nand you might ask why",[6297,6327],{},"\nwell I'll tell you the truth",[5825,6330,6331,6332,6334,6335,6337,6338,6340],{},"It's 'cause you're so cool",[6297,6333],{},"\nand you're so nice",[6297,6336],{},"\nand if you asked me on a date",[6297,6339],{},"\ndon't need to ask twice",[5825,6342,6343,6344,6346,6347,6349,6350,6352],{},"when you come a round",[6297,6345],{},"\nI just lose my head",[6297,6348],{},"\nwhen I hear your name",[6297,6351],{},"\nmy whole face turns red",[5825,6354,6320,6355,6299,6357,6359,6360,6299,6362,6359,6364,6299,6366,6359,6368,6299],{},[6297,6356],{},[6297,6358],{},"\nbecause I love you",[6297,6361],{},[6297,6363],{},[6297,6365],{},[6297,6367],{},[6297,6369],{},{"title":45,"searchDepth":15,"depth":15,"links":6371},[],"2026-01-08T00:00:00.000Z",{},{"title":4895,"description":6279},"TLT - 2026.01.08 - Jamuary 8",[5980,6271],"f4NxganlEMFK0FL1np0B3dsVVPAdrPcw0uZOB7IXjAE",{"id":6379,"title":2879,"body":6380,"createdAt":6506,"description":2881,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":6507,"navigation":5976,"path":2878,"seo":6508,"stem":2879,"tags":6509,"updatedAt":6506,"__hash__":6511},"content\u002FRotae Versantur.md",{"type":5822,"value":6381,"toc":6501},[6382,6384,6387,6390,6398,6413,6419,6426,6431,6434,6496,6499],[5825,6383,2881],{},[6071,6385,2884],{"id":6386},"concept",[5825,6388,6389],{},"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).",[5825,6391,6392,6393],{},"See the project on ",[5950,6394,6397],{"href":6395,"rel":6396},"https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Frotae_versantur",[5954],"github",[5825,6399,6400,6401,6403,6407,6408,6259],{},"Equipment:",[6297,6402],{},[5950,6404,2295],{"href":6405,"rel":6406},"https:\u002F\u002Fmonome.org\u002Fdocs\u002Fnorns\u002F",[5954]," (though I technically have the ",[5950,6409,6412],{"href":6410,"rel":6411},"https:\u002F\u002Fmonome.org\u002Fdocs\u002Fnorns\u002Fshield\u002F",[5954],"Monome Norns Shield",[5825,6414,6415],{},[6416,6417],"img",{"alt":45,"src":6418},"https:\u002F\u002Fmonome.org\u002Fdocs\u002Fnorns\u002Fimage\u002Fnorns-shield.png",[5825,6420,6421],{},[5950,6422,6425],{"href":6423,"rel":6424},"https:\u002F\u002Fmonome.org\u002Fdocs\u002Farc\u002F",[5954],"Monome Arc",[5825,6427,6428],{},[6416,6429],{"alt":45,"src":6430},"https:\u002F\u002Fmonome.org\u002Fdocs\u002Farc\u002Fimages\u002Farc.jpg",[6071,6432,2889],{"id":6433},"instructions",[6013,6435,6436,6439,6447,6462,6470,6480,6488],{},[6016,6437,6438],{},"Use the Arc to visualize and control a four-track recording and playback machine",[6016,6440,6441,6442],{},"Button release\n",[6013,6443,6444],{},[6016,6445,6446],{},"Toggle Rolling vs Stopped",[6016,6448,6449,6450],{},"Turn a Wheel\n",[6013,6451,6452,6459],{},[6016,6453,6454,6455,6458],{},"Set ",[5853,6456,6457],{},"MODE"," for that track",[6016,6460,6461],{},"Amp, Pan, Reverb, Tone",[6016,6463,6464,6465],{},"Button + Wheel 1\n",[6013,6466,6467],{},[6016,6468,6469],{},"Seek",[6016,6471,6472,6473],{},"Button + Wheel 2\n",[6013,6474,6475,6478],{},[6016,6476,6477],{},"Set MODE",[6016,6479,6461],{},[6016,6481,6482,6483],{},"Button + Wheel 3\n",[6013,6484,6485],{},[6016,6486,6487],{},"Select recording track",[6016,6489,6490,6491],{},"Button + Wheel 4\n",[6013,6492,6493],{},[6016,6494,6495],{},"Select bounced tracks, they then feed recording",[6071,6497,2894],{"id":6498},"thoughts",[5825,6500,2896],{},{"title":45,"searchDepth":15,"depth":15,"links":6502},[6503,6504,6505],{"id":6386,"depth":15,"text":2884},{"id":6433,"depth":15,"text":2889},{"id":6498,"depth":15,"text":2894},"2026-01-03",{},{"title":2879,"description":2881},[6510],"project","PQGOCnwzcAx-ntHJkNZdquecQRiduwHeLKBsWsFR3FQ",{"id":6513,"title":2731,"body":6514,"createdAt":6897,"description":6518,"draft":5972,"extension":5973,"image":6521,"mastodonThread":5974,"meta":6898,"navigation":5976,"path":2730,"seo":6899,"stem":2731,"tags":6900,"updatedAt":6506,"__hash__":6901},"content\u002FProjects.md",{"type":5822,"value":6515,"toc":6891},[6516,6519,6522,6531,6534,6537,6585,6588,6591,6612,6615,6618,6868,6870,6873],[5825,6517,6518],{},"I present here a very incomplete list of programming-related projects, and the tools and languages I might use to create them.",[6416,6520],{"src":6521},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FROqn3i8m40JxUyKgFKym4gAYInzHd3adje0xomuIKfI_KuM0v7fsPYLDXNF4X8K0DGaOQkGSdBVtbO2B1CRXYAulPYDinDdq5lBSOP1KdBSv_kxwbt-a6jlmv5d5z1ysodk7y2tkFW4B2klTLNw6Lc1pjiELrWy0",[5825,6523,6524,6525,6530],{},"Also see ",[5950,6526,6529],{"href":6527,"rel":6528},"https:\u002F\u002Fgithub.com\u002Fawwaiid",[5954],"the awwaiid github repo"," for more projects!",[6071,6532,2736],{"id":6533},"current-projects",[5825,6535,6536],{},"If you were to ask me what I'm working on right now, I might say one of these.",[6013,6538,6539,6544,6549,6554,6559,6566,6571,6578],{},[6016,6540,6541,6543],{},[5950,6542,2879],{"href":2878}," - Norns Monome+Arc based four track recorder",[6016,6545,6546,6548],{},[5950,6547,1470],{"href":1469}," - Use the reMarkable2 as an interface to vision-LLMs. Ghost in the machine!",[6016,6550,6551,6553],{},[5950,6552,1572],{"href":1571}," - Part of the Ruby For Good organization; inventory control for diaper and period-supply banks",[6016,6555,6556,6558],{},[5950,6557,2760],{"href":2759}," - Making music with a code console",[6016,6560,6561,6565],{},[5950,6562,6564],{"href":6563},"\u002Ffairy-lights","Fairy Lights"," - Programming decorative LED lights in my living room and Christmas tree",[6016,6567,6568,6570],{},[5950,6569,360],{"href":359}," - Chomp a codebase down to the bone",[6016,6572,6573,6577],{},[5950,6574,6576],{"href":6575},"\u002Fmetl","METL"," - Research around extracting and using Formal Models from an existing codebase",[6016,6579,6580,6584],{},[5950,6581,6583],{"href":6582},"\u002Fmeta-tlt","Meta TLT"," - Messing around with this website or tooling",[6071,6586,2741],{"id":6587},"backburner",[5825,6589,6590],{},"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.",[6013,6592,6593,6599,6605],{},[6016,6594,6595,6598],{},[5950,6596,6597],{"href":2038},"Mizik"," - A game of memory, sound, shape",[6016,6600,6601,6604],{},[5950,6602,4885],{"href":6603},"\u002Fgremllm"," - Put a monster into your codebase",[6016,6606,6607,6611],{},[5950,6608,6610],{"href":6609},"\u002Ftask-seeder","Task Seeder"," - Interactively rank your tasks using different tournament and sorting algorithms",[6071,6613,2746],{"id":6614},"inactive",[5825,6616,6617],{},"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!",[6013,6619,6620,6625,6631,6636,6642,6647,6652,6658,6664,6669,6675,6680,6686,6692,6698,6703,6708,6713,6719,6724,6730,6736,6741,6747,6753,6759,6765,6771,6776,6782,6788,6793,6799,6805,6810,6815,6821,6827,6833,6839,6844,6849,6855,6862],{},[6016,6621,6622],{},[5950,6623,6624],{"href":42},"An Introduction to Programming via Perl",[6016,6626,6627,6630],{},[5950,6628,6629],{"href":255},"CGI Inspect"," - Inspect running CGI apps",[6016,6632,6633,6635],{},[5950,6634,305],{"href":304}," - OCaml implementation of the sequential data mining algorithms",[6016,6637,6638,6641],{},[5950,6639,6640],{"href":334},"Census Data Extraction"," - Small project to help a researcher correlate some data",[6016,6643,6644,6646],{},[5950,6645,840],{"href":839}," - Continuation-based web-application framework for Perl",[6016,6648,6649,6651],{},[5950,6650,904],{"href":903}," - Provide a perl object with a way to fake continuations (complete and abandoned)",[6016,6653,6654,6657],{},[5950,6655,6656],{"href":965},"Covid Can I Do It"," - An interactive harm-reduction dataset built during the COVID pandemic",[6016,6659,6660,6663],{},[5950,6661,6662],{"href":1005},"DHTML Combo"," - A combo box made using DHTML\u002FJavascript",[6016,6665,6666,6668],{},[5950,6667,1217],{"href":1216}," - Convert graphviz files to HTML and Javascript",[6016,6670,6671,6674],{},[5950,6672,6673],{"href":1246},"EPFarms Panel"," - A control panel for hosting clients",[6016,6676,6677,6679],{},[5950,6678,1400],{"href":1399}," - Smalltalk-like environment for Perl",[6016,6681,6682,6685],{},[5950,6683,6684],{"href":1435},"Gecko-based html2ps"," - Render html -> postscript using the gecko",[6016,6687,6688,6691],{},[5950,6689,6690],{"href":1498},"Graph Module"," - OddMuse plugin to make GraphViz graphs (complete)",[6016,6693,6694,6697],{},[5950,6695,6696],{"href":1757},"JQuery Autoindent"," - I've always wanted a textbox that auto-indents",[6016,6699,6700,6702],{},[5950,6701,1812],{"href":1811}," - Visualize LLM token selection",[6016,6704,6705,6707],{},[5950,6706,1995],{"href":1994}," - An HTML (XML?) Macro language (complete? old)",[6016,6709,6710,6712],{},[5950,6711,2044],{"href":2043}," - Fuse filesystem to cache files for mobile reading",[6016,6714,6715,6718],{},[5950,6716,6717],{"href":2064},"Module Level Polyglot"," - Advocacy and projects, sharing libs between langs",[6016,6720,6721,6723],{},[5950,6722,2271],{"href":2270}," - Playing with PortAudio and generators",[6016,6725,6726,6729],{},[5950,6727,6728],{"href":2319},"OCaml Eval"," - Evaluate OCaml code dynamically (complete, old)",[6016,6731,6732,6735],{},[5950,6733,6734],{"href":2341},"OCaml GrabBag"," - Datastructure for a random-retrieval collection (complete)",[6016,6737,6738,6740],{},[5950,6739,2356],{"href":2355}," - OCaml Genetic Programming Framework",[6016,6742,6743,6746],{},[5950,6744,6745],{"href":2405},"OddMuse Pingback"," - A pingback server for oddmuse comment pages (abandoned)",[6016,6748,6749,6752],{},[5950,6750,6751],{"href":2410},"Oddmuse EditSection"," - Edit things on a per-section basis in oddmuse",[6016,6754,6755,6758],{},[5950,6756,6757],{"href":2415},"Oddmuse Editfile"," - Edit a file (especially perl) through oddmuse",[6016,6760,6761,6764],{},[5950,6762,6763],{"href":2420},"Oddmuse Ref Links"," - Module for a sidebar list of incoming links for a page",[6016,6766,6767,6770],{},[5950,6768,6769],{"href":2425},"Oddmuse Search Tags"," - Module for a simple tagging mechanism",[6016,6772,6773,6775],{},[5950,6774,2445],{"href":2444}," - Customizing the Open Phone",[6016,6777,6778,6781],{},[5950,6779,6780],{"href":2598},"Perl 6 Use Libs From Ruby"," - Perl 6 to Ruby bridge",[6016,6783,6784,6787],{},[5950,6785,6786],{"href":2608},"Perl HtmlUnit"," - A perl interface to the java HtmlUnit library",[6016,6789,6790,6792],{},[5950,6791,2687],{"href":2686}," - A very simple perl wrapper around some command-line audio players",[6016,6794,6795,6798],{},[5950,6796,6797],{"href":2898},"Rubiks Cube Solver"," - I finally got my very own Rubik's Cube!",[6016,6800,6801,6804],{},[5950,6802,6803],{"href":2937},"Scrutiny Debugger"," - PSGI\u002FPlack Middleware providing a debugger",[6016,6806,6807,6809],{},[5950,6808,2951],{"href":2950}," - A set-theoretical database interface",[6016,6811,6812,6814],{},[5950,6813,3031],{"href":3030}," - A Perl\u002FGTK sketchbook for small touch-screen devices",[6016,6816,6817,6820],{},[5950,6818,6819],{"href":3114},"Sport Logo Quiz Game"," - Test your knowledge of sport team logos!",[6016,6822,6823,6826],{},[5950,6824,6825],{"href":5239},"The Fridge"," - A javascript\u002Fphp refrigerator (complete)",[6016,6828,6829,6832],{},[5950,6830,6831],{"href":5378},"Untyped Lambda Calculus in OCaml"," - Exactly what it sounds like (complete? old)",[6016,6834,6835,6838],{},[5950,6836,6837],{"href":5383},"Use Everywhere"," - Use a perl module all over the place",[6016,6840,6841,6843],{},[5950,6842,5477],{"href":5476}," - Personal assistant bot",[6016,6845,6846,6848],{},[5950,6847,5591],{"href":5590}," - Building on Mike Bennett's gesture recognition app",[6016,6850,6851,6854],{},[5950,6852,6853],{"href":5639},"Web Board Games"," - Web based 2D board games",[6016,6856,6857,6861],{},[5950,6858,6860],{"href":6859},"\u002Fwhite-elephant-gift-selector","White Elephant Gift Selector"," - Web app to pick the perfect gift!",[6016,6863,6864,6867],{},[5950,6865,6866],{"href":5723},"Zend Hacking"," - Feeling my way around (abandoned)",[5829,6869],{},[6071,6871,1634],{"id":6872},"tools",[6013,6874,6875,6881,6886],{},[6016,6876,6877,6880],{},[5950,6878,6879],{"href":1586},"I love Vim"," - my preferred IDE",[6016,6882,6883,6884],{},"See a ",[5950,6885,2934],{"href":2933},[6016,6887,6888,6890],{},[5950,6889,1030],{"href":1029}," - revision\u002Fbranch management. It's fun.",{"title":45,"searchDepth":15,"depth":15,"links":6892},[6893,6894,6895,6896],{"id":6533,"depth":15,"text":2736},{"id":6587,"depth":15,"text":2741},{"id":6614,"depth":15,"text":2746},{"id":6872,"depth":15,"text":1634},"2005-01-04T11:35-05:00",{},{"title":2731,"description":6518},[6510],"oiksJ8Uf5W0e-wwxKqNYXqJ4iPA4cpxgrnhSELkQNHo",{"id":6903,"title":4890,"body":6904,"createdAt":6925,"description":6926,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":6927,"navigation":5976,"path":4889,"seo":6928,"stem":6929,"tags":6930,"updatedAt":6925,"__hash__":6931},"content\u002FTLT - 2026.01.02 - Jamuary 2.md",{"type":5822,"value":6905,"toc":6923},[6906,6915],[5825,6907,6908,6909,6914],{},"Practice on my norns-powered digital four track: ",[5950,6910,6913],{"href":6911,"rel":6912},"https:\u002F\u002Fthelackthereof.org\u002Fdocs\u002Fmusic\u002F2026-01-02%20Rotae%20Practice%20-%20Hotel%20Yorba.mp3",[5954],"Hotel Yorba cover"," (including mistakes, heh)",[5825,6916,6917,6241,6920,6259],{},[6237,6918],{"controls":5976,"preload":6239,"src":6919},"\u002Fdocs\u002Fmusic\u002F2026-01-02%20Rotae%20Practice%20-%20Hotel%20Yorba.mp3",[5950,6921,6245],{"download":6922,"external":45,"href":6919},"docs\u002Fmusic\u002F2026-01-02%20Rotae%20Practice%20-%20Hotel%20Yorba.mp3",{"title":45,"searchDepth":15,"depth":15,"links":6924},[],"2026-01-02T00:00:00.000Z","Practice on my norns-powered digital four track: Hotel Yorba cover (including mistakes, heh)",{},{"title":4890,"description":6926},"TLT - 2026.01.02 - Jamuary 2",[5980,6271],"sP0Ix9OFA-57WHWwCy0oB8LiIVaZkxyC2JC3Nh0nwxs",{"id":6933,"title":5772,"body":6934,"createdAt":6984,"description":6985,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":6986,"navigation":5976,"path":5771,"seo":6987,"stem":6988,"tags":5974,"updatedAt":6989,"__hash__":6990},"content\u002Fbin-service-pattern.md",{"type":5822,"value":6935,"toc":6982},[6936,6953,6956,6967,6970,6979],[5825,6937,6938,6939,6942,6943,6947,6948,6952],{},"One pattern I like a lot is a ",[6002,6940,6941],{},"bin\u002Fservice"," wrapper. In each of your services (I like to call them ",[5950,6944,6946],{"href":6945},"\u002Fmacro-service","Macro Service"," instead of ",[5950,6949,6951],{"href":6950},"\u002Fmicroservice","Microservice",").",[5825,6954,6955],{},"The idea is to provide a few key things:",[6013,6957,6958,6961,6964],{},[6016,6959,6960],{},"Simple tools for developers to manage the service",[6016,6962,6963],{},"Lifecycle hooks for deployment",[6016,6965,6966],{},"All wrapped up in code, providing executable self-documentation",[5825,6968,6969],{},"Imagine this:",[6971,6972,6977],"pre",{"className":6973,"code":6975,"language":6976},[6974],"language-text","Usage: bin\u002Fservice \u003Ccommand>\n\nCommands:\n    system-setup          # Install machine dependencies (may require sudo)\n    init                  # Initialize config files and the DB\n    build                 # Build (rebuild) the image to get new deps\n    start [service]       # Start up the app or a specific sub-service\n    run [cmd] [args]      # Run a command in the 'web' sub-service\n    stop                  # Stop the app\n    status                # Get the app status\n\nDeployment Commands:\n    deploy \u003Cenv>          # Deploys an environment using CI\n    force-deploy \u003Cenv>    # Deploys an environment using your machine\n\nDatabase Commands:\n    reset-db-from-staging # Download\u002Frestore from staging database\n    reset-test-db         # Reset local test database (load schema\u002Fseed)\n    db-snapshot \u003Cfile>    # Use local psql to snapshot a DB dump to a local file\n    db-restore \u003Cfile>     # Use local psql to load a DB dump into the running db\n\nLifecycle Commands, used by Kubernetes\u002FHelm:\n    boostrap-job          # Entrypoint for bootstrap job\n    start-web-pod         # Entrypoint for web pod\n    start-worker-pod      # Entrypoint for starting the worker pod\n    stop-worker-pod       # Entrypoint for stopping the worker pod\n    upgrade-job           # Entrypoint for upgrade job\n    build-assets          # Build step to compile assets prior to container build\n    shell                 # Entrypoint for bash process (for a debugging pod)\n","text",[6002,6978,6975],{"__ignoreMap":45},[5825,6980,6981],{},"These service-oriented commands don't really care what your internal-app tech stack is. But by standardizing the commands you can depend on them in a bunch of contexts. The most important is that you can run them both in your dev env, and then the lifecycle hooks can be part of a helm chart setup. You can have one generic chart that can manage any service that conforms to this general shape.",{"title":45,"searchDepth":15,"depth":15,"links":6983},[],"2025-10-0","One pattern I like a lot is a bin\u002Fservice wrapper. In each of your services (I like to call them Macro Service instead of Microservice).",{},{"title":5772,"description":6985},"bin-service-pattern","2025-09-30","qSRa8e_YZmxB4DI1ciTgJ7sHU7GG_EZ1oN8aNYZRnZ4",{"id":6992,"title":4885,"body":6993,"createdAt":7152,"description":6997,"draft":5972,"extension":5973,"image":7003,"mastodonThread":5974,"meta":7153,"navigation":5976,"path":4884,"seo":7154,"stem":7155,"tags":7156,"updatedAt":7152,"__hash__":7157},"content\u002FTLT - 2025.07.12 - Gremllm.md",{"type":5822,"value":6994,"toc":7150},[6995,6998,7004,7011,7017,7122,7129,7136,7146],[5825,6996,6997],{},"A project which puts LLM-powered gremlins right into your runtime!",[5825,6999,7000],{},[6416,7001],{"alt":7002,"src":7003},"Gremllm cartoon","img\u002FGremllm_cartoon.png",[5825,7005,7006,7007,7010],{},"As previously mentioned, I enjoy trying out new tech like claude-code, making esoteric and ill-advised libraries that are maybe-jokes, pushing on meta-models and run-time ",[6002,7008,7009],{},"eval",", and like many others I don't mind 5 minutes of fame. So by that measure, TOTAL SUCCESS!",[5825,7012,7013,7014,7016],{},"Let's start with what this new ",[6002,7015,4885],{}," library that I made can do:",[6971,7018,7022],{"className":7019,"code":7020,"language":7021,"meta":45,"style":45},"language-python shiki shiki-themes github-light github-dark monokai","from gremllm import Gremllm\n\ncounter = Gremllm('counter')\ncounter.value = 0\ncounter.increment()\ncounter.increment(5)\ncounter.add_seventeen()\nprint(counter.current_value)\nprint(counter.value_in_hex)\ncounter.reset()\n","python",[6002,7023,7024,7041,7046,7064,7075,7081,7092,7098,7108,7116],{"__ignoreMap":45},[5853,7025,7027,7031,7035,7038],{"class":7026,"line":9},"line",[5853,7028,7030],{"class":7029},"sC2Qs","from",[5853,7032,7034],{"class":7033},"sMOD_"," gremllm ",[5853,7036,7037],{"class":7029},"import",[5853,7039,7040],{"class":7033}," Gremllm\n",[5853,7042,7043],{"class":7026,"line":15},[5853,7044,7045],{"emptyLinePlaceholder":5976},"\n",[5853,7047,7048,7051,7054,7057,7061],{"class":7026,"line":56},[5853,7049,7050],{"class":7033},"counter ",[5853,7052,7053],{"class":7029},"=",[5853,7055,7056],{"class":7033}," Gremllm(",[5853,7058,7060],{"class":7059},"sstjo","'counter'",[5853,7062,7063],{"class":7033},")\n",[5853,7065,7066,7069,7071],{"class":7026,"line":5212},[5853,7067,7068],{"class":7033},"counter.value ",[5853,7070,7053],{"class":7029},[5853,7072,7074],{"class":7073},"s7F3e"," 0\n",[5853,7076,7078],{"class":7026,"line":7077},5,[5853,7079,7080],{"class":7033},"counter.increment()\n",[5853,7082,7084,7087,7090],{"class":7026,"line":7083},6,[5853,7085,7086],{"class":7033},"counter.increment(",[5853,7088,7089],{"class":7073},"5",[5853,7091,7063],{"class":7033},[5853,7093,7095],{"class":7026,"line":7094},7,[5853,7096,7097],{"class":7033},"counter.add_seventeen()\n",[5853,7099,7101,7105],{"class":7026,"line":7100},8,[5853,7102,7104],{"class":7103},"sTrkL","print",[5853,7106,7107],{"class":7033},"(counter.current_value)\n",[5853,7109,7111,7113],{"class":7026,"line":7110},9,[5853,7112,7104],{"class":7103},[5853,7114,7115],{"class":7033},"(counter.value_in_hex)\n",[5853,7117,7119],{"class":7026,"line":7118},10,[5853,7120,7121],{"class":7033},"counter.reset()\n",[5825,7123,7124,7125,7128],{},"To be clear -- each of those methods is completely made up. At runtime when you invoke a method it is ",[5834,7126,7127],{},"at that moment"," sent over to the LLM (ChatGPT in this case) to generate the python code, which is then executed. It's like claude-code, but at runtime!",[5825,7130,7131,7132,7135],{},"Speaking of which, I built Gremllm ",[5834,7133,7134],{},"using"," Claude Code, which I've been using a lot lately. I'm not always convinced that it is faster, and I'm not always convinced that it is slower, but it is fun enough that I am making stuff that I might not make otherwise at the very least.",[5825,7137,7138,7139,7141,7142,7145],{},"Using Claude Code did have some trickery. The biggest thing is that it kept wanting to run my ",[6002,7140,7009],{}," (or in Python it is actually ",[6002,7143,7144],{},"exec",") in some sort of sandbox, and I had to be like \"no... please do this dangerous thing. Really!\". Even now it is doing some things that are more safe than I would have done if it was completely written by hand.",[7147,7148,7149],"style",{},"html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sTrkL, html code.shiki .sTrkL{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":45,"searchDepth":15,"depth":15,"links":7151},[],"2025-07-12T00:00:00.000Z",{},{"title":4885,"description":6997},"TLT - 2025.07.12 - Gremllm",[5980],"borhbqEkc1p9O0yyBOzuUcYL7mnj9wY2SY6eyRgC-eM",{"id":7159,"title":4880,"body":7160,"createdAt":7233,"description":7234,"draft":5972,"extension":5973,"image":7174,"mastodonThread":5974,"meta":7235,"navigation":5976,"path":4879,"seo":7236,"stem":7237,"tags":7238,"updatedAt":7233,"__hash__":7239},"content\u002FTLT - 2025.03.28 - Helped That One.md",{"type":5822,"value":7161,"toc":7231},[7162,7169,7175,7177,7180,7183,7188,7191,7204,7209,7212,7217,7220,7225],[5825,7163,7164,7165,7168],{},"Taking inspiration from ",[5950,7166,7167],{"href":5269},"The Star Thrower","; Action, even in the face of futility, is the path I take.",[5825,7170,7171],{},[6416,7172],{"alt":7173,"src":7174},"The Ocean","img\u002FThe_Ocean.png",[5829,7176],{},[5825,7178,7179],{},"I recall from childhood church sermons the story of the Starfish Thrower. One of my favorite parables, it tells the story of two people walking along a beach. One of them bends down now and again to pick up a living starfish and fling it into the sea. The second person asks why? What is the point? There are millions of these things on the beach - you cannot save them all. The first person reaches down, picks up a starfish and tosses it with a flick of their wrist far out to sea, then they look at their companion and they say, simply, \"Saved that one.\"",[5825,7181,7182],{},"Dozens of variations of this story are told. I've always loved it, and like to think that I live by the simple idea that one contribution, one bit of effort, has value even in the face of overwhelming opposition to success.",[5996,7184,7185],{},[5825,7186,7187],{},"\"The stars,\" he said, \"throw well. One can help them.\"",[5825,7189,7190],{},"I like to help people. The other day I took a call to help someone as they look for a job, just starting out their career and finding themselves in the worst job market of my lifetime. I can't do much directly, but I try to advise, give some ideas, review their resume, give some context on the right words to use. I put them in contact with some resources; I plan on vouching for them when I get the chance. Yet I know that I could spend all day every day having the same conversation with person after person, with no end. There are always more starfish. Still, I hope to help the ones I can each time I take a stroll on the beach.",[5825,7192,7193,7194,7199,7200,7203],{},"Thinking about this story, I decided to look it up -- I discovered that the short version is a VERY choppity chopped allusion to a (longer) short essay, ",[5950,7195,7198],{"href":7196,"rel":7197},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FThe_Star_Thrower",[5954],"The Star Thrower by Loren Eiseley (wikipedia)",". After quite some searching, I found the original version and you can ",[5950,7201,7202],{"href":5269},"read a copy of the full Star Thrower essay here",".",[5996,7205,7206],{},[5825,7207,7208],{},"Long ago, when the future was just a simple tomorrow, men had cast intricately carved game counters to determine its course, or they had traced with a grimy finger the cracks on the burnt shoulder blade of a hare.",[5825,7210,7211],{},"The movie \"Blade Runner\" is similarly inspired by \"Do Androids Dream of Electric Sheep\" by Philip K. Dick. Please read the book! You will find that the book is not \"better\" so much as \"bigger\". Deeper, darker, wider. It is existential well beyond the android identity struggle. I find that the original Star Thrower essay has a similar relationship to the short parable I learned in church. It feels more like reading a piece by Borges instead of an inspirational bookmark.",[5996,7213,7214],{},[5825,7215,7216],{},"Things, in the words of G. K. Chesterton, were to grow incalculable by being calculated. Man's powers were finite; the forces he had released in nature recognized no such limitations. They were the irrevocable monsters conjured up by a completely amateur sorcerer.",[5825,7218,7219],{},"The Star Thrower essay touches upon science, spirituality, death, life, meaningfulness, Darwinistic selfishness, and on and on. Reading it during the thrash of current politics, reading it during the rise of language-using AI, even reading it during a life transition (I got a new job!) casts a different sort of light on the day-to-day and cosmic struggles I, we, find ourselves in.",[5996,7221,7222],{},[5825,7223,7224],{},"I picked up a star whose tube feet ventured timidly among my fingers while, like a true star, it cried soundlessly for life.",[5825,7226,7227,7230],{},[5950,7228,7229],{"href":5269},"Give it a taste",". Maybe toss a starfish or two.",{"title":45,"searchDepth":15,"depth":15,"links":7232},[],"2025-03-28","Taking inspiration from The Star Thrower; Action, even in the face of futility, is the path I take.",{},{"title":4880,"description":7234},"TLT - 2025.03.28 - Helped That One",[5980],"Ci52YRPu0wzSqQ_exie1_KAIWUC8uigzhUtcO6aQieE",{"id":7241,"title":5270,"body":7242,"createdAt":7511,"description":7512,"draft":5972,"extension":5973,"image":7261,"mastodonThread":5974,"meta":7513,"navigation":5976,"path":5269,"seo":7514,"stem":7167,"tags":7515,"updatedAt":7511,"__hash__":7516},"content\u002FThe Star Thrower.md",{"type":5822,"value":7243,"toc":7506},[7244,7259,7266,7268,7279,7282,7285,7288,7291,7294,7297,7300,7303,7306,7309,7312,7315,7318,7321,7324,7327,7330,7333,7336,7338,7341,7344,7347,7350,7353,7356,7359,7362,7365,7368,7371,7374,7377,7380,7383,7386,7389,7392,7395,7398,7401,7404,7407,7410,7413,7416,7419,7422,7425,7428,7431,7434,7437,7440,7443,7446,7453,7456,7459,7462,7465,7468,7471,7474,7477,7480,7483,7486,7489,7492,7495,7497],[5825,7245,7246],{},[7247,7248,7249,7250,7254,7255,7258],"strong",{},"Editor Note: This piece is by ",[5950,7251,7253],{"href":7196,"rel":7252},[5954],"Loren Eiseley",", 1969. Published in ",[5834,7256,7257],{},"The Unexpected Universe",". Transcribed here from a PDF scan I found.",[6416,7260],{"src":7261,"alt":7262,"width":7263,"align":7264,"style":7265},"img\u002FThe_Star_Thrower_Scan.png","Printed Version Screenshot",100,"right","border: 1px solid #ccc; margin-left: 1em;",[5829,7267],{},[5996,7269,7270,7276],{},[5825,7271,7272,7273,7275],{},"Who is the man walking in the Way?",[6297,7274],{},"\nAn eye glaring in the skull.",[5825,7277,7278],{},"-SECCHO",[5825,7280,7281],{},"It has ever been my lot, though formally myself a teacher, to be taught surely by none. There are times when I have thought to read lessons in the sky, or in books, or from the behavior of my fellows, but in the end my perceptions have frequently been inadequate or betrayed. Nevertheless, I venture to say that of what man may be I have caught a fugitive glimpse, not among multitudes of men, but along an endless wave-beaten coast at dawn. As always, there is this apparent break, this rift in nature, before the insight comes. The terrible question has to translate itself into an even more terrifying freedom.",[5825,7283,7284],{},"If there is any meaning to this book, it began on the beaches of Costabel with just such a leap across an unknown abyss. It began, if I may borrow the expression from a Buddhist sage, with the skull and the eye. I was the skull. I was the inhumanly stripped skeleton without voice, without hope, wandering alone upon the shores of the world. I was devoid of pity, because pity implies hope. There was, in this desiccated skull, only an eye like a pharos light, a beacon, a search beam revolving endlessly in sunless noonday or black night. Ideas like swarms of insects rose to the beam, but the light consumed them. Upon that shore meaning had ceased. There were only the dead skull and the revolving eye. With such an eye, some have said, science looks upon the world. I do not know. I know only that I was the skull of emptiness and the endlessly revolving light without pity.",[5825,7286,7287],{},"Once, in a dingy restaurant in the town, I had heard a woman say: \"My father reads a goose bone for the weather.\" A modern primitive, I had thought, a diviner, using a method older than Stonehenge, as old as the arctic forests.",[5825,7289,7290],{},"\"And where does he do that?\" the woman's companion had asked amusedly.",[5825,7292,7293],{},"\"In Costabel,\" she answered complacently, \"in Costabel.\" The voice came back and buzzed faintly for a moment in the dark under the revolving eye. It did not make sense, but nothing in Costabel made sense. Perhaps that was why I had finally found myself in Costabel. Perhaps all men are destined at some time to arrive there as I did.",[5825,7295,7296],{},"I had come by quite ordinary means, but I was still the skull with the eye. I concealed myself beneath a fisherman's cap and sunglasses, so that I looked like everyone else on the beach. This is the way things are managed in Costabel. It is on the shore that the revolving eye begins its beam and the whispers rise in the empty darkness of the skull.",[5825,7298,7299],{},"The beaches of Costabel are littered with the debris of life. Shells are cast up in windrows; a hermit crab, fumbling for a new home in the depths, is tossed naked ashore, where the waiting gulls cut him to pieces. Along the strip of wet sand that marks the ebbing and flowing of the tide death walks hugely and in many forms. Even the torn fragments of green sponge yield bits of scrambling life striving to return to the great mother that has nourished and protected them.",[5825,7301,7302],{},"In the end the sea rejects its offspring. They cannot fight their way home through the surf which casts them repeatedly back upon the shore. The tiny breathing pores of starfish are stuffed with sand. The rising sun shrivels the mucilaginous bodies of the unprotected. The seabeach and its endless war are soundless. Nothing screams but the gulls.",[5825,7304,7305],{},"In the night, particularly in the tourist season, or during great storms, one can observe another vulturine activity. One can see, in the hour before dawn on the ebb tide, electric torches bobbing like fireflies along the beach. It is the sign of the professional shellers seeking to outrun and anticipate their less aggressive neighbors. A kind of greedy madness sweeps over the competing collectors. After a storm one can see them hurrying along with bundles of gathered starfish, or, toppling and overburdened, clutching bags of living shells whose hidden occupants will be slowly cooked and dissolved in the outdoor kettles provided by the resort hotels for the cleaning of specimens. Following one such episode I met the star thrower.",[5825,7307,7308],{},"As soon as the ebb was flowing, as soon as I could make out in my sleeplessness the flashlights on the beach, I arose and dressed in the dark. As I came down the steps to the shore I could hear the deeper rumble of the surf. A gaping hole filled with churning sand had cut sharply into the breakwater. Flying sand as light as powder coated every exposed object like snow. I made my way around the altered edges of the cove and proceeded on my morning walk up the shore. Now and then a stooping figure moved in the gloom or a rain squall swept past me with light pattering steps. There was a faint sense of coming light somewhere behind me in the east.",[5825,7310,7311],{},"Soon I began to make out objects, upended timbers, conch shells, sea wrack wrenched from the far-out kelp forests. A pink-clawed crab encased in a green cup of sponge lay sprawling where the waves had tossed him. Long-limbed starfish were strewn everywhere, as though the night sky had showered down. I paused once briefly. A small octopus, its beautiful dark-lensed eyes bleared with sand, gazed up at me from a ragged bundle of tentacles. I hesitated, and touched it briefly with my foot. It was dead. I paced on once more before the spreading whitecaps of the surf.",[5825,7313,7314],{},"The shore grew steeper, the sound of the sea heavier and more menacing, as I rounded a bluff into the full blast of the offshore wind. I was away from the shellers now and strode more rapidly over the wet sand that effaced my footprints. Around the next point there might be a refuge from the wind. The sun behind me was pressing upward at the horizon's rim -- an ominous red glare amidst the tumbling blackness of the clouds. Ahead of me, over the projecting point, a gigantic rainbow of incredible perfection had sprung shimmering into existence. Somewhere toward its foot I discerned a human figure standing, as it seemed to me, within the rainbow, though unconscious of his position. He was gazing fixedly at something in the sand.",[5825,7316,7317],{},"Eventually he stooped and flung the object beyond the breaking surf. I labored toward him over a half mile of uncertain footing. By the time I reached him the rainbow had receded ahead of us, but something of its color still ran hastily in many changing lights across his features. He was starting to kneel again.",[5825,7319,7320],{},"In a pool of sand and silt a starfish had thrust its arms up stiffly and was holding its body away from the stifling mud.",[5825,7322,7323],{},"\"It's still alive,\" I ventured.",[5825,7325,7326],{},"\"Yes,\" he said, and with a quick yet gentle movement he picked up the star and spun it over my head and far out into the sea. It sank in a burst of spume, and the waters roared once more.",[5825,7328,7329],{},"\"It may live,\" he said, \"if the offshore pull is strong enough.\" He spoke gently, and across his bronzed worn face the light still came and went in subtly altering colors.",[5825,7331,7332],{},"\"There are not many come this far,\" I said, groping in a sudden embarrassment for words. \"Do you collect?\"",[5825,7334,7335],{},"\"Only like this,\" he said softly, gesturing amidst the wreckage of the shore. \"And only for the living.\" He stooped again, oblivious of my curiosity, and skipped another star neatly across the water.",[5825,7337,7187],{},[5825,7339,7340],{},"He looked full at me with a faint question kindling in his eyes, which seemed to take on the far depths of the sea.",[5825,7342,7343],{},"\"I do not collect,\" I said uncomfortably, the wind beating at my garments. \"Neither the living nor the dead. I gave it up a long time ago. Death is the only successful collector.\" I could feel the full night blackness in my skull and the terrible eye resuming its indifferent journey. I nodded and walked away, leaving him there upon the dune with that great rainbow ranging up the sky behind him.",[5825,7345,7346],{},"I turned as I neared a bend in the coast and saw him toss another star, skimming it skillfully far out over the ravening and tumultuous water. For a moment, in the changing light, the sower appeared magnified, as though casting larger stars upon some greater sea. He had, at any rate, the posture of a god.",[5825,7348,7349],{},"But again the eye, the cold world-shriveling eye, began its inevitable circling in my skull. He is a man, I considered sharply, bringing my thought to rest. The star thrower is a man, and death is running more fleet than he along every seabeach in the world.",[5825,7351,7352],{},"I adjusted the dark lens of my glasses and, thus disguised, I paced slowly back by the starfish gatherers, past the shell collectors, with their vulgar little spades and the stick-length shelling pincers that eased their elderly backs while they snatched at treasures in the sand. I chose to look full at the steaming kettles in which beautiful voiceless things were being boiled alive. Behind my sunglasses a kind of litany began and refused to die down. \"As I came through the desert thus it was, as I came through the desert.\"",[5825,7354,7355],{},"In the darkness of my room I lay quiet with the sunglasses removed, but the eye turned and turned. In the desert, an old monk had once advised a traveler, the voices of God and the Devil are scarcely distinguishable. Costabel was a desert. I lay quiet, but my restless hand at the bedside fingered the edge of an invisible abyss. \"Certain coasts,\" the remark of a perceptive writer came back to me, \"are set apart for shipwreck.\" With unerring persistence I had made my way thither.",[6071,7357,5275],{"id":7358},"_2",[5825,7360,7361],{},"There is a difference in our human outlook, depending on whether we have been born upon level plains, where one step reasonably leads to another, or whether, by contrast, we have spent our lives amidst glacial crevasses and precipitous descents. In the case of the mountaineer, one step does not always lead rationally to another save by a desperate leap over a chasm or by an even more hesitant tiptoeing across precarious snow bridges.",[5825,7363,7364],{},"Something about these opposed landscapes has its analogue in the mind of man. Our prehistoric life, one might say, began amidst enforested gloom with the abandonment of the protected instinctive life of nature. We sought, instead, an adventurous existence amidst the crater lands and ice fields of self-generated ideas. Clambering onward, we have slowly made our way out of a maze of isolated peaks into the level plains of science. Here, one step seems definitely to succeed another, the universe appears to take on an imposed order, and the illusions through which mankind has painfully made its way for many centuries have given place to the enormous vistas of past and future time. The encrusted eye in the stone speaks to us of undeviating sunlight; the calculated elliptic of Halley's comet no longer forecasts world disaster. The planet plunges on through a chill void of star years, and there is little or nothing that remains unmeasured.",[5825,7366,7367],{},"Nothing, that is, but the mind of man. Since boyhood I had been traveling across the endless co-ordinated realms of science, just as, in the body, I was a plains dweller, accustomed to plodding through distances unbroken by precipices. Now that I come to look back, there was one contingent aspect of that landscape I inhabited whose significance, at the time, escaped me. \"Twisters,\" we called them locally. They were a species of cyclonic, bouncing air funnel that could suddenly loom out of nowhere, crumpling windmills or slashing with devastating fury through country towns. Sometimes, by modest contrast, more harmless varieties known as dust devils might pursue one in a gentle spinning dance for miles. One could see them hesitantly stalking across the alkali flats on a hot day, debating, perhaps, in their tall, rotating columns, whether to ascend and assume more formidable shapes. They were the trickster part of an otherwise pedestrian landscape.",[5825,7369,7370],{},"Infrequent though the visitations of these malign creations of the air might be, all prudent homesteaders in those parts had provided themselves with cyclone cellars. In the careless neighborhood in which I grew up, however, we contented ourselves with the queer yarns of cyclonic folklore and the vagaries of weather prophecy. As a boy, aroused by these tales and cherishing a subterranean fondness for caves, I once attempted to dig a storm cellar. Like most such projects this one was never completed. The trickster element in nature, I realize now, had so buffeted my parents that they stoically rejected planning. Unconsciously, they had arrived at the philosophy that foresight merely invited the attention of some baleful intelligence that despised and persecuted the calculating planner. It was not until many years later that I came to realize that a kind of maleficent primordial power persists in the mind as well as in the wandering dust storms of the exterior world.",[5825,7372,7373],{},"A hidden dualism that has haunted man since antiquity runs across his religious conceptions as the conflict between good and evil. It persists in the modern world of science under other guises. It becomes chaos versus form or antichaos. Form, since the rise of the evolutionary philosophy, has itself taken on an illusory quality. Our apparent shapes no longer have the stability of a single divine fiat. Instead, they waver and dissolve into the unexpected. We gaze backward into a contracting cone of life until words leave us and all we know is dissolved into the simple circuits of a reptilian brain. Finally, sentience subsides into an animalcule.",[5825,7375,7376],{},"Or we revolt and refuse to look deeper, but the void remains. We are rag dolls made out of many ages and skins, changelings who have slept in wood nests or hissed in the uncouth guise of waddling amphibians. We have played such roles for infinitely longer ages than we have been men. Our identity is a dream. We are process, not reality, for reality is an illusion of the daylight -- the light of our particular day. In a fortnight, as aeons are measured, we may lie silent in a bed of stone, or, as has happened in the past, be figured in another guise. Two forces struggle perpetually in our bodies: Yam, the old sea dragon of the original Biblical darkness, and, arrayed against him, some wisp of dancing light that would have us linger, wistful, in our human form. \"Tarry thou, till I come again\" -- an old legend survives among us of the admonition given by Jesus to the Wandering Jew. The words are applicable to all of us. Deep-hidden in the human psyche there is a similar injunction no longer having to do with the longevity of the body but, rather, a plea to wait upon some transcendent lesson preparing in the mind itself.",[5825,7378,7379],{},"Yet the facts we face seem terrifyingly arrayed against us. It is as if at our backs, masked and demonic, moved the trickster as I have seen his role performed among the remnant of a savage people long ago. It was that of the jokester present at the most devout of ceremonies. This creature never laughed; he never made a sound. Painted in black, he followed silently behind the officiating priest, mimicking, with the added flourish of a little whip, the gestures of the devout one. His timed and stylized posturings conveyed a derision infinitely more formidable than actual laughter.",[5825,7381,7382],{},"In modern terms, the dance of contingency, of the indeterminable, outwits us all. The approaching, fateful whirlwind on the plain had mercifully passed me by in youth. In the moment when I had witnessed that fireside performance I knew with surety that primitive man had lived with a dark message. He had acquiesced in the admission into his village of a cosmic messenger. Perhaps the primitives were wiser in the ways of the trickster universe than ourselves; perhaps they knew, as we do not, how to ground or make endurable the lightning.",[5825,7384,7385],{},"At all events, I had learned, as I watched that half-understood drama by the leaping fire, why man, even modern man, reads goose bones for the weather of his soul. Afterward I had gone out, a troubled unbeliever, into the night. There was a shadow I could not henceforth shake off, which I knew was posturing and would always posture behind me. That mocking shadow looms over me as I write. It scrawls with a derisive pen and an exaggerated flourish. I know instinctively it will be present to caricature the solemnities of my deathbed. In a quarter of a century it has never spoken.",[5825,7387,7388],{},"Black magic, the magic of the primeval chaos, blots out or transmogrifies the true form of things. At the stroke of twelve the princess must flee the banquet or risk discovery in the rags of a kitchen wench; coach reverts to pumpkin. Instability lies at the heart of the world. With uncanny foresight folklore has long toyed symbolically with what the nineteenth century was to proclaim a reality, namely, that form is an illusion of the time dimension, that the magic flight of the pursued hero or heroine through frogskin and wolf coat has been, and will continue to be, the flight of all men.",[5825,7390,7391],{},"Goethe's genius sensed, well before the publication of the Origin of Species, the thesis and antithesis that epitomize the eternal struggle of the immediate species against its dissolution into something other: in modern terms, fish into reptile, ape into man. The power to change is both creative and destructive -- a sinister gift, which, unrestricted, leads onward toward the formless and inchoate void of the possible. This force can only be counterbalanced by an equal impulse toward specificity. Form, once arisen, clings to its identity. Each species and each individual holds tenaciously to its present nature. Each strives to contain the creative and abolishing maelstrom that pours unseen through the generations. The past vanishes; the present momentarily persists; the future is potential only. In this specious present of the real, life struggles to maintain every manifestation, every individuality, that exists. In the end, life always fails, but the amorphous hurrying stream is held and diverted into new organic vessels in which form persists, though the form may not be that of yesterday.",[5825,7393,7394],{},"The evolutionists, piercing beneath the show of momentary stability, discovered, hidden in rudimentary organs, the discarded rubbish of the past. They detected the reptile under the lifted feathers of the bird, the lost terrestrial limbs dwindling beneath the blubber of the giant cetaceans. They saw life rushing outward from an unknown center, just as today the astronomer senses the galaxies fleeing into the infinity of darkness. As the spinning galactic clouds hurl stars and worlds across the night, so life, equally impelled by the centrifugal powers lurking in the germ cell, scatters the splintered radiance of consciousness and sends it prowling and contending through the thickets of the world.",[5825,7396,7397],{},"All this devious, tattered way was exposed to the ceaselessly turning eye within the skull that lay hidden upon the bed in Costabel. Slowly that eye grew conscious of another eye that searched it with equal penetration from the shadows of the room. It may have been a projection from the mind within the skull, but the eye was, nevertheless, exteriorized and haunting. It began as something glaucous and blind beneath a web of clinging algae. It altered suddenly and became the sand-smeared eye of the dead cephalopod I had encountered upon the beach. The transformations became more rapid with the concentration of my attention, and they became more formidable. There was the beaten, bloodshot eye of an animal from somewhere within my childhood experience. Finally, there was an eye that seemed torn from a photograph, but that looked through me as though it had already raced in vision up to the steep edge of nothingness and absorbed whatever terror lay in that abyss. I sank back again upon my cot and buried my head in the pillow. I knew the eye and the circumstance and the question. It was my mother. She was long dead, and the way backward was lost.",[6071,7399,5280],{"id":7400},"_3",[5825,7402,7403],{},"Now it may be asked, upon the coasts that invite shipwreck, why the ships should come, just as we may ask the man who pursues knowledge why he should be left with a revolving search beam in the head whose light falls only upon disaster or the flotsam of the shore. There is an answer, but its way is not across the level plains of science, for the science of remote abysses no longer shelters man. Instead, it reveals him in vaporous metamorphic succession as the homeless and unspecified one, the creature of the magic flight.",[5825,7405,7406],{},"Long ago, when the future was just a simple tomorrow, men had cast intricately carved game counters to determine its course, or they had traced with a grimy finger the cracks on the burnt shoulder blade of a hare. It was a prophecy of tomorrow's hunt, just as was the old farmer's anachronistic reading of the weather from the signs on the breastbone of a goose. Such quaint almanacs of nature's intent had sufficed mankind since antiquity. They would do so no longer, nor would formal apologies to the souls of the game men hunted. The hunters had come, at last, beyond the satisfying supernatural world that had always surrounded the little village, into a place of homeless frontiers and precipitous edges, the indescribable world of the natural. Here tools increasingly revenged themselves upon their creators and tomorrow became unmanageable. Man had come in his journeying to a region of terrible freedoms.",[5825,7408,7409],{},"It was a place of no traditional shelter, save those erected with the aid of tools, which had also begun to achieve a revolutionary independence from their masters. Their ways had grown secretive and incalculable. Science, more powerful than the magical questions that might be addressed by a shaman to a burnt shoulder blade, could create these tools but had not succeeded in controlling their ambivalent nature. Moreover, they responded all too readily to that urge for tampering and dissolution which is part of our primate heritage.",[5825,7411,7412],{},"We had been safe in the enchanted forest only because of our weakness. When the powers of that gloomy region were given to us, immediately, as in a witch's house, things began to fly about unbidden. The tools, if not science itself, were linked intangibly to the subconscious poltergeist aspect of man's nature. The closer man and the natural world drew together, the more erratic became the behavior of each. Huge shadows leaped triumphantly after every blinding illumination. It was a magnified but clearly recognizable version of the black trickster's antics behind the solemn backs of the priesthood. Here, there was one difference. The shadows had passed out of all human semblance; no societal ritual safely contained their posturings, as in the warning dance of the trickster. Instead, unseen by many because it was so gigantically real, the multiplied darkness threatened to submerge the carriers of the light.",[5825,7414,7415],{},"Darwin, Einstein, and Freud might be said to have released the shadows. Yet man had already entered the perilous domain that henceforth would contain his destiny. Four hundred years ago Francis Bacon had already anticipated its dual nature. The individuals do not matter. If they had not made their discoveries, others would have surely done so. They were good men, and they came as enlighteners of mankind. The tragedy was only that at their backs the ritual figure with the whip was invisible. There was no longer anything to subdue the pride of man. The world had been laid under the heavy spell of the natural; henceforth, it would be ordered by man.",[5825,7417,7418],{},"Humanity was suddenly entranced by light and fancied it reflected light. Progress was its watchword, and for a time the shadows seemed to recede. Only a few guessed that the retreat of darkness presaged the emergence of an entirely new and less tangible terror. Things, in the words of G. K. Chesterton, were to grow incalculable by being calculated. Man's powers were finite; the forces he had released in nature recognized no such limitations. They were the irrevocable monsters conjured up by a completely amateur sorcerer.",[5825,7420,7421],{},"But what, we may ask, was the nature of the first discoveries that now threaten to induce disaster? Pre-eminent among them was, of course, the perception to which we have already referred: the discovery of the interlinked and evolving web of life. The great Victorian biologists saw, and yet refused to see, the war between form and formlessness, chaos and antichaos, which the poet Goethe had sensed contesting beneath the smiling surface of nature. \"The dangerous gift from above,\" he had termed it, with uneasy foresight.",[5825,7423,7424],{},"By contrast, Darwin, the prime student of the struggle for existence, sought to visualize in a tangled bank of leaves the silent and insatiable war of nature. Still, he could imply with a veiled complacency that man might \"with some confidence\" look forward to a secure future \"of inappreciable length.\" This he could do upon the same page in the Origin of Species where he observes that \"of the species now living very few will transmit progeny to a far distant futurity.\" The contradiction escaped him; he did not wish to see it. Darwin, in addition, saw life as a purely selfish struggle, in which nothing is modified for the good of another species without being directly advantageous to its associated form.",[5825,7426,7427],{},"If, he contended, one part of any single species had been formed for the exclusive good of another, \"it would annihilate my theory.\" Powerfully documented and enhanced though the statement has become, famine, war, and death are not the sole instruments biologists today would accept as the means toward that perfection of which Darwin spoke. The subject is subtle and intricate, however, and one facet of it must be reserved for another chapter. Let it suffice to say here that the sign of the dark cave and the club became so firmly fixed in human thinking that in our time it has been invoked as signifying man's true image in books selling in the hundreds of thousands.",[5825,7429,7430],{},"From the thesis and antithesis contained in Darwinism we come to Freud. The public knows that, like Darwin, the master of the inner world took the secure, stable, and sunlit province of the mind and revealed it as a place of contending furies. Ghostly transformations, flitting night shadows, misshapen changelings existed there, as real as anything that haunted the natural universe of Darwin. For this reason, appropriately, I had come as the skull and the eye to Costabel -- the coast demanding shipwreck. Why else had I remembered the phrase, except for a dark impulse toward destruction lurking somewhere in the subconscious? I lay on the bed while the agonized eye in the remembered photograph persisted at the back of my closed lids.",[5825,7432,7433],{},"It had begun when, after years of separation, I had gone dutifully home to a house from which the final occupant had departed. In a musty attic -- among old trunks, a broken aquarium, and a dusty heap of fossil shells collected in childhood -- I found a satchel. The satchel was already a shabby antique, in whose depths I turned up a jackknife and a \"rat\" of hair such as women wore at the beginning of the century. Beneath these lay a pile of old photographs and a note -- two notes, rather, evidently dropped into the bag at different times. Each, in a thin, ornate hand, reiterated a single message that the writer had believed important. \"This satchel belongs to my son, Loren Eiseley.\" It was the last message. I recognized the trivia. The jackknife I had carried in childhood. The rat of hair had belonged to my mother, and there were also two incredibly pointed slippers that looked as though they had been intended for a formal ball, to which I knew well my mother would never in her life have been invited. I undid the rotted string around the studio portraits.",[5825,7435,7436],{},"Mostly they consisted of stiff, upright bearded men and heavily clothed women equally bound to the formalities and ritual that attended upon the photography of an earlier generation. No names identified the pictures, although here and there a reminiscent family trait seemed faintly evident. Finally I came upon a less formal photograph, taken in the eighties of the last century. Again no names identified the people, but a commercial stamp upon the back identified the place: Dyersville, Iowa. I had never been in that country town, but I knew at once it was my mother's birthplace.",[5825,7438,7439],{},"Dyersville, the thought flashed through my mind, making the connection now for the first time: the dire place. I recognized at once the two sisters at the edge of the photograph, the younger clinging reluctantly to the older. Six years old, I thought, turning momentarily away from the younger child's face. Here it began, her pain and mine. The eyes in the photograph were already remote and shadowed by some inner turmoil. The poise of the body was already that of one miserably departing the peripheries of the human estate. The gaze was mutely clairvoyant and lonely. It was the gaze of a child who knew unbearable difference and impending isolation.",[5825,7441,7442],{},"I dropped the notes and pictures once more into the bag. The last message had come from Dyersville: \"my son.\" The child in the photograph had survived to be an ill-taught prairie artist. She had been deaf. All her life she had walked the precipice of mental breakdown. Here on this faded porch it had begun -- the long crucifixion of life. I slipped downstairs and out of the house. I walked for miles through the streets.",[5825,7444,7445],{},"Now at Costabel I put on the sunglasses once more, but the face from the torn photograph persisted behind them. It was as though I, as man, was being asked to confront, in all its overbearing weight, the universe itself. \"Love not the world,\" the Biblical injunction runs, \"neither the things that are in the world.\" The revolving beam in my mind had stopped, and the insect whisperings of the intellect. There was, at last, an utter stillness, a waiting as though for a cosmic judgment. The eye, the torn eye, considered me.",[5825,7447,7448,7449,7452],{},"\"But I ",[5834,7450,7451],{},"do"," love the world,\" I whispered to a waiting presence in the empty room. \"I love its small ones, the things beaten in the strangling surf, the bird, singing, which flies and falls and is not seen again.\" I choked and said, with the torn eye still upon me, \"I love the lost ones, the failures of the world.\" It was like the renunciation of my scientific heritage. The torn eye surveyed me sadly and was gone. I had come full upon one of the last great rifts in nature, and the merciless beam no longer was in traverse around my skull.",[5825,7454,7455],{},"But no, it was not a rift but a joining: the expression of love projected beyond the species boundary by a creature born of Darwinian struggle, in the silent war under the tangled bank. \"There is no boon in nature,\" one of the new philosophers had written harshly in the first years of the industrial cities. Nevertheless, through war and famine and death, a sparse mercy had persisted, like a mutation whose time had not yet come. I had seen the star thrower cross that rift and, in so doing, he had reasserted the human right to define his own frontier. He had moved to the utmost edge of natural being, if not across its boundaries. It was as though at some point the supernatural had touched hesitantly, for an instant, upon the natural.",[5825,7457,7458],{},"Out of the depths of a seemingly empty universe had grown an eye, like the eye in my room, but an eye on a vastly larger scale. It looked out upon what I can only call itself. It searched the skies and it searched the depths of being. In the shape of man it had ascended like a vaporous emanation from the depths of night. The nothing had miraculously gazed upon the nothing and was not content. It was an intrusion into, or a projection out of, nature for which no precedent existed. The act was, in short, an assertion of value arisen from the domain of absolute zero. A little whirlwind of commingling molecules had succeeded in confronting its own universe.",[5825,7460,7461],{},"Here, at last, was the rift that lay beyond Darwin's tangled bank. For a creature, arisen from that bank and born of its contentions, had stretched out its hand in pity. Some ancient, inexhaustible, and patient intelligence, lying dispersed in the planetary fields of force or amidst the inconceivable cold of interstellar space, had chosen to endow its desolation with an apparition as mysterious as itself. The fate of man is to be the ever recurrent, reproachful Eye floating upon night and solitude. The world cannot be said to exist save by the interposition of that inward eye -- an eye various and not under the restraints to be apprehended from what is vulgarly called the natural.",[5825,7463,7464],{},"I had been unbelieving. I had walked away from the star thrower in the hardened indifference of maturity. But thought mediated by the eye is one of nature's infinite disguises. Belatedly, I arose with a solitary mission. I set forth in an effort to find the star thrower.",[6071,7466,5285],{"id":7467},"_4",[5825,7469,7470],{},"Man is himself, like the universe he inhabits, like the demoniacal stirrings of the ooze from which he sprang, a tale of desolations. He walks in his mind from birth to death the long resounding shores of endless disillusionment. Finally, the commitment to life departs or turns to bitterness. But out of such desolation emerges the awesome freedom to choose -- to choose beyond the narrowly circumscribed circle that delimits the animal being. In that widening ring of human choice, chaos and order renew their symbolic struggle in the role of titans. They contend for the destiny of a world.",[5825,7472,7473],{},"Somewhere far up the coast wandered the star thrower beneath his rainbow. Our exchange had been brief because upon that coast I had learned that men who ventured out at dawn resented others in the greediness of their compulsive collecting. I had also been abrupt because I had, in the terms of my profession and experience, nothing to say. The star thrower was mad, and his particular acts were a folly with which I had not chosen to associate myself. I was an observer and a scientist. Nevertheless, I had seen the rainbow attempting to attach itself to earth.",[5825,7475,7476],{},"On a point of land, as though projecting into a domain beyond us, I found the star thrower. In the sweet rain-swept morning, that great many-hued rainbow still lurked and wavered tentatively beyond him. Silently I sought and picked up a still-living star, spinning it far out into the waves. I spoke once briefly. \"I understand,\" I said. \"Call me another thrower.\" Only then I allowed myself to think, He is not alone any longer. After us there will be others.",[5825,7478,7479],{},"We were part of the rainbow -- an unexplained projection into the natural. As I went down the beach I could feel the drawing of a circle in men's minds, like that lowering, shifting realm of color in which the thrower labored. It was a visible model of something toward which man's mind had striven, the circle of perfection.",[5825,7481,7482],{},"I picked and flung another star. Perhaps far outward on the rim of space a genuine star was similarly seized and flung. I could feel the movement in my body. It was like a sowing -- the sowing of life on an infinitely gigantic scale. I looked back across my shoulder. Small and dark against the receding rainbow, the star thrower stooped and flung once more. I never looked again. The task we had assumed was too immense for gazing. I flung and flung again while all about us roared the insatiable waters of death.",[5825,7484,7485],{},"But we, pale and alone and small in that immensity, hurled back the living stars. Somewhere far off, across bottomless abysses, I felt as though another world was flung more joyfully. I could have thrown in a frenzy of joy, but I set my shoulders and cast, as the thrower in the rainbow cast, slowly, deliberately, and well. The task was not to be assumed lightly, for it was men as well as starfish that we sought to save. For a moment, we cast on an infinite beach together beside an unknown hurler of suns. It was, unsought, the destiny of my kind since the rituals of the ice age hunters, when life in the Northern Hemisphere had come close to vanishing. We had lost our way, I thought, but we had kept, some of us, the memory of the perfect circle of compassion from life to death and back again to life -- the completion of the rainbow of existence. Even the hunters in the snow, making obeisance to the souls of the hunted, had known the cycle. The legend had come down and lingered that he who gained the gratitude of animals gained help in need from the dark wood.",[5825,7487,7488],{},"I cast again with an increasingly remembered sowing motion and went my lone way up the beaches. Somewhere, I felt, in a great atavistic surge of feeling, somewhere the Thrower knew. Perhaps he smiled and cast once more into the boundless pit of darkness. Perhaps he, too, was lonely, and the end toward which he labored remained hidden -- even as with ourselves.",[5825,7490,7491],{},"I picked up a star whose tube feet ventured timidly among my fingers while, like a true star, it cried soundlessly for life. I saw it with an unaccustomed clarity and cast far out. With it, I flung myself as forfeit, for the first time, into some unknown dimension of existence. From Darwin's tangled bank of unceasing struggle, selfishness, and death, had arisen, incomprehensibly, the thrower who loved not man, but life. It was the subtle cleft in nature before which biological thinking had faltered. We had reached the last shore of an invisible island -- yet, strangely, also a shore that the primitives had always known. They had sensed intuitively that man cannot exist spiritually without life, his brother, even if he slays. Somewhere, my thought persisted, there is a hurler of stars, and he walks, because he chooses, always in desolation, but not in defeat.",[5825,7493,7494],{},"In the night the gas flames under the shelling kettles would continue to glow. I set my clock accordingly. Tomorrow I would walk in the storm. I would walk against the shell collectors and the flames. I would walk remembering Bacon's forgotten words \"for the uses of life.\" I would walk with the knowledge of the discontinuities of the unexpected universe. I would walk knowing of the rift revealed by the thrower, a hint that there looms, inexplicably, in nature something above the role men give her. I knew it from the man at the foot of the rainbow, the starfish thrower on the beaches of Costabel.",[5829,7496],{},[5825,7498,7499],{},[7247,7500,7249,7501,7254,7504,7258],{},[5950,7502,7253],{"href":7196,"rel":7503},[5954],[5834,7505,7257],{},{"title":45,"searchDepth":15,"depth":15,"links":7507},[7508,7509,7510],{"id":7358,"depth":15,"text":5275},{"id":7400,"depth":15,"text":5280},{"id":7467,"depth":15,"text":5285},"2025-03-27","Editor Note: This piece is by Loren Eiseley, 1969. Published in The Unexpected Universe. Transcribed here from a PDF scan I found.",{},{"title":5270,"description":7512},[],"01lnNzCmdbgoKiRtuptBPah5Y0wA7z8cZdB8j7xB9jI",{"id":7518,"title":4875,"body":7519,"createdAt":7511,"description":7658,"draft":5972,"extension":5973,"image":7638,"mastodonThread":5974,"meta":7659,"navigation":5976,"path":4874,"seo":7660,"stem":7661,"tags":7662,"updatedAt":7511,"__hash__":7663},"content\u002FTLT - 2025.03.27 - Generative Chuapin.md",{"type":5822,"value":7520,"toc":7656},[7521,7530,7532,7535,7546,7549,7639,7647],[5825,7522,7523,7524,7529],{},"Using the ",[5950,7525,7528],{"href":7526,"rel":7527},"https:\u002F\u002Fopenai.com\u002Findex\u002Fintroducing-4o-image-generation\u002F",[5954],"new ChatGPT GPT-4o Image Generation"," to incrementally generate a photo of Hoda! (A \"Chipin\" is a 50-50 Chuhuahua and Mini-Pincer. Hoda is 70-20, so is a ChuhuaPin!)",[5829,7531],{},[5825,7533,7534],{},"Previously if you asked ChatGPT to generate you an image it would switch over to DALL-E, a separate image generation model. Each time it generated a new image it would more or less start from the beginning, maybe, and it was a challenge to get small incremental changes to an image.",[5825,7536,5988,7537,7541,7542,7545],{},[5950,7538,7540],{"href":7526,"rel":7539},[5954],"ChatGPT GPT-4o Image Generation Update"," it now uses the ",[5834,7543,7544],{},"same model"," to generate the image as it is contextualizing your prompt, which makes it much more capable of things like incremental changes (it isn't starting from scratch each time). At least, that's how I understand it.",[5825,7547,7548],{},"As a fun experiment, I tried to generate a dog that looks like hoda! Here is every step that I took. I had to brighten\u002Fsharpen the images quite a bit.",[7550,7551,7552],"table",{},[7553,7554,7555,7569,7579,7589,7599,7609,7619,7629],"tbody",{},[7556,7557,7558,7563],"tr",{},[7559,7560,7562],"td",{"style":7561},"vertical-align: middle;","Create an image of a dog that is 70% Chihuahua, 20% mini pincer, and 10% mutt",[7559,7564,7565],{},[6416,7566],{"src":7567,"width":7568},"img\u002Fbright_chatgpt_gen_chihuahua_1.png",400,[7556,7570,7571,7574],{},[7559,7572,7573],{"style":7561},"Give it a slightly brindle coloring. Still with a black base coat, but the brindle highlights closer to grey",[7559,7575,7576],{},[6416,7577],{"src":7578,"width":7568},"img\u002Fbright_chatgpt_gen_chihuahua_2.png",[7556,7580,7581,7584],{},[7559,7582,7583],{"style":7561},"Close, but went a bit too far. Make one halfway between these two!",[7559,7585,7586],{},[6416,7587],{"src":7588,"width":7568},"img\u002Fbright_chatgpt_gen_chihuahua_3.png",[7556,7590,7591,7594],{},[7559,7592,7593],{"style":7561},"More black. Also give her a blue harness",[7559,7595,7596],{},[6416,7597],{"src":7598,"width":7568},"img\u002Fbright_chatgpt_gen_chihuahua_4.png",[7556,7600,7601,7604],{},[7559,7602,7603],{"style":7561},"Make her a liiiitle thinner",[7559,7605,7606],{},[6416,7607],{"src":7608,"width":7568},"img\u002Fbright_chatgpt_gen_chihuahua_5.png",[7556,7610,7611,7614],{},[7559,7612,7613],{"style":7561},"The body and color are good. Make the head a little more chihuahua",[7559,7615,7616],{},[6416,7617],{"src":7618,"width":7568},"img\u002Fbright_chatgpt_gen_chihuahua_6.png",[7556,7620,7621,7624],{},[7559,7622,7623],{"style":7561},"Make her hair on her neck a little bald",[7559,7625,7626],{},[6416,7627],{"src":7628,"width":7568},"img\u002Fbright_chatgpt_gen_chihuahua_7.png",[7556,7630,7631,7634],{},[7559,7632,7633],{"style":7561},"Really close! Make her ears just a little bit smaller.",[7559,7635,7636],{},[6416,7637],{"src":7638,"width":7568},"img\u002Fbright_chatgpt_gen_chihuahua_8.png",[5825,7640,7641,7642,7644],{},"This is a lot like what I imagine working with a crime sketch artist would be like! Here is the final image a bit bigger. I think this is what Hoda looked like when she was young!",[6297,7643],{},[6416,7645],{"src":7638,"width":7646},600,[5825,7648,7649,7650,7652],{},"And here is Hoda from a real camera IRL. A bit older, a bit blinder :)",[6297,7651],{},[6416,7653],{"src":7654,"width":7655},"img\u002Fhoda-20250327.png",800,{"title":45,"searchDepth":15,"depth":15,"links":7657},[],"Using the new ChatGPT GPT-4o Image Generation to incrementally generate a photo of Hoda! (A \"Chipin\" is a 50-50 Chuhuahua and Mini-Pincer. Hoda is 70-20, so is a ChuhuaPin!)",{},{"title":4875,"description":7658},"TLT - 2025.03.27 - Generative Chuapin",[5980],"rqAUoXFsthSeWQAAnJebTB7r4bvsBqEdZUJgbO2yWm0",{"id":7665,"title":4850,"body":7666,"createdAt":7862,"description":4852,"draft":5972,"extension":5973,"image":7799,"mastodonThread":5974,"meta":7863,"navigation":5976,"path":4849,"seo":7864,"stem":7865,"tags":7866,"updatedAt":7862,"__hash__":7868},"content\u002FTLT - 2025.03.14 - The Four Squares of Agency.md",{"type":5822,"value":7667,"toc":7855},[7668,7686,7688,7691,7700,7709,7713,7716,7723,7726,7731,7733,7736,7742,7745,7750,7753,7765,7771,7778,7784,7791,7794,7800,7809,7818,7827,7844,7852],[5825,7669,7670,7673,7674,7679,7680,7685],{},[7247,7671,7672],{},"Agency"," (a more useful concept of Free Will), has two important ingredients -- the ability to ",[5834,7675,7676],{},[7247,7677,7678],{},"predict"," outcomes and the ability to ",[5834,7681,7682],{},[7247,7683,7684],{},"influence"," outcomes -- both of which come in a spectrum of possible degrees. We can lay these out into a visualization that breaks down naturally into a four-square grid.",[5829,7687],{},[6071,7689,4855],{"id":7690},"the-two-ingredients",[5825,7692,7693,7694,7697,7698,7203],{},"Lately there has been a lot of thrash in the AI world around ",[6002,7695,7696],{},"Agents",", like what one is or what differentiates an Agent from an Algorithm and things like that. Let's take this from another angle, and talk through a concept of ",[7247,7699,7672],{},[5825,7701,7702],{},[7703,7704,7705],"small",{},[7706,7707,7708],"i",{},"(Note that there is nothing new under the sun; my thoughts here are largely (probably incorrect and mis-remembered) inspirations from Daniel Dennett and others. I struggle with knowing how to cite these ideas that have been rolling round my head for a long time.)",[7710,7711,4860],"h3",{"id":7712},"prediction",[5825,7714,7715],{},"Given the state of the world, how far out and how accurately can you predict what comes next? Drop an apple from shoulder height and you can work out pretty accurately how long it'll take to hit the ground. Flip a coin and you can get it right .... half the time. Guessing what the weather will be in 5 minutes is quite a bit different from 5 hours or 5 years.",[5825,7717,7718],{},[6416,7719],{"alt":7720,"src":7721,"style":7722},"Prediction scale","img\u002FPrediction_scale.png","width: 100%",[5825,7724,7725],{},"Your ability to predict outcomes, to predict the future, varies based on the thing being predicted and how good your model is of the world. It gets more complicated when there are other Agents around changing things, but even without that some things are harder to predict and some things are easier to predict. You can also, at the very least, narrow down the range of possible or probable outcomes.",[5825,7727,7728],{},[7247,7729,7730],{},"Prediction is a context-specific spectrum",[7710,7732,4865],{"id":7684},[5825,7734,7735],{},"You have some control, some influence, over the world around you. Generally you can move about, interact with things, push buttons and open doors, etc. The result is that you are changing the state of the world, or possibly even preserving the state of the world. Typing on a keyboard, talking to other people, shouting on a street corner -- these all count too, and can have an outsized effect. Sticks and stones may break my bones, but words can build an army.",[5825,7737,7738],{},[6416,7739],{"alt":7740,"src":7741,"style":7722},"Influence scale","img\u002FInfluence_scale.png",[5825,7743,7744],{},"Making changes to the world, similar to prediction, varies on magnitude and accuracy. This includes how much control we have over our own bodies -- I can stand on a skateboard but I can't do a flip from a half-pipe. I can hold a knife, but I can't use it to repair a heart. The current state of the world also locks down what changes are available -- the heart surgeon can't operate if the patient isn't physically accessible to them.",[5825,7746,7747],{},[7247,7748,7749],{},"Influence is a context-specific spectrum",[6071,7751,4870],{"id":7752},"the-four-squares",[5825,7754,7755,7756,7758,7759,7761,7762,7764],{},"Put simply -- the amount of ",[7247,7757,7672],{}," you have is built on the degree of ",[7247,7760,4860],{}," and the degree of ",[7247,7763,4865],{},". Neither ingredient is all-or-nothing, and Agency itself is not all-or-nothing. Let's lay this out into a diagram:",[5825,7766,7767],{},[6416,7768],{"alt":7769,"src":7770,"style":7722},"Four Square Agency Model Blank","img\u002FFour_Square_Agency_Model_Blank.png",[5825,7772,7773,7774,7777],{},"Along the bottom axis we plot the ability to ",[7247,7775,7776],{},"Predict"," outcomes. On the left you have zero ability to predict what-comes-next, and as you move to the right your predictive powers increase in both accuracy and distance into the future.",[5825,7779,7780,7781,7783],{},"Along the left axis we plot ",[7247,7782,4865],{},". At the bottom you have zero ability to influence (change) the world, and as you move up your influence increases. A small action might make for a big change, and this axis is meant to capture the magnitude of the resulting change.",[5825,7785,7786,7787,7790],{},"Thinking about this in a two-dimensional space gives us some idea of a feedback loop on a fundamental concept -- to have ",[7247,7788,7789],{},"meaningful Agency"," you need to not only be able to influence the world, but have an idea about how that influence is going to actually impact things.",[5825,7792,7793],{},"We can break this space into four quadrants and label each of them to get some intuition on the combination between Prediction and Influence.",[5825,7795,7796],{},[6416,7797],{"alt":7798,"src":7799,"style":7722},"Four Square Agency Model","img\u002FFour_Square_Agency_Model.png",[5825,7801,7802,7803,7808],{},"Starting in the upper-left quadrant, ",[5834,7804,7805],{},[7247,7806,7807],{},"Low Prediction, High Influence -- The Gamble",". Here you are able to perform an action, make a change to the world, but really have no idea what is going to happen. It is like being on a game-show and you can pick a door, any door, but you don't know what is behind the door.",[5825,7810,7811,7812,7817],{},"Jumping down to the lower-right quadrant, ",[5834,7813,7814],{},[7247,7815,7816],{},"High Prediction, Low Influence -- The Inevitable",". Being on the high-end of the prediction range, you have a VERY good idea about what is going to happen. But very little of what you do will have any influence on the world, on the outcome. This is the fatalistic and inevitable end that is well known in advance.",[5825,7819,7820,7821,7826],{},"Moving to the left bottom, we have ",[5834,7822,7823],{},[7247,7824,7825],{},"Low Prediction, Low Influence -- The Lack Thereof",". Here you have no control and no idea what is going to happen. This might be some form of transcendent peace, an acceptance and simplistic state of being. It could also be that you are a pet rock with googly eyes. This is pretty much the opposite of having a lot of Agency.",[5825,7828,7829,7830,7835,7836,7839,7840,7843],{},"Finally, in the upper-right, we find ",[5834,7831,7832],{},[7247,7833,7834],{},"High Prediction, High Influence -- Agency",". This is a meaningful and useful idea of Agency. You both have the ability to influence the world ",[7247,7837,7838],{},"AND"," a good idea of the outcomes from that influence. Here is where you can ",[7247,7841,7842],{},"\"Call your shots\"",", performing some action and having a good idea about the result.",[5825,7845,7846,7847,7203],{},"From this basic framework, which we can probe in various ways to build more intuitions, we can derive a lot of interesting questions and conclusions. Chief among them -- if Agency is built on two variable ingredients, and we can change these variables, then ",[5834,7848,7849],{},[7247,7850,7851],{},"we can change our degree of Agency",[5825,7853,7854],{},"I will leave you with that thought :)",{"title":45,"searchDepth":15,"depth":15,"links":7856},[7857,7861],{"id":7690,"depth":15,"text":4855,"children":7858},[7859,7860],{"id":7712,"depth":56,"text":4860},{"id":7684,"depth":56,"text":4865},{"id":7752,"depth":15,"text":4870},"2025-03-14",{},{"title":4850,"description":4852},"TLT - 2025.03.14 - The Four Squares of Agency",[5980,7867],"agency","EmuOmW6RUGNOGHt0aa5HShh1dh9JP3Uo6SBNnRbLHFM",{"id":7870,"title":4820,"body":7871,"createdAt":8009,"description":8010,"draft":5972,"extension":5973,"image":7893,"mastodonThread":5974,"meta":8011,"navigation":5976,"path":4819,"seo":8012,"stem":8013,"tags":8014,"updatedAt":8009,"__hash__":8016},"content\u002FTLT - 2025.03.04 - Nerd Snipe - Task time tracking.md",{"type":5822,"value":7872,"toc":8004},[7873,7888,7894,7901,7904,7907,7929,7932,7951,7957,7960,7979,7984,7990],[5825,7874,7875,7876,7881,7882,7887],{},"Since I'm going some consulting work I have to do a bit of time tracking. And you know what that means! Playing with my ",[5950,7877,7880],{"href":7878,"rel":7879},"https:\u002F\u002Ftaskwarrior.org\u002F",[5954],"taskwarrior"," and ",[5950,7883,7886],{"href":7884,"rel":7885},"https:\u002F\u002Ftimewarrior.net\u002F",[5954],"timewarrior"," config!!!",[5825,7889,7890],{},[6416,7891],{"alt":7892,"src":7893},"stopwatch oil painting","img\u002Fstopwatch_oil_painting.png",[5825,7895,7896],{},[7703,7897,7898],{},[7706,7899,7900],{},"openai: Generate an image of a stopwatch in the style of an impressionist oil painting with thick bold brush strokes",[6071,7902,4825],{"id":7903},"what-would-you-say-you-do-here",[5825,7905,7906],{},"It's pretty easy for me to focus on something but it takes effort to make sure that I'm focused on the right thing, don't forget stuff, and keep track of what it is that I did. I have been using taskwarrior for quite a while, I even have it integrated in with my gmail-starred emails which is handy.",[5825,7908,7909,7910,7912,7913,7916,7917,7920,7921,7924,7925,7928],{},"But I also need to keep track of billable hours. There is a separate but corresponding ",[6002,7911,7886],{}," project for this, and a hook that ties them together. So once configured, if you do ",[6002,7914,7915],{},"task 123 start"," it will start the clock for task 123, and if you do either ",[6002,7918,7919],{},"task 123 stop"," or ",[6002,7922,7923],{},"task 123 done"," then it will stop the clock. You can use ",[6002,7926,7927],{},"timew"," reports to see the total time.",[6071,7930,4830],{"id":7931},"start-the-clock-immediately",[5825,7933,7934,7935,7940,7941,7946,7947,7950],{},"Sometimes, often, I want to note a task and immediately begin working on it. I modified the ",[5950,7936,7939],{"href":7937,"rel":7938},"https:\u002F\u002Fgithub.com\u002FGothenburgBitFactory\u002Ftimewarrior\u002Fblob\u002Fdevelop\u002Fext\u002Fon-modify.timewarrior",[5954],"on-modify.timewarrior"," to be a ",[5950,7942,7945],{"href":7943,"rel":7944},"https:\u002F\u002Fgist.github.com\u002Fawwaiid\u002F6963af7895005f7fa839b1663ec48a7e",[5954],"on-add.timewarrior"," and then add this alias into ",[6002,7948,7949],{},".taskrc",":",[6971,7952,7955],{"className":7953,"code":7954,"language":6976},[6974],"alias.doing = add start:now\n",[6002,7956,7954],{"__ignoreMap":45},[6071,7958,4835],{"id":7959},"only-one-clock-stop-it",[5825,7961,7962,7963,7965,7966,7968,7969,7972,7973,7975,7976,7978],{},"While there might be fancier ways to use ",[6002,7964,7886],{},", how I'm using it basically assumes there is only one task happening at a time. If you ",[6002,7967,7919],{}," then it stops the clock. If you ",[6002,7970,7971],{},"task 456 start"," then it stops the old one (in ",[6002,7974,7886],{},", not in ",[6002,7977,7880],{},") and starts the new one. Fine. But let's make a handy shorthand for stopping\u002Ffinishing the \"current\" task.",[5825,7980,7981,7982,7950],{},"Altogether, I now have this in my ",[6002,7983,7949],{},[6971,7985,7988],{"className":7986,"code":7987,"language":6976},[6974],"# These use on-add.timewarrior and on-modify.timewarrior hooks\n\n# Shortcuts to both add and start\nalias.doing = add start:now\n\n# Shortcuts to stop or complete the currently started\nalias.stopit = start.not: stop\nalias.doneit = start.not: done\n",[6002,7989,7987],{"__ignoreMap":45},[5825,7991,7992,7993,7996,7997,7920,8000,8003],{},"Now I can ",[6002,7994,7995],{},"task doing \"working on something\""," and then either ",[6002,7998,7999],{},"task stopit",[6002,8001,8002],{},"task doneit","!",{"title":45,"searchDepth":15,"depth":15,"links":8005},[8006,8007,8008],{"id":7903,"depth":15,"text":4825},{"id":7931,"depth":15,"text":4830},{"id":7959,"depth":15,"text":4835},"2025-03-04","Since I'm going some consulting work I have to do a bit of time tracking. And you know what that means! Playing with my taskwarrior and timewarrior config!!!",{},{"title":4820,"description":8010},"TLT - 2025.03.04 - Nerd Snipe - Task time tracking",[5980,8015],"nerdsnipe","hmFK8s6YHsLTQDuPoN0JtCMYKKb7rtjlodWByDnNgBg",{"id":8018,"title":4800,"body":8019,"createdAt":8187,"description":8023,"draft":5972,"extension":5973,"image":8029,"mastodonThread":8188,"meta":8189,"navigation":5976,"path":4799,"seo":8190,"stem":8191,"tags":8192,"updatedAt":8187,"__hash__":8194},"content\u002FTLT - 2025.01.31 - Link Roundup (LLM-AI).md",{"type":5822,"value":8020,"toc":8185},[8021,8024,8030,8182],[5825,8022,8023],{},"My friend Brad asked about what I've been reading lately in the AI\u002FLLM space to keep up. Here's my link roundup! Things that have been on my rotation lately.",[5825,8025,8026],{},[6416,8027],{"alt":8028,"src":8029},"LLM Newspaper Dog Cartoon","img\u002FLLM_Newspaper_Dog_Cartoon.png",[6013,8031,8032,8042,8052,8065,8075,8085,8100,8116,8142,8156,8166],{},[6016,8033,8034,8041],{},[7247,8035,8036],{},[5950,8037,8040],{"href":8038,"rel":8039},"https:\u002F\u002Fwww.amazon.com\u002Fdp\u002F1098166302",[5954],"AI Engineering: Building Applications with Foundation Models",": Great January-2025 catch up on consuming LLM\u002FAI usage in real world applications; enough background to Get It without being distracted by details",[6016,8043,8044,8051],{},[7247,8045,8046],{},[5950,8047,8050],{"href":8048,"rel":8049},"https:\u002F\u002Fsimonwillison.net\u002F",[5954],"Simon Willison Website",": Follow for great links and chasing the dragon of new releases and thoughts",[6016,8053,8054,8061,8062],{},[7247,8055,8056],{},[5950,8057,8060],{"href":8058,"rel":8059},"https:\u002F\u002Fllm.datasette.io\u002F",[5954],"LLM CLI (Datasette)",": From Simon Willison, a very handy CLI tool for interfacing with LLMs. Once set up, I use this as a unixy native tool. Like ... ",[6002,8063,8064],{},"cat some_file.txt | llm -s 'Turn this into a CSV of street, city, state, zip' > data.csv",[6016,8066,8067,8074],{},[7247,8068,8069],{},[5950,8070,8073],{"href":8071,"rel":8072},"https:\u002F\u002Fwww.reddit.com\u002Fr\u002FLocalLLaMA\u002F",[5954],"\u002Fr\u002FLocalLLaMA",": Reddit community all about running local LLMs; even if you only ever run things on other people's computer (API) it is interesting to know what might be happening on the other side",[6016,8076,8077,8084],{},[7247,8078,8079],{},[5950,8080,8083],{"href":8081,"rel":8082},"https:\u002F\u002Fwww.reddit.com\u002Fr\u002FClaudeAI\u002F",[5954],"\u002Fr\u002FClaudeAI",": Latest and Greatest with Claude Stuff",[6016,8086,8087,8094,8095,6259],{},[7247,8088,8089],{},[5950,8090,8093],{"href":8091,"rel":8092},"https:\u002F\u002Fgroq.com\u002F",[5954],"Groq",": Hardware accelerated LLM (also see ",[5950,8096,8099],{"href":8097,"rel":8098},"https:\u002F\u002Fcerebras.ai\u002F",[5954],"Cerebras",[6016,8101,8102,8109,8110,8115],{},[7247,8103,8104],{},[5950,8105,8108],{"href":8106,"rel":8107},"https:\u002F\u002Faider.chat\u002F",[5954],"Aider",": Open source CLI coding assistant. They've been building up an ",[5950,8111,8114],{"href":8112,"rel":8113},"https:\u002F\u002Faider.chat\u002Fdocs\u002Fleaderboards\u002F",[5954],"Aider LLM Leaderboard"," which is interesting, especially the highlighted polyglot board (one model for architecture plan, another for low-level coding)",[6016,8117,8118,8125,8126,8131,8132,8135,8136,8141],{},[7247,8119,8120],{},[5950,8121,8124],{"href":8122,"rel":8123},"https:\u002F\u002Fsourcegraph.com\u002Fcody",[5954],"Sourcegraph Cody",": There are several VSCode-embedded code assistants in this space, Cody is one to keep an eye on. Recently ",[5950,8127,8130],{"href":8128,"rel":8129},"https:\u002F\u002Fcode.visualstudio.com\u002Fdocs\u002Fcopilot\u002Fcopilot-edits",[5954],"Copilot Edits"," has stepped up to a similar cross-file assistant too. There are a bunch of others; I'm not really psyched about switching from vim to vscode, and I ",[5834,8133,8134],{},"certainly"," don't want to switch to a proprietary editor, so I haven't spent much time with things like ",[5950,8137,8140],{"href":8138,"rel":8139},"https:\u002F\u002Fwww.cursor.com\u002F",[5954],"Cursor"," (yet)",[6016,8143,8144,8151,8152,8155],{},[7247,8145,8146],{},[5950,8147,8150],{"href":8148,"rel":8149},"https:\u002F\u002Fwww.youtube.com\u002F@matthew_berman\u002Fvideos",[5954],"Matthew Berman (YouTube)",": He does videos with some demos and commentary that is pretty fun; I may not always agree, but even knowing what the latest ",[5834,8153,8154],{},"topics"," are is very helpful!",[6016,8157,8158,8165],{},[7247,8159,8160],{},[5950,8161,8164],{"href":8162,"rel":8163},"https:\u002F\u002Fchangelog.com\u002Fpracticalai",[5954],"Practical AI Podcast",": I listen to podcasts when I commute or go for longer drives, which isn't often but often enough that I've listened to some good episodes both here and on other ChangeLogs.",[6016,8167,8168,8175,8176,8181],{},[7247,8169,8170],{},[5950,8171,8174],{"href":8172,"rel":8173},"https:\u002F\u002Fwww.latent.space\u002Fpodcast",[5954],"Latent Space: The AI Engineer Podcast",": I've only listened to a few of these, but it is on top of my feed list in ",[5950,8177,8180],{"href":8178,"rel":8179},"https:\u002F\u002Fantennapod.org\u002F",[5954],"AntennaPod"," currently",[5825,8183,8184],{},"... I think that'll do for now!",{"title":45,"searchDepth":15,"depth":15,"links":8186},[],"2025-01-31","https:\u002F\u002Fmastodon.social\u002F@awwaiid\u002F113928577927928238",{},{"title":4800,"description":8023},"TLT - 2025.01.31 - Link Roundup (LLM-AI)",[5980,8193],"share","-xVWZ-BRMop2ee0RMuWeZXqIXg2FZdpv3gwiZUaOW-s",{"id":8196,"title":4805,"body":8197,"createdAt":8187,"description":4807,"draft":5972,"extension":5973,"image":8218,"mastodonThread":5974,"meta":8509,"navigation":5976,"path":4804,"seo":8510,"stem":8511,"tags":8512,"updatedAt":8187,"__hash__":8513},"content\u002FTLT - 2025.01.31 - VisiData XDG.md",{"type":5822,"value":8198,"toc":8505},[8199,8201,8204,8213,8219,8234,8241,8244,8247,8253,8262,8275,8312,8315,8499,8502],[5825,8200,4807],{},[6071,8202,4810],{"id":8203},"visidata",[5825,8205,8206,8207,8212],{},"I like ",[5950,8208,8211],{"href":8209,"rel":8210},"https:\u002F\u002Fwww.visidata.org\u002F",[5954],"VisiData","! If you are working with tabular data, like a CSV file, it is a lovely slicer and dicer. It's a pretty terminal-keyboard-heavy program, like a vim family thing. Like many of these power tools, I find that you can get into it best by finding ONE use-case and then gradually introducing new tricks from there. So the simple use-case for VisiData is simply viewing CSV files.",[5825,8214,8215],{},[6416,8216],{"alt":8217,"src":8218},"VisiData a simple CSV","img\u002FVisiData_a_simple_CSV.png",[5825,8220,8221,8222,8225,8226,8229,8230,8233],{},"After that you can learn some new commands, such as selecting rows with ",[6002,8223,8224],{},"|gilbert"," (regex select rows containing \"gilbert\") and then zooming in on them with ",[6002,8227,8228],{},"\""," (view only selected rows). You can press ",[6002,8231,8232],{},"\u003Center>"," on a row to see it vertically.",[5825,8235,8236,8237,8240],{},"After a while you get addicted to this sort of manipulation and you find yourself downloading CSVs from Firefox and then opening a terminal, navigating over to your downloads folder, and opening it with ",[6002,8238,8239],{},"vd data.csv"," or whatnot. So I wanted to cut out the middle bits.",[6071,8242,4815],{"id":8243},"xdg-terminal-wrapping",[5825,8245,8246],{},"First make a .desktop file for visidata at ~\u002F.local\u002Fshare\u002Fapplications\u002FVisiData.desktop containing:",[6971,8248,8251],{"className":8249,"code":8250,"language":6976},[6974],"[Desktop Entry]\nEncoding=UTF-8\nVersion=1.0\nType=Application\nTerminal=true\nExec=vd %U\nMimeType=application\u002Fvnd.oasis.opendocument.spreadsheet;application\u002Fvnd.oasis.opendocument.spreadsheet-template;application\u002Fvnd.sun.xml.calc;application\u002Fvnd.sun.xml.calc.template;application\u002Fmsexcel;application\u002Fvnd.ms-excel;application\u002Fvnd.openxmlformats-officedocument.spreadsheetml.sheet;application\u002Fvnd.ms-excel.sheet.macroEnabled.12;application\u002Fvnd.openxmlformats-officedocument.spreadsheetml.template;application\u002Fvnd.ms-excel.template.macroEnabled.12;application\u002Fvnd.ms-excel.sheet.binary.macroEnabled.12;text\u002Fcsv;application\u002Fx-dbf;text\u002Fspreadsheet;application\u002Fcsv;application\u002Fexcel;application\u002Ftab-separated-values;application\u002Fvnd.lotus-1-2-3;application\u002Fvnd.oasis.opendocument.chart;application\u002Fvnd.oasis.opendocument.chart-template;application\u002Fx-dbase;application\u002Fx-dos_ms_excel;application\u002Fx-excel;application\u002Fx-msexcel;application\u002Fx-ms-excel;application\u002Fx-quattropro;application\u002Fx-123;text\u002Fcomma-separated-values;text\u002Ftab-separated-values;text\u002Fx-comma-separated-values;text\u002Fx-csv;application\u002Fvnd.oasis.opendocument.spreadsheet-flat-xml;application\u002Fvnd.ms-works;application\u002Fclarisworks;application\u002Fx-iwork-numbers-sffnumbers;application\u002Fx-starcalc;\nName=VisiData\n",[6002,8252,8250],{"__ignoreMap":45},[5825,8254,8255,8256,8261],{},"which I got from ",[5950,8257,8260],{"href":8258,"rel":8259},"https:\u002F\u002Fdev.to\u002Fajkerrigan\u002Ftoday-i-learned-opening-csvs-with-visidata-in-tmux-from-the-firefox-flatpak-app-4m07",[5954],"this fun page"," with some slight modification.",[5825,8263,8264,8265,8270,8271,8274],{},"This worked! But it opens in gnome-terminal instead of alacritty. After some digging I found from ",[5950,8266,8269],{"href":8267,"rel":8268},"https:\u002F\u002Fgitlab.gnome.org\u002FGNOME\u002Fglib\u002F-\u002Fmerge_requests\u002F2839",[5954],"this merge request"," that you can put a wrapper named ",[6002,8272,8273],{},"xdg-terminal-exec"," in your path and it'll use that as the priority terminal app. So I created ~\u002Fbin\u002Fxdg-terminal-exec containing:",[6971,8276,8280],{"className":8277,"code":8278,"language":8279,"meta":45,"style":45},"language-sh shiki shiki-themes github-light github-dark monokai","#!\u002Fbin\u002Fsh\n\nexec ~\u002Fbin\u002Fterminal -e \"$@\"\n","sh",[6002,8281,8282,8288,8292],{"__ignoreMap":45},[5853,8283,8284],{"class":7026,"line":9},[5853,8285,8287],{"class":8286},"s8-w5","#!\u002Fbin\u002Fsh\n",[5853,8289,8290],{"class":7026,"line":15},[5853,8291,7045],{"emptyLinePlaceholder":5976},[5853,8293,8294,8296,8299,8302,8305,8309],{"class":7026,"line":56},[5853,8295,7144],{"class":7103},[5853,8297,8298],{"class":7059}," ~\u002Fbin\u002Fterminal",[5853,8300,8301],{"class":7073}," -e",[5853,8303,8304],{"class":7059}," \"",[5853,8306,8308],{"class":8307},"sdpu8","$@",[5853,8310,8311],{"class":7059},"\"\n",[5825,8313,8314],{},"And that in turn calls my per-machine terminal script, which contains roughly:",[6971,8316,8318],{"className":8277,"code":8317,"language":8279,"meta":45,"style":45},"#!\u002Fbin\u002Fsh\n\nif [ \"$HOSTNAME\" == \"arcanejill.thelackthereof.org\" ]; then\n  exec aterm -rv -tr -sl 10000 -sh 50 -ls +sb -vb -fn 6x12 -e \"$@\"\nelif [ \"$HOSTNAME\" == \"feline.thelackthereof.org\" ]; then\n  exec aterm -tr -sl 10000 -sh 50 -ls +sb -vb -fn '-b&h-lucidatypewriter-bold-r-normal-*-13-*-*-*-m-*-iso10646-1' -e \"$@\"\n\n# ... and so on for various machines I've had that I wanted different settings on\n\nelse\n  exec ~\u002F.cargo\u002Fbin\u002Falacritty \"$@\"\nfi\n",[6002,8319,8320,8324,8328,8355,8404,8426,8461,8465,8470,8474,8479,8493],{"__ignoreMap":45},[5853,8321,8322],{"class":7026,"line":9},[5853,8323,8287],{"class":8286},[5853,8325,8326],{"class":7026,"line":15},[5853,8327,7045],{"emptyLinePlaceholder":5976},[5853,8329,8330,8333,8336,8338,8341,8343,8346,8349,8352],{"class":7026,"line":56},[5853,8331,8332],{"class":7029},"if",[5853,8334,8335],{"class":7033}," [ ",[5853,8337,8228],{"class":7059},[5853,8339,8340],{"class":7033},"$HOSTNAME",[5853,8342,8228],{"class":7059},[5853,8344,8345],{"class":7029}," ==",[5853,8347,8348],{"class":7059}," \"arcanejill.thelackthereof.org\"",[5853,8350,8351],{"class":7033}," ]; ",[5853,8353,8354],{"class":7029},"then\n",[5853,8356,8357,8360,8363,8366,8369,8372,8375,8378,8381,8384,8387,8390,8393,8396,8398,8400,8402],{"class":7026,"line":5212},[5853,8358,8359],{"class":7103},"  exec",[5853,8361,8362],{"class":7059}," aterm",[5853,8364,8365],{"class":7073}," -rv",[5853,8367,8368],{"class":7073}," -tr",[5853,8370,8371],{"class":7073}," -sl",[5853,8373,8374],{"class":7073}," 10000",[5853,8376,8377],{"class":7073}," -sh",[5853,8379,8380],{"class":7073}," 50",[5853,8382,8383],{"class":7073}," -ls",[5853,8385,8386],{"class":7059}," +sb",[5853,8388,8389],{"class":7073}," -vb",[5853,8391,8392],{"class":7073}," -fn",[5853,8394,8395],{"class":7059}," 6x12",[5853,8397,8301],{"class":7073},[5853,8399,8304],{"class":7059},[5853,8401,8308],{"class":8307},[5853,8403,8311],{"class":7059},[5853,8405,8406,8409,8411,8413,8415,8417,8419,8422,8424],{"class":7026,"line":7077},[5853,8407,8408],{"class":7029},"elif",[5853,8410,8335],{"class":7033},[5853,8412,8228],{"class":7059},[5853,8414,8340],{"class":7033},[5853,8416,8228],{"class":7059},[5853,8418,8345],{"class":7029},[5853,8420,8421],{"class":7059}," \"feline.thelackthereof.org\"",[5853,8423,8351],{"class":7033},[5853,8425,8354],{"class":7029},[5853,8427,8428,8430,8432,8434,8436,8438,8440,8442,8444,8446,8448,8450,8453,8455,8457,8459],{"class":7026,"line":7083},[5853,8429,8359],{"class":7103},[5853,8431,8362],{"class":7059},[5853,8433,8368],{"class":7073},[5853,8435,8371],{"class":7073},[5853,8437,8374],{"class":7073},[5853,8439,8377],{"class":7073},[5853,8441,8380],{"class":7073},[5853,8443,8383],{"class":7073},[5853,8445,8386],{"class":7059},[5853,8447,8389],{"class":7073},[5853,8449,8392],{"class":7073},[5853,8451,8452],{"class":7059}," '-b&h-lucidatypewriter-bold-r-normal-*-13-*-*-*-m-*-iso10646-1'",[5853,8454,8301],{"class":7073},[5853,8456,8304],{"class":7059},[5853,8458,8308],{"class":8307},[5853,8460,8311],{"class":7059},[5853,8462,8463],{"class":7026,"line":7094},[5853,8464,7045],{"emptyLinePlaceholder":5976},[5853,8466,8467],{"class":7026,"line":7100},[5853,8468,8469],{"class":8286},"# ... and so on for various machines I've had that I wanted different settings on\n",[5853,8471,8472],{"class":7026,"line":7110},[5853,8473,7045],{"emptyLinePlaceholder":5976},[5853,8475,8476],{"class":7026,"line":7118},[5853,8477,8478],{"class":7029},"else\n",[5853,8480,8482,8484,8487,8489,8491],{"class":7026,"line":8481},11,[5853,8483,8359],{"class":7103},[5853,8485,8486],{"class":7059}," ~\u002F.cargo\u002Fbin\u002Falacritty",[5853,8488,8304],{"class":7059},[5853,8490,8308],{"class":8307},[5853,8492,8311],{"class":7059},[5853,8494,8496],{"class":7026,"line":8495},12,[5853,8497,8498],{"class":7029},"fi\n",[5825,8500,8501],{},"... and now when I click on the CSV from my downloads dropdown in firefox POP goes a terminal running VisiData!",[7147,8503,8504],{},"html pre.shiki code .s8-w5, html code.shiki .s8-w5{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html pre.shiki code .sTrkL, html code.shiki .sTrkL{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sdpu8, html code.shiki .sdpu8{--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}",{"title":45,"searchDepth":15,"depth":15,"links":8506},[8507,8508],{"id":8203,"depth":15,"text":4810},{"id":8243,"depth":15,"text":4815},{},{"title":4805,"description":4807},"TLT - 2025.01.31 - VisiData XDG",[5980],"63mA3PbiXGsXyIvI_bMy5hssF82WTQlHj5CR3towEZ0",{"id":8515,"title":4785,"body":8516,"createdAt":8662,"description":8520,"draft":5972,"extension":5973,"image":8651,"mastodonThread":5974,"meta":8663,"navigation":5976,"path":4784,"seo":8664,"stem":8665,"tags":8666,"updatedAt":8662,"__hash__":8667},"content\u002FTLT - 2025.01.19 - Nerd Snipes.md",{"type":5822,"value":8517,"toc":8658},[8518,8521,8524,8527,8530,8547,8581,8588,8591,8608,8622,8637,8643,8646,8652,8655],[5825,8519,8520],{},"What distracted me today? Flameshot and Rofi.",[5825,8522,8523],{},"--",[5825,8525,8526],{},"It's a weekend, and on the weekends I am retired. And it has long been my declaration that someday when I retire I will spend all day every day messing with dumb config files. SO!",[6071,8528,4790],{"id":8529},"screenshot-to-keyboard",[5825,8531,8532,8533,8538,8539,8542,8543,8546],{},"I have been using ",[5950,8534,8537],{"href":8535,"rel":8536},"https:\u002F\u002Fflameshot.org\u002F",[5954],"Flameshot"," for a while now, and it is great! But ... something something Wayland something something and in the end it doesn't copy the image to my clipboard. I have rotated through a few screenshot managers, so my ",[6002,8540,8541],{},"win+s"," keybinding actually runs ",[6002,8544,8545],{},"~\u002Fbin\u002Fscreenshot",". Today, I modified it to contain:",[6971,8548,8550],{"className":8277,"code":8549,"language":8279,"meta":45,"style":45},"QT_QPA_PLATFORM=wayland flameshot gui --raw | wl-copy -f\n",[6002,8551,8552],{"__ignoreMap":45},[5853,8553,8554,8557,8559,8562,8566,8569,8572,8575,8578],{"class":7026,"line":9},[5853,8555,8556],{"class":7033},"QT_QPA_PLATFORM",[5853,8558,7053],{"class":7029},[5853,8560,8561],{"class":7059},"wayland",[5853,8563,8565],{"class":8564},"srTi1"," flameshot",[5853,8567,8568],{"class":7059}," gui",[5853,8570,8571],{"class":7073}," --raw",[5853,8573,8574],{"class":7029}," |",[5853,8576,8577],{"class":8564}," wl-copy",[5853,8579,8580],{"class":7073}," -f\n",[5825,8582,8583,8584,8587],{},"And now I can take a screenshot and paste it wherever I want. I also have Flameshot configured to save ",[5834,8585,8586],{},"all"," of my screenshots to a directory. Someday I can ask some vision-LLM questions about these files :)",[6071,8589,4795],{"id":8590},"faster-and-prettier-runner",[5825,8592,8593,8594,8599,8600,8603,8604,8607],{},"I've been using ",[5950,8595,8598],{"href":8596,"rel":8597},"https:\u002F\u002Fgithub.com\u002Fdavatorium\u002Frofi",[5954],"Rofi"," as my run-dialog for a while. It is kinda slow to start though ... like a lag between when I press ",[6002,8601,8602],{},"win+shift+p"," and actually get the dialog. Looking at it ... I had previous set up the wrapper script to run zsh in interactive mode. Why? Because for some reason ",[6002,8605,8606],{},"$PATH"," wasn't getting set I think. But interactive-mode takes a sec to run. hmm.",[5825,8609,8610,8611,8613,8614,8617,8618,8621],{},"I thrashed all about trying to fix the ",[6002,8612,8606],{},". Rando ",[6002,8615,8616],{},"systemctrl"," things, editing ",[6002,8619,8620],{},"~\u002F.config\u002Fenvironment.d\u002F10-path.conf",", all sorts of things. No dice.",[5825,8623,8624,8625,8630,8631,8633,8634,8636],{},"Then I spent some time switching over to ",[5950,8626,8629],{"href":8627,"rel":8628},"https:\u002F\u002Fcodeberg.org\u002Fdnkl\u002Ffuzzel",[5954],"fuzzel"," which seems fast and cool. But ... same problems sorta. It was wanting to run .desktop entries instead of ",[6002,8632,8606],{}," entries, though you could get it to run ",[6002,8635,8606],{}," commands ... but then it didn't add them into the memory list ... etc.",[5825,8638,8639,8640,8642],{},"Finally I realized I could go back to Rofi and since I have this wrapper script just throw my ",[6002,8641,8606],{}," export in there! UGLY!!! But it works.",[5825,8644,8645],{},"Then I spent a while updating the theme for Rofi to take some inspiration from what I saw over in Fuzzel. Now it looks like this:",[5825,8647,8648],{},[6416,8649],{"alt":8650,"src":8651},"rofi theme","img\u002Frofi_theme.png",[5825,8653,8654],{},"Pretty snazzy!!!",[7147,8656,8657],{},"html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":45,"searchDepth":15,"depth":15,"links":8659},[8660,8661],{"id":8529,"depth":15,"text":4790},{"id":8590,"depth":15,"text":4795},"2025-01-19",{},{"title":4785,"description":8520},"TLT - 2025.01.19 - Nerd Snipes",[5980],"0n8JDwISa1ppezs4RQA7OLrNTQMj3lsK5c783g_idJc",{"id":8669,"title":4780,"body":8670,"createdAt":8765,"description":8674,"draft":5972,"extension":5973,"image":8691,"mastodonThread":5974,"meta":8766,"navigation":5976,"path":4779,"seo":8767,"stem":8768,"tags":8769,"updatedAt":8765,"__hash__":8770},"content\u002FTLT - 2025.01.11 - Little Dashes of LLMs.md",{"type":5822,"value":8671,"toc":8763},[8672,8675,8677,8686,8692,8695,8709,8730,8747,8753,8760],[5825,8673,8674],{},"A small data transform \u002F cleanup task using LLM labor.",[5829,8676],{},[5825,8678,8679,8680,8685],{},"My mom is now running a small business, ",[5950,8681,8684],{"href":8682,"rel":8683},"https:\u002F\u002F129aztss.com\u002F",[5954],"$129 Arizona Discount Traffic Survival School",", and I'm tinkering away at a website for her. The other day she gives me a google doc with venue addresses, asking if I can put it up on the site.",[5825,8687,8688],{},[6416,8689],{"alt":8690,"src":8691},"addresses in a google doc","img\u002Faddresses_in_a_google_doc.png",[5825,8693,8694],{},"While the doc was pretty consistent, it'd be even better as a nice little spreadsheet. In fact, if it is a Google Sheet then you can HTTP GET it as a CSV live! Then if she adds a venue to the sheet it will magically show up on her website.",[5825,8696,8697,8698,7881,8703,8708],{},"Alas. This is a Doc not a Sheet. But we live in the future! Grabbing my pre-set-up ",[5950,8699,8702],{"href":8700,"rel":8701},"https:\u002F\u002Fllm.datasette.io\u002Fen\u002Fstable\u002F",[5954],"llm",[5950,8704,8707],{"href":8705,"rel":8706},"https:\u002F\u002Fclaude.ai",[5954],"claude.ai",", I simpy do this:",[6971,8710,8712],{"className":8277,"code":8711,"language":8279,"meta":45,"style":45},"cat | llm -s 'turn this into a tsv with location, venue name, address, notes'\n",[6002,8713,8714],{"__ignoreMap":45},[5853,8715,8716,8719,8721,8724,8727],{"class":7026,"line":9},[5853,8717,8718],{"class":8564},"cat",[5853,8720,8574],{"class":7029},[5853,8722,8723],{"class":8564}," llm",[5853,8725,8726],{"class":7073}," -s",[5853,8728,8729],{"class":7059}," 'turn this into a tsv with location, venue name, address, notes'\n",[5825,8731,8732,8733,8736,8737,8740,8741,8743,8744,8746],{},"Then I ",[5834,8734,8735],{},"copy"," from the docs and ",[5834,8738,8739],{},"paste"," into my terminal, and out pops a tab-separated list! ",[5834,8742,8735],{}," from my terminal and ",[5834,8745,8739],{}," into a Google Sheet and PRESTO!",[5825,8748,8749],{},[6416,8750],{"alt":8751,"src":8752},"venue list in spreadsheet","img\u002Fvenue_list_in_spreadsheet.png",[5825,8754,8755,8756,8759],{},"Yes -- I could have piped it into ",[6002,8757,8758],{},"wl-copy"," instead of using my mouse to copy like a caveman. One can only go so far!",[7147,8761,8762],{},"html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":45,"searchDepth":15,"depth":15,"links":8764},[],"2025-01-11",{},{"title":4780,"description":8674},"TLT - 2025.01.11 - Little Dashes of LLMs",[5980],"uE0N0_kTmSySu7rBoxIhYf3Cxk0GRovUg2UupVDQdkI",{"id":8772,"title":4766,"body":8773,"createdAt":8893,"description":4768,"draft":5972,"extension":5973,"image":8799,"mastodonThread":5974,"meta":8894,"navigation":5976,"path":4765,"seo":8895,"stem":8896,"tags":8897,"updatedAt":8893,"__hash__":8899},"content\u002FTLT - 2024.12.12 - Little Boxes For Your Ghost.md",{"type":5822,"value":8774,"toc":8889},[8775,8781,8784,8794,8800,8807,8818,8821,8840,8859,8865,8868,8874,8877,8880,8886],[5825,8776,8777,8778,8780],{},"Drawing Xes in Boxes is harder than you might think! Teaching ",[5950,8779,1470],{"href":1469}," a bit about space by pre-segmenting the input image gets us closer.",[6071,8782,3003],{"id":8783},"the-problem",[5825,8785,8786,8787,8790,8791,8793],{},"You may recall from ",[5950,8788,8789],{"href":4745},"TLT - 2024.11.23 - A Ghostly Game"," that ",[5950,8792,1470],{"href":1469}," is ... not good with spatial awareness. For example, we can ask it to draw an X in a box and see how close it gets...",[5825,8795,8796],{},[6416,8797],{"alt":8798,"src":8799},"Ghostwriter X not in box","img\u002FGhostwriter_X_not_in_box.png",[5825,8801,8802,8803,8806],{},"Not great. That is even ",[5834,8804,8805],{},"after"," we tried the \"plz think harder\" approach, asking the LLM to write out where it thinks things are with bounding boxes and planning where things should go and all that. It still can't hit the box that it can see.",[5825,8808,8809,8810,8813,8814,8817],{},"It can ",[5834,8811,8812],{},"read handwriting",", it ",[5834,8815,8816],{},"knows there is a box more or less in the middle",". So close!",[6071,8819,4775],{"id":8820},"step-outside-the-box",[5996,8822,8823],{},[5825,8824,8825,8828,8829,8831,8834,8835,8837],{},[7247,8826,8827],{},"Vivian Jaffe:"," Have you ever transcended space and time?",[6297,8830],{},[7247,8832,8833],{},"Albert Markovski:"," No. Yes. Uh, time not space. No. I have no idea what you're talking about.",[6297,8836],{},[5834,8838,8839],{},"(I Heart Huckabees, 2004)",[5825,8841,8842,8843,8847,8848,7881,8853,8858],{},"So with a little help from my friend ",[5950,8844,8846],{"href":8122,"rel":8845},[5954],"Cody"," I whipped up a relatively dumb segmenter. It uses ",[5950,8849,8852],{"href":8850,"rel":8851},"https:\u002F\u002Fdocs.rs\u002Fimage\u002Flatest\u002Fimage\u002F",[5954],"image",[5950,8854,8857],{"href":8855,"rel":8856},"https:\u002F\u002Fdocs.rs\u002Fimageproc\u002Flatest\u002Fimageproc\u002F",[5954],"imageproc"," to find contours, snaps boxes around them, and then looks for the big ones. So in the case of our box, here is a bit of extra that we put into the prompt:",[6971,8860,8863],{"className":8861,"code":8862,"language":6976},[6974],"Here are interesting regions based on an automatic segmentation algorithm. Use\nthem to help identify the exact location of interesting features.\n\nRegion: x=400, y=572, width=640, height=613\nRegion: x=31, y=32, width=41, height=41\nRegion: x=811, y=96, width=133, height=127\nRegion: x=279, y=162, width=83, height=29\nRegion: x=178, y=128, width=69, height=86\nRegion: x=1014, y=138, width=43, height=47\nRegion: x=36, y=37, width=31, height=31\nRegion: x=979, y=96, width=42, height=85\nRegion: x=549, y=118, width=56, height=76\nRegion: x=439, y=149, width=53, height=56\n",[6002,8864,8862],{"__ignoreMap":45},[5825,8866,8867],{},"And now it gets much closer!",[5825,8869,8870],{},[6416,8871],{"alt":8872,"src":8873},"Ghostwriter X more in box","img\u002FGhostwriter_X_more_in_box.png",[5825,8875,8876],{},"This is a pretty coarse-grained way to give a sense of space, but it is working much better with this segmentation hint. There are a few other things that might work as well -- we could give it an image of what each of the segments has inside of it, we could merge segments with some center-of-gravity sort of thing. Etc.",[5825,8878,8879],{},"Let's try more boxes!",[5825,8881,8882],{},[6416,8883],{"alt":8884,"src":8885},"Ghostwriter x in boxes not great","img\u002FGhostwriter_x_in_boxes_not_great.png",[5825,8887,8888],{},"Whelp... still more work to do! :)",{"title":45,"searchDepth":15,"depth":15,"links":8890},[8891,8892],{"id":8783,"depth":15,"text":3003},{"id":8820,"depth":15,"text":4775},"2024-12-12",{},{"title":4766,"description":4768},"TLT - 2024.12.12 - Little Boxes For Your Ghost",[5980,8898],"ghostwriter","Tj1bLYbdvyOlxJ9NnaKymvJO7kJeJcv8F2lTSinNKGs",{"id":8901,"title":4746,"body":8902,"createdAt":9091,"description":4748,"draft":5972,"extension":5973,"image":9047,"mastodonThread":5974,"meta":9092,"navigation":5976,"path":4745,"seo":9093,"stem":8789,"tags":9094,"updatedAt":9091,"__hash__":9095},"content\u002FTLT - 2024.11.23 - A Ghostly Game.md",{"type":5822,"value":8903,"toc":9086},[8904,8910,8913,8919,8925,8935,8938,8941,9017,9020,9023,9026,9029,9039,9042,9048,9064,9070,9073,9076,9083],[5825,8905,8906,8907,8909],{},"Working on ",[5950,8908,1470],{"href":1469},", making some incremental progress on playing tic-tac-toe.",[6071,8911,4751],{"id":8912},"it-was-worse-before",[5825,8914,8915,8916,8918],{},"I've been trying to play tic-tac-toe with ",[5950,8917,1470],{"href":1469},", but it is quite bad. Reading the LLM transcript, it sees that we are playing, has a good idea of what it wants to do, but can't aim its output very well at all.",[5825,8920,8921],{},[6416,8922],{"alt":8923,"src":8924},"Ghostwriter tic tac toe off the board","img\u002FGhostwriter_tic_tac_toe_off_the_board.png",[5825,8926,8927,8928,8931,8932,8934],{},"Here you can see that Ghostwriter sees that it is ",[6002,8929,8930],{},"O"," and does indeed draw an ",[6002,8933,8930],{}," ... but kinda off the board. This is actually one of the better attempts. I even switched from OpenAI to Anthropic Claude to see if it'd get better with limited success. Doing some research, it turns out that generally VLMs (Vision LLMs) aren't great at this sort of thing.",[6071,8936,4756],{"id":8937},"whats-your-plan",[5825,8939,8940],{},"One thing that definitely has helped is including a request for bounding boxes in the prompt.",[6971,8942,8946],{"className":8943,"code":8944,"language":8945,"meta":45,"style":45},"language-json shiki shiki-themes github-light github-dark monokai","  \"input_description\": {\n      \"type\": \"string\",\n      \"description\": \"Description of what was detected in the input image. Include the exact pixel x, y, width, height bounding box coordinates of everything.\"\n  },\n  \"output_description\": {\n      \"type\": \"string\",\n      \"description\": \"Description of what will be drawn. Include the exact pixel x, y, width, height bounding box coordinates of what you want to draw.\"\n  },\n","json",[6002,8947,8948,8956,8972,8982,8987,8994,9004,9013],{"__ignoreMap":45},[5853,8949,8950,8953],{"class":7026,"line":9},[5853,8951,8952],{"class":7059},"  \"input_description\"",[5853,8954,8955],{"class":7033},": {\n",[5853,8957,8958,8962,8965,8969],{"class":7026,"line":15},[5853,8959,8961],{"class":8960},"s-m8C","      \"type\"",[5853,8963,8964],{"class":7033},": ",[5853,8966,8968],{"class":8967},"sCZoN","\"string\"",[5853,8970,8971],{"class":7033},",\n",[5853,8973,8974,8977,8979],{"class":7026,"line":56},[5853,8975,8976],{"class":8960},"      \"description\"",[5853,8978,8964],{"class":7033},[5853,8980,8981],{"class":8967},"\"Description of what was detected in the input image. Include the exact pixel x, y, width, height bounding box coordinates of everything.\"\n",[5853,8983,8984],{"class":7026,"line":5212},[5853,8985,8986],{"class":7033},"  },\n",[5853,8988,8989,8992],{"class":7026,"line":7077},[5853,8990,8991],{"class":7059},"  \"output_description\"",[5853,8993,8955],{"class":7033},[5853,8995,8996,8998,9000,9002],{"class":7026,"line":7083},[5853,8997,8961],{"class":8960},[5853,8999,8964],{"class":7033},[5853,9001,8968],{"class":8967},[5853,9003,8971],{"class":7033},[5853,9005,9006,9008,9010],{"class":7026,"line":7094},[5853,9007,8976],{"class":8960},[5853,9009,8964],{"class":7033},[5853,9011,9012],{"class":8967},"\"Description of what will be drawn. Include the exact pixel x, y, width, height bounding box coordinates of what you want to draw.\"\n",[5853,9014,9015],{"class":7026,"line":7100},[5853,9016,8986],{"class":7033},[5825,9018,9019],{},"Even with this instruction it still doesn't include much location information. From my most recent reading I probably need to give it some examples of what I'm looking for.",[5825,9021,9022],{},"I'm working on an evaluation framework which might allow fine-tuning the prompts in an incremental way. I'll record the initial screenshot and then run it through a few times to get results. Ultimately I hope to even try using a secondary VLM as a judge and perhaps another as a prompt tuner\u002Fgenerator. Maybe get a little Genetic Algorithm going? hmmm!",[5825,9024,9025],{},"So this helped for sure! But everything has still been pretty off.",[6071,9027,4761],{"id":9028},"how-big-is-the-screen",[5825,9030,9031,9032,9034,9035,9038],{},"In fact ... all of the ",[6002,9033,8930],{},"s seemed above the board, to the point where I started to re-read docs. What was happening is that the ",[7247,9036,9037],{},"Claude API was scaling the image down",", which both contradicted some of the system prompt and made it not know where the board was.",[5825,9040,9041],{},"So now I pre-resize to 768x1024 px. Seems a bit small, but the result is already better!",[5825,9043,9044],{},[6416,9045],{"alt":9046,"src":9047},"ghostwriter tic-tac-toe wrong move","img\u002Fghostwriter_tic-tac-toe_wrong_move.png",[5825,9049,9050,9051,9054,9055,9057,9058,9060,9061,9063],{},"Here you can see I started in the upper-left with ",[6002,9052,9053],{},"X",". Ghostwriter then went in the middle-right with an ",[6002,9056,8930],{},", and I moved in the upper-right with an ",[6002,9059,9053],{},". Finally (in red), Ghostwriter moved sort of on the line. What you don't see here, however, is that even the first ",[6002,9062,8930],{}," was wrong -- in the JSON transcript it was actually targeting the middle box.",[5825,9065,9066,9067],{},"But still -- ",[7247,9068,9069],{},"PROGRESS!",[5825,9071,9072],{},"I'm going to run some hand validation to make sure the input to the VLM is the right size and that I'm scaling the SVG to the screen correctly. After that I will likely go back to doing some pre-processing, adding in segmentation or something to make it easier for the VLM to locate things on the screen.",[5825,9074,9075],{},"Unfortunately if you look at a tic-tac-toe board ... it's kinda awkward. Each of the outside 8 cells are technically open, so it's hard to recognize that they are cells at all. The VLM by itself gets it at a high level, but I'm not sure how well it can break it down. But I'm also not sure what sort of segmentation algorithm would do better.",[5825,9077,9078,9079,9082],{},"Under all of that, from what I've seen on the internets these LLMs are not actually all that good at actually playing tic-tac-toe or other 2D spatial games (like Chess) in the first place. But that isn't really the problem so far -- the problem right now is that the VLM ",[5834,9080,9081],{},"wants"," to move in the center but can't figure out where the center is.",[7147,9084,9085],{},"html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .s-m8C, html code.shiki .s-m8C{--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sCZoN, html code.shiki .sCZoN{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#CFCFC2}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":45,"searchDepth":15,"depth":15,"links":9087},[9088,9089,9090],{"id":8912,"depth":15,"text":4751},{"id":8937,"depth":15,"text":4756},{"id":9028,"depth":15,"text":4761},"2024-11-23",{},{"title":4746,"description":4748},[5980],"AGghpU_o6OzfjUC-QNc8nqlNAT97rqCRsgZVuAgn09Y",{"id":9097,"title":1470,"body":9098,"createdAt":9125,"description":1472,"draft":5972,"extension":5973,"image":9107,"mastodonThread":5974,"meta":9126,"navigation":5976,"path":1469,"seo":9127,"stem":1470,"tags":9128,"updatedAt":9125,"__hash__":9129},"content\u002FGhostwriter.md",{"type":5822,"value":9099,"toc":9122},[9100,9102,9108,9111,9114],[5825,9101,1472],{},[5825,9103,9104],{},[6416,9105],{"alt":9106,"src":9107},"Ghostwriter simple Chihuahua","https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fghostwriter\u002Fraw\u002Fmain\u002Fdocs\u002Fsimple-chihuahua.jpg",[6071,9109,1475],{"id":9110},"the-idea",[5825,9112,9113],{},"This is an exploration of another way to interact with vision LLMs, effectively pen-and-paper.",[5825,9115,9116,9117,7203],{},"All of the up to date info and some notes are at ",[5950,9118,9121],{"href":9119,"rel":9120},"https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fghostwriter",[5954],"github.com\u002Fawwaiid\u002Fghostwriter",{"title":45,"searchDepth":15,"depth":15,"links":9123},[9124],{"id":9110,"depth":15,"text":1475},"2024-11-17T00:00:00.000Z",{},{"title":1470,"description":1472},[6510],"6L7dNR0nI3ISdnlTtA0Kti4xY-I1IcO2dM9ZZdRWBG0",{"id":9131,"title":5437,"body":9132,"createdAt":9636,"description":5439,"draft":5972,"extension":5973,"image":9141,"mastodonThread":5974,"meta":9637,"navigation":5976,"path":5436,"seo":9638,"stem":5437,"tags":9639,"updatedAt":9640,"__hash__":9641},"content\u002FVSCode Stripped Down.md",{"type":5822,"value":9133,"toc":9628},[9134,9136,9142,9145,9152,9159,9162,9165,9175,9182,9185,9189,9192,9195,9198,9201,9317,9320,9331,9338,9387,9394,9397,9400,9406,9409,9438,9444,9447,9450,9453,9466,9547,9550,9553,9556,9559,9580,9583,9586,9605,9608,9625],[5825,9135,5439],{},[5825,9137,9138],{},[6416,9139],{"alt":9140,"src":9141},"vscode tiny screenshot","img\u002Fvscode_tiny_screenshot.png",[6071,9143,5442],{"id":9144},"vscode",[5825,9146,9147,9148,9151],{},"I love (Neo) Vim! However ... I also like to try out new things and there are a lot of plugins that are only offered (or better supported) in VSCode, such as ",[5950,9149,8846],{"href":8122,"rel":9150},[5954],". Also there are some things that an editor with full GUI capabilities can do that aren't quite so easy from the terminal. On top of that, there are plenty of fans of VSCode that I work with on a daily basis and I'd like to speak their language. VSCode is a programmable editor, like Vim and Emacs and other greats, and a good choice for programming. Let's stretch our brain!",[5825,9153,9154,9155,9158],{},"So I fire up VSCode! And I am ",[5834,9156,9157],{},"immediately"," overwhelmed. Here is roughly what I see:",[6416,9160],{"src":9161,"width":7568,"alt":9144},"img\u002Fvscode-minimal-comparison-before.png",[5825,9163,9164],{},"There are all of these sidebars and tabs and header bars and other sidebars and all sorts of things! Everything is loud and I don't know what to look at. Also, obviously, the keyboard navigation is significantly different. I need to simplify. I want to strip this down to the bone. Then I can build it up again later.",[5825,9166,9167],{},[5950,9168,9172],{"href":9169,"rel":9170,"title":9171},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=qU8UfYdKHvs",[5954],"Depeche Mode - Stripped",[6416,9173],{"alt":9171,"src":9174},"https:\u002F\u002Fimg.youtube.com\u002Fvi\u002FqU8UfYdKHvs\u002F0.jpg",[5825,9176,9177,9178,9181],{},"OK ... so here's the plan. First I want to remove everything from the UI but the basics. A lot of the visual elements such as the tab bar can be replaced with keyboard navigation. Hence, second I'll mostly ",[5834,9179,9180],{},"learn"," the default keyboard shortcuts. Maybe I'll eventually pull in vim-mode or embedded-neovim, but people seem to use this editor without those things, so I can too.",[5825,9183,9184],{},"Results -- vim on the left, vscode on the right:",[6416,9186],{"src":9187,"width":7568,"alt":9188},"img\u002Fvscode-minimal-comparison-vim.png","vim",[6416,9190],{"src":9191,"width":7568,"alt":9144},"img\u002Fvscode-minimal-comparison-vscode.png",[6071,9193,5447],{"id":9194},"trim-it-down",[5825,9196,9197],{},"Let's turn off everything that we can. We don't need the sidebar, the sidebar icon bar, the top menu, the top tabs, the minimap, indention indicator, or the max-column indicator (ruler). The embedded terminal doesn't need tabs either (I'd rather it be split or can use the menu or other keys). Also while we're at it I'll turn on word-wrap. Here is what it looks like by default:",[5825,9199,9200],{},"I turned all of those things off using the settings editor GUI, but here is the resulting JSON:",[6971,9202,9204],{"className":8943,"code":9203,"language":8945,"meta":45,"style":45},"{\n    \"window.menuBarVisibility\": \"toggle\",\n    \"editor.guides.indentation\": false,\n    \"editor.overviewRulerBorder\": false,\n    \"workbench.activityBar.location\": \"hidden\",\n    \"workbench.editor.showTabs\": \"none\",\n    \"editor.wordWrap\": \"on\",\n    \"editor.rulers\": [],\n    \"editor.minimap.enabled\": false,\n    \"terminal.integrated.tabs.enabled\": false,\n}\n",[6002,9205,9206,9211,9223,9235,9246,9258,9270,9282,9290,9301,9312],{"__ignoreMap":45},[5853,9207,9208],{"class":7026,"line":9},[5853,9209,9210],{"class":7033},"{\n",[5853,9212,9213,9216,9218,9221],{"class":7026,"line":15},[5853,9214,9215],{"class":8960},"    \"window.menuBarVisibility\"",[5853,9217,8964],{"class":7033},[5853,9219,9220],{"class":8967},"\"toggle\"",[5853,9222,8971],{"class":7033},[5853,9224,9225,9228,9230,9233],{"class":7026,"line":56},[5853,9226,9227],{"class":8960},"    \"editor.guides.indentation\"",[5853,9229,8964],{"class":7033},[5853,9231,9232],{"class":7073},"false",[5853,9234,8971],{"class":7033},[5853,9236,9237,9240,9242,9244],{"class":7026,"line":5212},[5853,9238,9239],{"class":8960},"    \"editor.overviewRulerBorder\"",[5853,9241,8964],{"class":7033},[5853,9243,9232],{"class":7073},[5853,9245,8971],{"class":7033},[5853,9247,9248,9251,9253,9256],{"class":7026,"line":7077},[5853,9249,9250],{"class":8960},"    \"workbench.activityBar.location\"",[5853,9252,8964],{"class":7033},[5853,9254,9255],{"class":8967},"\"hidden\"",[5853,9257,8971],{"class":7033},[5853,9259,9260,9263,9265,9268],{"class":7026,"line":7083},[5853,9261,9262],{"class":8960},"    \"workbench.editor.showTabs\"",[5853,9264,8964],{"class":7033},[5853,9266,9267],{"class":8967},"\"none\"",[5853,9269,8971],{"class":7033},[5853,9271,9272,9275,9277,9280],{"class":7026,"line":7094},[5853,9273,9274],{"class":8960},"    \"editor.wordWrap\"",[5853,9276,8964],{"class":7033},[5853,9278,9279],{"class":8967},"\"on\"",[5853,9281,8971],{"class":7033},[5853,9283,9284,9287],{"class":7026,"line":7100},[5853,9285,9286],{"class":8960},"    \"editor.rulers\"",[5853,9288,9289],{"class":7033},": [],\n",[5853,9291,9292,9295,9297,9299],{"class":7026,"line":7110},[5853,9293,9294],{"class":8960},"    \"editor.minimap.enabled\"",[5853,9296,8964],{"class":7033},[5853,9298,9232],{"class":7073},[5853,9300,8971],{"class":7033},[5853,9302,9303,9306,9308,9310],{"class":7026,"line":7118},[5853,9304,9305],{"class":8960},"    \"terminal.integrated.tabs.enabled\"",[5853,9307,8964],{"class":7033},[5853,9309,9232],{"class":7073},[5853,9311,8971],{"class":7033},[5853,9313,9314],{"class":7026,"line":8481},[5853,9315,9316],{"class":7033},"}\n",[5825,9318,9319],{},"This is great, but I keep doing things that bring back the sidebar! Great while i'm using it, but when I'm done I want it to go away.",[5825,9321,9322,9323,9326,9327,9330],{},"Running ",[6002,9324,9325],{},"ctrl+shift+p"," gives us the super menu of all the things we can do. If you find a thing that has keybindings, you can press the keybinding next time. Good way to discover new shortcuts and new actions. I want to hide the sidebar and maximize the edit screen, and the command for that on the list is ",[6002,9328,9329],{},"Maximize Editor Group and Hide Sidebars",". Great! Jam that.",[5825,9332,9333,9334,9337],{},"Now we ",[5834,9335,9336],{},"want"," the sidebar for a bunch of things, like messing with the file-tree or extension lists or git stuff or bot chat. Once I've used the sidebar and I'm done, I want it to go away. So I've added this to my keybindings.json to make this even easier:",[6971,9339,9341],{"className":8943,"code":9340,"language":8945,"meta":45,"style":45},"{\n    \"key\": \"ctrl+k ctrl+k\",\n    \"command\": \"workbench.action.maximizeEditorHideSidebar\",\n    \"when\": \"auxiliaryBarVisible || sideBarVisible || editorPartMultipleEditorGroups && !editorPartMaximizedEditorGroup\",\n}\n",[6002,9342,9343,9347,9359,9371,9383],{"__ignoreMap":45},[5853,9344,9345],{"class":7026,"line":9},[5853,9346,9210],{"class":7033},[5853,9348,9349,9352,9354,9357],{"class":7026,"line":15},[5853,9350,9351],{"class":8960},"    \"key\"",[5853,9353,8964],{"class":7033},[5853,9355,9356],{"class":8967},"\"ctrl+k ctrl+k\"",[5853,9358,8971],{"class":7033},[5853,9360,9361,9364,9366,9369],{"class":7026,"line":56},[5853,9362,9363],{"class":8960},"    \"command\"",[5853,9365,8964],{"class":7033},[5853,9367,9368],{"class":8967},"\"workbench.action.maximizeEditorHideSidebar\"",[5853,9370,8971],{"class":7033},[5853,9372,9373,9376,9378,9381],{"class":7026,"line":5212},[5853,9374,9375],{"class":8960},"    \"when\"",[5853,9377,8964],{"class":7033},[5853,9379,9380],{"class":8967},"\"auxiliaryBarVisible || sideBarVisible || editorPartMultipleEditorGroups && !editorPartMaximizedEditorGroup\"",[5853,9382,8971],{"class":7033},[5853,9384,9385],{"class":7026,"line":7077},[5853,9386,9316],{"class":7033},[5825,9388,9389,9390,9393],{},"And now my fingers can hit ",[6002,9391,9392],{},"ctrl+k ctrl+k"," as often as they like to focus on the editor alone.",[6071,9395,5452],{"id":9396},"sidebar-terminals-and-navigation",[5825,9398,9399],{},"I've had the same general \"IDE\" layout for years -- the left full-height side of my screen for editing, the right side divvied into a stack of terminals. Here is a screenshot from 2003!",[5825,9401,9402],{},[6416,9403],{"alt":9404,"src":9405},"Screensot from 2003","img\u002FScreenshot_on_2003.10.17.jpg",[5825,9407,9408],{},"What I like about this is that I often bounce back and forth, running some cli tool or interactive build thing on the right, editing on the left. Maybe one of my terminals is running the service, the other for doing some interactive debugging. There are a lot of advantages to using the terminal that is embedded in vscode, so I'd like this to work there.",[5825,9410,9411,9412,7881,9415,9418,9419,9422,9423,9426,9427,9430,9431,7881,9434,9437],{},"Moving the terminals to the side is easy, you can click some button to do that. Great! But now ... getting in and out of them is annoying. In my window manager I generally have two ways to move between windows -- move the mouse or hit a keybinding. Hover-focus in vscode is not going to happen, but the keybinding will do. My window manager uses ",[6002,9413,9414],{},"Super+H",[6002,9416,9417],{},"Super+R"," (Super is aka the Windows key) to move focus left and right, but I don't want to use ",[6002,9420,9421],{},"Super"," inside of vscode (I still give it to the window manager). After some looking at what things would collide with, I'm going with ",[6002,9424,9425],{},"Ctrl+RightArrow"," to move from the editor to terminal, ",[6002,9428,9429],{},"Ctrl+LeftArrow"," to move back, and then ",[6002,9432,9433],{},"Ctrl+DownArrow",[6002,9435,9436],{},"Ctrl+UpArrow"," to move between stacked terminals.",[6971,9439,9442],{"className":9440,"code":9441,"language":6976},[6974],"{\n  \"key\": \"ctrl+right\",\n    \"command\": \"workbench.action.terminal.focus\",\n    \"when\": \"editorFocus\"\n},\n{\n  \"key\": \"ctrl+left\",\n  \"command\": \"workbench.action.focusActiveEditorGroup\",\n  \"when\": \"terminalFocus\"\n},\n{\n  \"key\": \"ctrl+down\",\n  \"command\": \"workbench.action.terminal.focusNextPane\",\n  \"when\": \"terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported\"\n},\n{\n  \"key\": \"ctrl+up\",\n  \"command\": \"workbench.action.terminal.focusPreviousPane\",\n  \"when\": \"terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported\"\n},\n",[6002,9443,9441],{"__ignoreMap":45},[6071,9445,5457],{"id":9446},"i-can-see-clearly-now",[5825,9448,9449],{},"One of the dumbest things .... the background is solid black. I have this silly wallpaper that I can see through all of my terminal windows, and I'm used to it being there. I looked into transparency for the background, and possibly because I live in Linux-land (Wayland\u002FSway) ... no workey. I tried a few different plugins and CSS overrides and so on.",[5825,9451,9452],{},"No worries! Fake it 'til you make it!",[5825,9454,9455,9456,9461,9462,9465],{},"Pulling a very old trick out of my hat, what we'll do is get the ",[5950,9457,9460],{"href":9458,"rel":9459},"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=shalldie.background",[5954],"Background (shalldie) extension",", and then set the background image in VSCode to an image that ",[5834,9463,9464],{},"happens"," to be the same as the desktop wallpaper. We used to do this all the time before we invented transparent terminals (which themselves for a long time did the trick for you).",[6971,9467,9469],{"className":8943,"code":9468,"language":8945,"meta":45,"style":45},"    \"background.fullscreen\": {\n      \"images\": [\"file:\u002F\u002F\u002Fhome\u002Fawwaiid\u002Ftlt\u002Fdocs\u002Fbg\u002Fwallpaper-41040-1920x1080.png\"],\n      \"opacity\": 0.75,\n      \"size\": \"1920px 1200px\",\n      \"position\": \"-14px -14px\", \u002F\u002F match window manager gaps and borders\n      \"interval\": 0\n    },\n",[6002,9470,9471,9478,9492,9504,9516,9532,9542],{"__ignoreMap":45},[5853,9472,9473,9476],{"class":7026,"line":9},[5853,9474,9475],{"class":7059},"    \"background.fullscreen\"",[5853,9477,8955],{"class":7033},[5853,9479,9480,9483,9486,9489],{"class":7026,"line":15},[5853,9481,9482],{"class":8960},"      \"images\"",[5853,9484,9485],{"class":7033},": [",[5853,9487,9488],{"class":8967},"\"file:\u002F\u002F\u002Fhome\u002Fawwaiid\u002Ftlt\u002Fdocs\u002Fbg\u002Fwallpaper-41040-1920x1080.png\"",[5853,9490,9491],{"class":7033},"],\n",[5853,9493,9494,9497,9499,9502],{"class":7026,"line":56},[5853,9495,9496],{"class":8960},"      \"opacity\"",[5853,9498,8964],{"class":7033},[5853,9500,9501],{"class":7073},"0.75",[5853,9503,8971],{"class":7033},[5853,9505,9506,9509,9511,9514],{"class":7026,"line":5212},[5853,9507,9508],{"class":8960},"      \"size\"",[5853,9510,8964],{"class":7033},[5853,9512,9513],{"class":8967},"\"1920px 1200px\"",[5853,9515,8971],{"class":7033},[5853,9517,9518,9521,9523,9526,9529],{"class":7026,"line":7077},[5853,9519,9520],{"class":8960},"      \"position\"",[5853,9522,8964],{"class":7033},[5853,9524,9525],{"class":8967},"\"-14px -14px\"",[5853,9527,9528],{"class":7033},", ",[5853,9530,9531],{"class":8286},"\u002F\u002F match window manager gaps and borders\n",[5853,9533,9534,9537,9539],{"class":7026,"line":7083},[5853,9535,9536],{"class":8960},"      \"interval\"",[5853,9538,8964],{"class":7033},[5853,9540,9541],{"class":7073},"0\n",[5853,9543,9544],{"class":7026,"line":7094},[5853,9545,9546],{"class":7033},"    },\n",[5825,9548,9549],{},"Here you can see that I positioned the background to be offset by 14 pixels. This corresponds to the 'gaps' that I've configured in my window manager. When you go fullscreen the background jumps a little, but that's fine. Also this works best when VSCode happens to be the first upper-left window on the screen, which it usually is for me. Good enough for me to stop messing with this for a while at least :)",[5825,9551,9552],{},"... that said, this still isn't right. It is actually making the whole UI a little transparent, which dulls the fonts. I haven't figured out how to set the background image without affecting the rest of the UI.",[6071,9554,5462],{"id":9555},"starting-from-the-terminal",[5825,9557,9558],{},"Getting close. But I keep finding myself in vim, often because it is invoked as a sub-command from many other tools (including the one I use to write bloggy posts). This is important to sort out when living in a unixy ecosystem. I finally worked out",[6971,9560,9562],{"className":8277,"code":9561,"language":8279,"meta":45,"style":45},"export EDITOR=\"code -nw\" # --new --wait\n",[6002,9563,9564],{"__ignoreMap":45},[5853,9565,9566,9569,9572,9574,9577],{"class":7026,"line":9},[5853,9567,9568],{"class":7029},"export",[5853,9570,9571],{"class":7033}," EDITOR",[5853,9573,7053],{"class":7029},[5853,9575,9576],{"class":7059},"\"code -nw\"",[5853,9578,9579],{"class":8286}," # --new --wait\n",[5825,9581,9582],{},"This of course doesn't open in the same terminal like vim does, instead popping up a window. But at least it is a new window (not re-using an existing one), and it waits for an exit before going forward.",[5825,9584,9585],{},"... but my fingers still type \"vim\" all the time! So, TEMPORARILY, I'm doing this to use vscode anyway:",[6971,9587,9589],{"className":8277,"code":9588,"language":8279,"meta":45,"style":45},"alias vim=\"code -nw\"\n",[6002,9590,9591],{"__ignoreMap":45},[5853,9592,9593,9597,9600,9602],{"class":7026,"line":9},[5853,9594,9596],{"class":9595},"sq6CD","alias",[5853,9598,9599],{"class":7033}," vim",[5853,9601,7053],{"class":7029},[5853,9603,9604],{"class":7059},"\"code -nw\"\n",[6071,9606,5467],{"id":9607},"things-that-i-wish-were-different",[6013,9609,9610,9613,9622],{},[6016,9611,9612],{},"Opening a new window instead of inline-terminal-editing is jarring, but I'm getting used to it",[6016,9614,9615,9616,9621],{},"When I do have multiple panes open I would love to pretend these are more or less windows like my in window manager. BUT ... ",[5950,9617,9620],{"href":9618,"rel":9619},"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode\u002Fissues\u002F93772",[5954],"there is no focus-follows-mouse","! I added some keybindings that help though.",[6016,9623,9624],{},"I'm still not convinced on the transparent background",[7147,9626,9627],{},"html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .s-m8C, html code.shiki .s-m8C{--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sCZoN, html code.shiki .sCZoN{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#CFCFC2}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .s8-w5, html code.shiki .s8-w5{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sq6CD, html code.shiki .sq6CD{--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}",{"title":45,"searchDepth":15,"depth":15,"links":9629},[9630,9631,9632,9633,9634,9635],{"id":9144,"depth":15,"text":5442},{"id":9194,"depth":15,"text":5447},{"id":9396,"depth":15,"text":5452},{"id":9446,"depth":15,"text":5457},{"id":9555,"depth":15,"text":5462},{"id":9607,"depth":15,"text":5467},"2024-09-22",{},{"title":5437,"description":5439},[],"2024-09-24","1rN8P6cJ5I89roam9mDIRO4BFp31Vkvpmm4_-oMOmNA",{"id":9643,"title":1812,"body":9644,"createdAt":9896,"description":1814,"draft":5972,"extension":5973,"image":9823,"mastodonThread":5974,"meta":9897,"navigation":5976,"path":1811,"seo":9898,"stem":1812,"tags":9899,"updatedAt":9900,"__hash__":9901},"content\u002FLLM Token Tree Visualization.md",{"type":5822,"value":9645,"toc":9890},[9646,9654,9657,9668,9675,9681,9703,9714,9717,9724,9736,9739,9785,9788,9794,9796,9799,9802,9805,9811,9818,9824,9835,9838,9841,9847,9854,9860,9863,9866,9872,9875,9878],[5825,9647,9648,9649,8003],{},"Each token is one choice from many forking paths. Let's see some of the other possibilities. Also try the ",[5950,9650,9653],{"href":9651,"rel":9652},"https:\u002F\u002Fthelackthereof.org\u002Ftoken-tree\u002F",[5954],"Live LLM Token Tree Visualization Tool",[6071,9655,1817],{"id":9656},"the-next-token-machine",[5825,9658,9659,9660,9663,9664,9667],{},"Mostly we talk about LLMs (Large Language Models) as generating one ",[7247,9661,9662],{},"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 ",[5834,9665,9666],{},"all of the possible tokens"," and assign each a weight (a probability).",[5825,9669,9670,9671,9674],{},"So if you have ",[6002,9672,9673],{},"\"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.",[5825,9676,9677],{},[6416,9678],{"alt":9679,"src":9680},"Token Tree - Linear","img\u002FToken_Tree_-_Linear.png",[5825,9682,9683,9684,9687,9688,9691,9692,9695,9696,9698,9699,9702],{},"Here you can see a list of tokens of what could come after our prompt. First is ",[6002,9685,9686],{},"Wh",". Once a token is generated it is pretty locked in, so the next ",[6002,9689,9690],{},"isk"," and then ",[6002,9693,9694],{},"ers"," aren't too surprising. The first ",[6002,9697,9686],{}," could have been ",[6002,9700,9701],{},"z"," ... but that sort of nonsense token is ranked very low.",[5825,9704,9705,9706,9709,9710,9713],{},"But each ",[7247,9707,9708],{},"step"," of the selection doesn't look like this. Instead, at each step the overall execution is ",[5834,9711,9712],{},"sampling"," one of the possible next-tokens.",[6071,9715,1822],{"id":9716},"token-vocabulary",[5825,9718,9719,9720,9723],{},"People talk about the \"length\" of a token -- that it is one word or one syllable and so on. But ... how many tokens ",[5834,9721,9722],{},"are"," there?",[5825,9725,9726,9727,9732,9733,9735],{},"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 ",[5950,9728,9731],{"href":9729,"rel":9730},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FASCII",[5954],"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 ",[6002,9734,9662],{}," territory.",[5825,9737,9738],{},"Let's look at some example Tokens from GPT-4o:",[6013,9740,9741,9747,9753,9759,9771,9776],{},[6016,9742,9743,9746],{},[6002,9744,9745],{},"A"," = 32",[6016,9748,9749,9752],{},[6002,9750,9751],{},"B"," = 33",[6016,9754,9755,9758],{},[6002,9756,9757],{},"C"," = 34",[6016,9760,9761,9763,9764,9767,9768],{},[6002,9762,9686],{}," = 2073; Yes this is a capital-",[6002,9765,9766],{},"W"," and lower-case-",[6002,9769,9770],{},"h",[6016,9772,9773,9775],{},[6002,9774,9690],{}," = 3295; Yes this is three letters",[6016,9777,9778,9781,9782],{},[6002,9779,9780],{},"⎵cozy"," = 45980; That is a space followed by ",[6002,9783,9784],{},"cozy",[5825,9786,9787],{},"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:",[5825,9789,9790],{},[6416,9791],{"alt":9792,"src":9793},"Token Tree - with token ids","img\u002FToken_Tree_-_with_token_ids.png",[6071,9795,1827],{"id":9712},[5825,9797,9798],{},"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.",[5825,9800,9801],{},"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.",[5825,9803,9804],{},"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.",[5825,9806,9807],{},[6416,9808],{"alt":9809,"src":9810},"Token Tree - Simple","img\u002FToken_Tree_-_Simple.png",[5825,9812,9813,9814,9817],{},"To make this a bit more visible, here we can see the tree with ",[5834,9815,9816],{},"counts"," for how many times a particular path was taken.",[5825,9819,9820],{},[6416,9821],{"alt":9822,"src":9823},"Token Tree - Simple With Counts","img\u002FToken_Tree_-_Simple_With_Counts.png",[5825,9825,9826,9827,9830,9831,9834],{},"We can already learn a lot! For one thing, ",[6002,9828,9829],{},"Whiskers"," appears to be a very common name for our kitten. Though after the name, the story goes on to either have a comma (",[6002,9832,9833],{},",","), or maybe NOT have a comma, and talk about where Whiskers lived.",[6071,9836,1832],{"id":9837},"kittens",[5825,9839,9840],{},"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).",[5825,9842,9843],{},[6416,9844],{"alt":9845,"src":9846},"Token Tree - GPT-4o kitten","img\u002FToken_Tree_-_GPT-4o_kitten.png",[5825,9848,9849,9850,5733],{},"OK ... now let's try ",[5950,9851,9853],{"href":8705,"rel":9852},[5954],"Claude (from Anthropic)",[5825,9855,9856],{},[6416,9857],{"alt":9858,"src":9859},"Token Tree - Claude kitten","img\u002FToken_Tree_-_Claude_kitten.png",[5825,9861,9862],{},"Yep. Kittens are named \"Whiskers\".",[5825,9864,9865],{},"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.",[5825,9867,9868],{},[6416,9869],{"alt":9870,"src":9871},"Token Tree - Luna Too","img\u002FToken_Tree_-_Luna_Too.png",[5825,9873,9874],{},"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!",[5825,9876,9877],{},"Therefore all kittens in stories are named Whiskers, or maaaayybbeee Luna. Facts.",[5825,9879,9880,9881,9885,9886,7203],{},"In conclusion, play around with this ",[5950,9882,9884],{"href":9651,"rel":9883},[5954],"LLM Token Tree Visualization Tool"," to form some new intuitions. You can get the source code over at ",[5950,9887,9888],{"href":9888,"rel":9889},"https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Ftoken-tree",[5954],{"title":45,"searchDepth":15,"depth":15,"links":9891},[9892,9893,9894,9895],{"id":9656,"depth":15,"text":1817},{"id":9716,"depth":15,"text":1822},{"id":9712,"depth":15,"text":1827},{"id":9837,"depth":15,"text":1832},"2024-09-08",{},{"title":1812,"description":1814},[6510],"2024-09-14","V0l1PWXe2iACmhHm0ckD6zDggBL9AEQPCOxBqf9zIW8",{"id":9903,"title":2391,"body":9904,"createdAt":9974,"description":9975,"draft":5972,"extension":5973,"image":9976,"mastodonThread":5974,"meta":9977,"navigation":5976,"path":2390,"seo":9978,"stem":2379,"tags":9979,"updatedAt":9900,"__hash__":9980},"content\u002FOGPF Layout.md",{"type":5822,"value":9905,"toc":9970},[9906,9912,9915,9917,9923,9926,9929,9932,9946,9949,9952,9958,9961,9967],[5825,9907,9908,9909,9911],{},"Documenting the data architecture for ",[5950,9910,2356],{"href":2355}," (OCaml Genetic Programming Framework).",[6416,9913],{"src":9914},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FVO_D2i8m48JlVOeXT_41f5u4FGa5lHKFQRCqWR0RaYrOn7SNhHV1zZOC7_FZmf1jyXZmg00MHsYBjudgJkwtNGMO2qNgDGZZJEh56MpsCCUWJANWIaND2dSY5fqIRHl_LMjq8scCzcCVXDK6fZppFtrBoMYBJl6zFJhq4YNNNHnf_l4tUtdZymK0",[5829,9916],{},[5825,9918,9919,9920,9922],{},"I've attempted to modularize the various aspects of ",[5950,9921,2356],{"href":2355}," so that each piece is independent for the others. This is unfortunately not completely possible, due to the interdependent nature of the very problem. To the left is a dependency chart. Its not as bad as it looks, however. All of the black dependency arrows indicate dependence on simple types and functions which won't change much from one setup to another. It is only the big blue line which will take some work.",[5825,9924,9925],{},"There is a certain balance to be had here. An ideal situation would have your genotype and fitness test be completely separate. Yet you must also use the fitness test to probe individual genomes and discover how good they are at solving the problem at hand. If nothing else the fitness test must know the capabilities of the genotype, such as its ability to deal with various types of data (is this genotype able to work with strings? Can it return a string? etc).",[5825,9927,9928],{},"How much you have to coordinate the workings of the genotype and fitness test depend a lot on what sort of problem you're solving. If the fitness test itself is important, but you have a genotype you always use, then not much change is necessary. For myself, the genotype basically '''is''' the experiment, so I tend to alter both constantly.",[6071,9930,2396],{"id":9931},"component-definitions",[6013,9933,9934,9937,9940,9943],{},[6016,9935,9936],{},"Genotype - specifies and manipulates a single genome",[6016,9938,9939],{},"Fitness Test - Tests a genome for fitness. In GP this means evaluating the genome, which means you have to know a lot about the genome. Thus the Fitness Test is tied closely to the Genotype and might share some code.",[6016,9941,9942],{},"Population Container - Holds a bunch of genomes and allows insertion and removal. Not a very intelligent module. May in the future keep genealogical data (but never understanding the meaning of the data)",[6016,9944,9945],{},"Selection Method - Embodies the workflow of pulling things out of the population, testing, eliminating, manipulating, and putting back.  Uses the other three modules to get this done.",[6071,9947,2401],{"id":9948},"genotype",[5825,9950,9951],{},"Genotypes define and manipulate individual genomes. Here is the basic signature which a genotype must implement:",[6971,9953,9956],{"className":9954,"code":9955,"language":6976},[6974],"module type Sig = sig\n  type t\n  val combine: t -> t -> t\n  val randInstance: int -> t\n  val print: t -> unit\n  val to_string: t -> string\n  val of_string: string -> t\nend\n",[6002,9957,9955],{"__ignoreMap":45},[5825,9959,9960],{},"Here is an additional signature that I have some things require (FGenotype):",[6971,9962,9965],{"className":9963,"code":9964,"language":6976},[6974],"module type Sig = sig\n  type t\n  val print: t -> unit\n  val to_string: t -> string\n  val eval: float -> t -> float\nend\n",[6002,9966,9964],{"__ignoreMap":45},[5825,9968,9969],{},"One debate I'm currently having with myself is whether Genotypes should be responsible for evaluating themselves. On the one hand self-evaluation makes the genotype more modular, keeping the fitness test from having this job. On the flip side the fitness test must then know how to communicate the problem setup to the genotype.",{"title":45,"searchDepth":15,"depth":15,"links":9971},[9972,9973],{"id":9931,"depth":15,"text":2396},{"id":9948,"depth":15,"text":2401},"2004-05-26T15:23-04:00","Documenting the data architecture for OGPF (OCaml Genetic Programming Framework).","https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fsvg\u002FVO_D2i8m48JlVOeXT_41f5u4FGa5lHKFQRCqWR0RaYrOn7SNhHV1zZOC7_FZmf1jyXZmg00MHsYBjudgJkwtNGMO2qNgDGZZJEh56MpsCCUWJANWIaND2dSY5fqIRHl_LMjq8scCzcCVXDK6fZppFtrBoMYBJl6zFJhq4YNNNHnf_l4tUtdZymK0",{},{"title":2391,"description":9975},[],"gKKFF-eByca7RMWbO0HDOfuyaJta7CMEuSGaGpElZPs",{"id":9982,"title":1572,"body":9983,"createdAt":10026,"description":9987,"draft":5972,"extension":5973,"image":9993,"mastodonThread":5974,"meta":10027,"navigation":5976,"path":1571,"seo":10028,"stem":1572,"tags":10029,"updatedAt":10026,"__hash__":10030},"content\u002FHuman Essentials.md",{"type":5822,"value":9984,"toc":10024},[9985,9988,9994,10003,10012,10021],[5825,9986,9987],{},"Part of the Ruby For Good organization; inventory control for diaper and period-supply banks.",[5825,9989,9990],{},[6416,9991],{"alt":9992,"src":9993},"human essentials admin","img\u002Fhuman_essentials_admin.png",[5825,9995,9996,9997,10002],{},"See the ",[5950,9998,10001],{"href":9999,"rel":10000},"https:\u002F\u002Fgithub.com\u002Frubyforgood\u002Fhuman_essentials",[5954],"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).",[5825,10004,10005,10006,10011],{},"I got turned onto the ",[5950,10007,10010],{"href":10008,"rel":10009},"https:\u002F\u002Frubyforgood.org\u002F",[5954],"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!\"",[5825,10013,10014,10015,10020],{},"Every week on Sunday morning (\"",[5950,10016,10019],{"href":10017,"rel":10018},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=bhSB8EEnCAM",[5954],"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.",[5825,10022,10023],{},"Join Us!",{"title":45,"searchDepth":15,"depth":15,"links":10025},[],"2024-09-07",{},{"title":1572,"description":9987},[6510],"f_3xhH1PyU3xo7MEYK16pCa1S4wgQP65Q1ibu6ZGAKQ",{"id":10032,"title":1082,"body":10033,"createdAt":10202,"description":10037,"draft":5972,"extension":5973,"image":10203,"mastodonThread":5974,"meta":10204,"navigation":5976,"path":1081,"seo":10205,"stem":1082,"tags":10206,"updatedAt":10026,"__hash__":10207},"content\u002FDeclarative Diagrams.md",{"type":5822,"value":10034,"toc":10197},[10035,10038,10041,10048,10051,10054,10060,10063,10066,10072,10075,10096,10102,10105,10116,10122,10125,10128,10131,10137,10140,10143,10149,10152,10155,10158,10164,10194],[5825,10036,10037],{},"I love diagrams! I love code! Mashing them together is delightful :)",[5825,10039,10040],{},"The idea here is to write some markup, like we do with HTML, and just like with HTML\u002FCSS we let the computer do the heavy lifting to decide what pixels go where. I long ago fell in love with GraphViz. More recently I've expanded that love to PlantUML! Let's take a look.",[5825,10042,10043],{},[5950,10044,10047],{"href":10045,"rel":10046},"https:\u002F\u002Fgithub.com\u002Fshubhamgrg04\u002Fawesome-diagramming",[5954],"List of Awesome Diagramming tools",[6071,10049,1087],{"id":10050},"graphviz-via-plantuml",[5825,10052,10053],{},"We'll start off with some simple GraphViz. This is basically a set of nodes and edges plus a bunch of hints about how we want it arranged. So we can be simple:",[6971,10055,10058],{"className":10056,"code":10057,"language":6976},[6974],"digraph G {\n  a -> b -> c\n}\n",[6002,10059,10057],{"__ignoreMap":45},[6416,10061],{"src":10062},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FIybCBqeio51mLwZcKb18LD2rKqW24SbSjG00",[5825,10064,10065],{},"And then we can make it a bit more complex:",[6971,10067,10070],{"className":10068,"code":10069,"language":6976},[6974],"digraph G {\n\n  \u002F***** Standard preamble I copy\u002Fpaste all the time *****\u002F\n\n  rankdir=LR \u002F\u002F Left-to-right\n  compound=true \u002F\u002F Allow edges between clusters, we're not using this yet\n\n  node [\n    shape=rect\n    style=\"filled,rounded\"\n    fillcolor=gold\n  ]\n\n  \u002F***** Now the nodes and edges *****\u002F\n\n  a\n  -> b\n  -> c\n\n  b -> d [ label=\"alt\" ]\n}\n",[6002,10071,10069],{"__ignoreMap":45},[6416,10073],{"src":10074},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FJKz1QiGm3Bpx5KCkXR8XBt2Xfr9OUcYFonuSMvkOAhQH5K8e_Njnjj3g8ccaqMX2dCIL6I_uCWOO7blWGrqAJWAAa5j69hp2vx8FnLKbE6ReJD2u40x6qCZYqcU8Oi_l60QSwQQzvbxYDAi1V5vANbEmAYkrXMVcl872H1KZwKQKu7cjIb9FsEX122ahrXhJ19rZnKxQX58EX8i1W3gxGbR8wxtLdSbsjyXCuIHDZq9tZ1hcCsUnK-PWWEi_mszvEnoronKkXT-__imv0_HF6E_9DsXiLS05x4PYspdM3bVp_GC0",[5825,10076,10077,10078,10081,10082,10085,10086,7881,10088,10090,10091,10093,10094,7203],{},"Now lets say we want that ",[6002,10079,10080],{},"d"," to be directly below the ",[6002,10083,10084],{},"b"," node. This is where there is some trickstyness involved. Generally when you are using a declarative system you are giving up control over some of these nitty gritty details. Still ... there are hints that we can give. In this case what we'll do is to say that the edge between ",[6002,10087,10084],{},[6002,10089,10080],{}," is not a \"constraint\", which means that they layout won't make ",[6002,10092,10080],{}," a \"child\" (separate rank) of ",[6002,10095,10084],{},[6971,10097,10100],{"className":10098,"code":10099,"language":6976},[6974],"digraph G {\n\n  \u002F***** Standard preamble I copy\u002Fpaste all the time *****\u002F\n\n  rankdir=LR \u002F\u002F Left-to-right\n  compound=true \u002F\u002F Allow edges between clusters, we're not using this yet\n\n  node [\n    shape=rect\n    style=\"filled,rounded\"\n    fillcolor=gold\n  ]\n\n  \u002F***** Now the nodes and edges *****\u002F\n\n  a\n  -> b\n  -> c\n\n  b -> d [ label=\"alt\" constraint=false ]\n}\n",[6002,10101,10099],{"__ignoreMap":45},[6416,10103],{"src":10104},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FJKz1QiGm3Bpx5KCkXR9BNk12JwMmzD0UbpqejfAOAdQG5S9I-lVYtKAhYwIHHgE9QL9QPxpWopcWVso13wCSIIDMPLe6ORmYbFNQhrIDGIAmcM5fOTmOVIChvS-Or9_UqVSuyMX7AqTDqsmE26LPovQZDzsuBJoBb1qS9wuOs7RcZ21RDTPwmCuFoiZ5iDMK9zYSAgviJIYNo3Wx0AWphUoLWzrRkmhxRamY70_Qz3Xsjr73Gf6YVYeI7N3vP_Yjx3T7xN85vVZxrvyvSi3n2SCzXGODhOeuGsXWyHs9TGWbLrDAsVn8KXaNz_q3",[5825,10106,10107,10108,10110,10111,7881,10113,10115],{},"This is not quite what we want though, since now ",[6002,10109,10080],{}," is basically a top-level node. What we can do instead is put ",[6002,10112,10084],{},[6002,10114,10080],{}," into a group together and declare that all the members of that group have the same \"rank\".",[6971,10117,10120],{"className":10118,"code":10119,"language":6976},[6974],"digraph G {\n\n  \u002F***** Standard preamble I copy\u002Fpaste all the time *****\u002F\n\n  rankdir=LR \u002F\u002F Left-to-right\n  compound=true \u002F\u002F Allow edges between clusters, we're not using this yet\n\n  node [\n    shape=rect\n    style=\"filled,rounded\"\n    fillcolor=gold\n  ]\n\n  \u002F***** Now the nodes and edges *****\u002F\n\n  a\n  -> b\n  -> c\n\n  {\n    rank=same\n    b -> d [ label=\"alt\" ]\n  }\n}\n",[6002,10121,10119],{"__ignoreMap":45},[6416,10123],{"src":10124},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FJOzDQiCm48NtEiN3cq99y0bKwAeKGXVjCcGnbYQsw5WIqXXZGkvUv1JQsGpptlnzFeo5yeGtt8m1-kSM-5AAdef7Bapp88ntk9ItFbDL1eb09uQ6cR5Fz6suKFpseTZJ9_eU9xxgKTEnX75I0xWqvxH4RxKit1fUHT8AzYDN3AmhSuIJfIgNUi3AJuKHasAf8OxGALHihErGJ9vnDW1G9yfi2pjzbBe9s-uQHDWVIhl7ljkjfhaagTWnYJV0vH_mHrftehQvWgB__UiFZWnmVC7mIAv9jtrlexQLPjwheRaUPmWDBBOZqGuN0zpD_GS0",[6071,10126,1092],{"id":10127},"plantuml",[5825,10129,10130],{},"PlantUML is a funny sort of super-language. For the most part it looks at the content of your markup and guesses what sort of diagram you want. It can do this since the syntax of each diagram is different enough to be distinguishable. Starting with my favorite, a sequence diagram, this is the exact and complete code:",[6971,10132,10135],{"className":10133,"code":10134,"language":6976},[6974],"browser -> server : Request page\nserver -> database : Query for matching post\ndatabase -> server : Search results\nserver -> browser : Rendered page\n",[6002,10136,10134],{"__ignoreMap":45},[6416,10138],{"src":10139},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FJSt13O9058JXErLC0pJ0WHxK2jwo8vW0Y_FUQkpUI8ZXEfdyNr9vEuMsXrCl2XskV5PwOBEHpR6sFRA59NEYmwLI7zoBi5WCqsCTiHMFvdyvvsuq3HD4htFuAPWE-oUkcMBUoIy0",[5825,10141,10142],{},"Now we can compare that to this activity diagram. Each part of this code corresponds to a part of the diagram, and it should be very readable even without reading the documentation.",[6971,10144,10147],{"className":10145,"code":10146,"language":6976},[6974],"start\n\nif (Sunny outside?) then (yes)\n  :Go for a walk;\nelse (no)\n  :Stay inside;\nendif\n:Eat ice cream;\n\nstop\n",[6002,10148,10146],{"__ignoreMap":45},[6416,10150],{"src":10151},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002F7Sl13OCm30NGkwVunx02EVHKCG0JME08gs1NiL6LxQls_FGYkIUHDfJrDXlmEqDtUKp8GmnbI4m4p8kZUGVZm-UhafmXAEP_MvC7r7wlajYkZUOd9tGJR5tugaIH_lu2",[6071,10153,1097],{"id":10154},"mermaid",[5825,10156,10157],{},"I don't like it as much as PlantUML when it comes to the syntax, but Mermaid is increasingly popular and available. Specifically, you can put Mermaid directly in markdown and github will render it!",[6971,10159,10162],{"className":10160,"code":10161,"language":6976},[6974],"graph TD;\n    A-->B;\n    A-->C;\n    B-->D;\n    C-->D;\n",[6002,10163,10161],{"__ignoreMap":45},[6971,10165,10167],{"className":10166,"code":10161,"language":10154,"meta":45,"style":45},"language-mermaid shiki shiki-themes github-light github-dark monokai",[6002,10168,10169,10174,10179,10184,10189],{"__ignoreMap":45},[5853,10170,10171],{"class":7026,"line":9},[5853,10172,10173],{},"graph TD;\n",[5853,10175,10176],{"class":7026,"line":15},[5853,10177,10178],{},"    A-->B;\n",[5853,10180,10181],{"class":7026,"line":56},[5853,10182,10183],{},"    A-->C;\n",[5853,10185,10186],{"class":7026,"line":5212},[5853,10187,10188],{},"    B-->D;\n",[5853,10190,10191],{"class":7026,"line":7077},[5853,10192,10193],{},"    C-->D;\n",[7147,10195,10196],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":45,"searchDepth":15,"depth":15,"links":10198},[10199,10200,10201],{"id":10050,"depth":15,"text":1087},{"id":10127,"depth":15,"text":1092},{"id":10154,"depth":15,"text":1097},"2022-10-01","https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FIybCBqeio51mLwZcAahCoqx9BBBr2UBAoqz9LOZcAiv8B4YrJSglu8hbKb18LD2rKqW24SbSjG00.png",{},{"title":1082,"description":10037},[],"3H0mEfFLpJ-5PF8ld5FQPp8t5fijMauRHDdLtiA-RkQ",{"id":10209,"title":2934,"body":10210,"createdAt":10218,"description":45,"draft":5972,"extension":5973,"image":9405,"mastodonThread":5974,"meta":10219,"navigation":5976,"path":2933,"seo":10220,"stem":2934,"tags":10221,"updatedAt":10026,"__hash__":10222},"content\u002FScreenshot on 2003.10.17.md",{"type":5822,"value":10211,"toc":10216},[10212],[5825,10213,10214],{},[6416,10215],{"alt":45,"src":9405},{"title":45,"searchDepth":15,"depth":15,"links":10217},[],"2003-10-17",{},{"title":2934,"description":45},[],"QEke6jWMlwAA6lrjJfUfcPBQByOdO-bZ4tzwQLjiOew",{"id":10224,"title":33,"body":10225,"createdAt":10250,"description":10251,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":10252,"navigation":5976,"path":32,"seo":10253,"stem":33,"tags":10254,"updatedAt":10255,"__hash__":10256},"content\u002FAbout.md",{"type":5822,"value":10226,"toc":10248},[10227,10237,10239,10242,10245],[5825,10228,10229,10230,10232,10233,10236],{},"This is the website and wiki of me, Brock Wilcox a.k.a. ",[5950,10231,5767],{"href":5766},". Please see the ",[5950,10234,4624],{"href":10235},"\u002Fhome"," page if you would like a less philosophical introduction to this site. Otherwise, read on!",[5829,10238],{},[5825,10240,10241],{},"I love living in the future -- we have so many neat things. One of my favorites is the internet. For me the internet is a powerful communication tool, and this website is one of the ways I utilize the internet to communicate. By placing my thoughts, papers, and projects on this site for the world to view I hope to communicate a little about myself to whomever is interested in knowing me.",[5825,10243,10244],{},"Two-way communication is very important. One reason I do not like television is its one-way-ness. Part of this certainly comes down to choice. Even with a thousand channels I still am limited to what they happen to be playing at the moment (for the most part). I can't imagine going to a library and being told that there are 1000 books to choose from and that I must read them right then and that they may not be there again if I were to return. Choice of what communications I receive is not the only issue with simplex (one-way) channels, however. I also want to have a voice of my own, even if it is only one among many.",[6971,10246,10247],{},"    Without a voice\n        we cannot be heard\n    Without being heard\n        our will cannot be known\n    Without our will being known\n        we cannot attain well-being\n\n    Find your voice!\n    Sing out your will!\n    One step on the path\n",{"title":45,"searchDepth":15,"depth":15,"links":10249},[],"2004-12-12T02:32-05:00","This is the website and wiki of me, Brock Wilcox a.k.a. awwaiid. Please see the Home page if you would like a less philosophical introduction to this site. Otherwise, read on!",{},{"title":33,"description":10251},[],"2024-08-31","HpGdWLlzAJiDQJMjLGzVkMQS24KasmaF3eFhNT6F1BY",{"id":10258,"title":5797,"body":10259,"createdAt":10288,"description":5799,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":10289,"navigation":5976,"path":5796,"seo":10290,"stem":10264,"tags":10291,"updatedAt":10293,"__hash__":10294},"content\u002Fshares.md",{"type":5822,"value":10260,"toc":10286},[10261,10265,10278,10281,10284],[10262,10263,5797],"h1",{"id":10264},"shares",[5825,10266,10267,10268,10273,10274,7203],{},"I use Feedly to subscribe to a bunch of websites and blogs and such. When I see something that is interesting I tag it and bag it. Here is the ",[5950,10269,10272],{"href":10270,"rel":10271},"https:\u002F\u002Fthelackthereof.org\u002Fshares.rss.xml",[5954],"raw shares.rss.xml",". I also share thoughts or commentary on ",[5950,10275,10277],{"href":10276},"\u002Ftag\u002Fshare","the 'share' tag",[10279,10280],"shares-feed",{},[10262,10282,5805],{"id":10283},"tech-note",[5825,10285,5807],{},{"title":45,"searchDepth":15,"depth":15,"links":10287},[],"2024-07-06",{},{"title":5797,"description":5799},[10292,8193],"meta","2024-08-03","OyzfaeIXQyROqua84tzzguStpYwgRJ_97VsLOyIs4sE",{"id":10296,"title":5354,"body":10297,"createdAt":10488,"description":5356,"draft":5972,"extension":5973,"image":10313,"mastodonThread":5974,"meta":10489,"navigation":5976,"path":5353,"seo":10490,"stem":5354,"tags":10491,"updatedAt":10492,"__hash__":10493},"content\u002FUnison Backup Setup.md",{"type":5822,"value":10298,"toc":10482},[10299,10308,10314,10317,10326,10355,10358,10369,10378,10400,10407,10410,10413,10416,10419,10422,10425,10431,10434,10437,10443,10446,10452,10455,10458,10461,10464,10470,10473,10479],[5825,10300,10301,10302,10307],{},"I use ",[5950,10303,10306],{"href":10304,"rel":10305},"https:\u002F\u002Fgithub.com\u002Fbcpierce00\u002Funison",[5954],"Unison File Synchronizer"," to keep my important files synchronized between machines. This is a description of how I have it arranged and automated. I have been using this setup since 2006!",[5825,10309,10310],{},[6416,10311],{"alt":10312,"src":10313},"unison sync screenshot","img\u002Funison_sync_screenshot.png",[6071,10315,5359],{"id":10316},"directory-setup",[5825,10318,10319,10320,10325],{},"I put all my important files into a directory called 'tlt' in my home directory. This happens to exactly correspond with the root http directory of ",[5950,10321,10324],{"href":10322,"rel":10323},"https:\u002F\u002Fthelackthereof.org\u002F",[5954],"my website",". Most things in the directory are fine to be on the web, but things that shouldn't be published are locked through file permissions and .htaccess files. I put this 'tlt' directory into my home directory:",[6013,10327,10328],{},[6016,10329,10330,10331],{},"\u002Fhome\u002Fawwaiid\u002F\n",[6013,10332,10333],{},[6016,10334,10335,10336],{},"tlt\u002F - my main directory, and the root of my website\n",[6013,10337,10338,10349,10352],{},[6016,10339,10340,10341],{},"private\u002F - holds private files\n",[6013,10342,10343,10346],{},[6016,10344,10345],{},"mail\u002F - holds my mail",[6016,10347,10348],{},"dotfiles\u002F - holds my homedir .config files",[6016,10350,10351],{},"projects\u002F - all my own code projects",[6016,10353,10354],{},"docs\u002F - Various documents",[5825,10356,10357],{},"I then symlink a few key directories and files from my home directory into this folder. So, for example:",[6013,10359,10360,10363,10366],{},[6016,10361,10362],{},"\u002Fhome\u002Fawwaiid\u002Fmail -> \u002Fhome\u002Fawwaiid\u002Ftlt\u002Fprivate\u002Fmail",[6016,10364,10365],{},"\u002Fhome\u002Fawwaiid\u002F.muttrc -> \u002Fhome\u002Fawwaiid\u002Ftlt\u002Fprivate\u002Fdotfiles\u002F.muttrc",[6016,10367,10368],{},"\u002Fhome\u002Fawwaiid\u002Fprojects\u002F -> \u002Fhome\u002Fawwaiid\u002Ftlt\u002Fprojects\u002F",[5825,10370,10371,10372,7920,10374,10377],{},"And so on. So to get all my settings from one machine to another, I just need to get a copy of this 'tlt' directory and make a few key symlinks. When I get a new machine I actually do these from my home directory. Yes, they give some error about not duplicationg ",[6002,10373,7203],{},[6002,10375,10376],{},".."," but ... I ignore those errors :)",[6013,10379,10380,10385,10390,10395],{},[6016,10381,10382],{},[6002,10383,10384],{},"ln -s tlt\u002Fdotfiles\u002F.* .\u002F",[6016,10386,10387],{},[6002,10388,10389],{},"ln -s tlt\u002Fprivate\u002Fdotfiles\u002F.* .\u002F",[6016,10391,10392],{},[6002,10393,10394],{},"ln -s tlt\u002Fprojects\u002F .",[6016,10396,10397],{},[6002,10398,10399],{},"ln -s tlt\u002Fdocs\u002F .",[5825,10401,10402,10403,10406],{},"I guess technically I could mash those into one big ",[6002,10404,10405],{},"ln -s",". Eh.",[5825,10408,10409],{},"To backup all my stuff I must back up this tlt directory. This is where unison comes in.",[6071,10411,5364],{"id":10412},"unison",[5825,10414,10415],{},"Unison is kinda like rsync, except smarter (stateful). It keeps a database on each machine so that it can remember what the directories looked like during the most recent synchronization. So if you delete a file on one machine it knows, and if you delete it on one machine and modify it on another it can tell that there is a conflict which you must resolve by hand. It does this through presence, timestamps, and file checksums. After you've synchronized two hosts, resolving all conflicts, you have an identical set of files on each host. We use the notation host1->host2 meaning a synchronization between host1 and host2 initiated from host1.",[5825,10417,10418],{},"I have three machines on which I want an up-to-date copy of 'tlt'. They are my own computer (Feline), my website host (Mirabel), and my laptop (Jill). Generally I will sync Feline->Mirabel and Jill->Mirabel, but I could do other combinations (and often do Jill->Feline).",[5825,10420,10421],{},"Let's say I am using Feline and want to sync with Mirabel. If you simply run 'unison' it will interactively prompt you for the local and remote directory you wish to synchronize, and step you through the initial sync. It'll remember too, and when you re-run it will sync what it can and ask you about conflicts. Try it a couple times, it's fun.",[5825,10423,10424],{},"It stores its settings in preference files inside of ~\u002F.unison\u002F. Here is the preference file I use (2024) for vorm->pegasus. Really the only tricky thing is the ignore paths, which I add to every now and then.",[6971,10426,10429],{"className":10427,"code":10428,"language":6976},[6974],"# Unison preferences file\n\n# Let's compress our SSH connection\nrshargs = -C\ntimes = true\nlog = false\n\n# And these are the standard home dir locations\nroot = \u002Fhome\u002Fawwaiid\u002Ftlt\u002F\nroot = ssh:\u002F\u002Fawwaiid@pegasus\u002F\u002Fhome\u002Fawwaiid\u002Ftlt\nservercmd = \u002Fhome\u002Fawwaiid\u002Fbin\u002Funison\n# servercmd = \u002Fusr\u002Fbin\u002Funison\n\n# Paths to ignore -- store local-only info\nignore = Path dev\nignore = Path tmp\nignore = Path {docs\u002Fdotfiles\u002F.urxvt\u002Furxvtd-vorm}\nignore = Path {docs\u002Fdotfiles\u002F.urxvt\u002Furxvtd-zokei}\nignore = Path {docs\u002Fdotfiles\u002F.vim\u002F.netrwhist}\nignore = Path {docs\u002Fdotfiles\u002F.xmonad\u002Fxmonad-x86_64-linux}\nignore = Path {docs\u002Fdotfiles\u002F.xmonad\u002Fxmonad.hi}\nignore = Path {docs\u002Fdotfiles\u002F.xmonad\u002Fxmonad.o}\nignore = Path {docs\u002Ftmp}\nignore = Path {private\u002Fdotfiles\u002F.config\u002FGIMP}\nignore = Path {private\u002Fdotfiles\u002F.config\u002FSignal\u002Flogs\u002Fapp.log}\nignore = Path {private\u002Fdotfiles\u002F.config\u002FSlack}\nignore = Path {private\u002Fdotfiles\u002F.config\u002Fbak}\nignore = Path {private\u002Fdotfiles\u002F.config\u002Fchromium}\nignore = Path {private\u002Fdotfiles\u002F.config\u002Fcoc}\nignore = Path {private\u002Fdotfiles\u002F.config\u002Fcopyq\u002F.copyq_s}\nignore = Path {private\u002Fdotfiles\u002F.config\u002Fgoogle-chrome}\nignore = Path {private\u002Fdotfiles\u002F.config\u002Flibreoffice}\nignore = Path {private\u002Fdotfiles\u002F.config\u002Fpianobar\u002Fctl}\nignore = Path {private\u002Fdotfiles\u002F.config\u002Funity3d}\nignore = Path {private\u002Fdotfiles\u002F.config\u002Fyarn}\nignore = Path {projects\u002Frust\u002Fiwt\u002Ftarget}\n",[6002,10430,10428],{"__ignoreMap":45},[6071,10432,5369],{"id":10433},"automatic-backups",[5825,10435,10436],{},"OK, here's another tip -- most of the time there aren't any conflicts. So there is a flag for unison which lets it run in batch mode. Guess what it is?",[6971,10438,10441],{"className":10439,"code":10440,"language":6976},[6974],"awwaiid@feline:~$ unison -batch mirabel\n",[6002,10442,10440],{"__ignoreMap":45},[5825,10444,10445],{},"This runs unison, from feline to mirabel, syncing my 'tlt' directory on each and skipping any conflicts and giving a report. This is exactly what we need for cron! Here is my entry in my own crontab on feline, along with some stuff to send me shorter email reports:",[6971,10447,10450],{"className":10448,"code":10449,"language":6976},[6974],"10 3 * * * unison -batch -terse -contactquietly mirabel 2>&1\n",[6002,10451,10449],{"__ignoreMap":45},[5825,10453,10454],{},"Every now and then I will run unison without the -batch flag to make resolve any outstanding conflicts. A conflict might happen if I edit a file on my laptop (jill) and on my desktop (feline) without bothering to synchronize inbetween. Resolution mode will let me see a diff and select which one I want to keep (or run a merge tool or whatever I like).",[5825,10456,10457],{},"I tend to sync Jill by hand. Actually I have two other machines which automatically get synced, but that is just more of the same.",[6071,10459,5374],{"id":10460},"fancier-setup",[5825,10462,10463],{},"The above requires you to check, every now and then, if everything worked. You do that by looking at the log file in \u002Ftmp and maybe noticing that something isn't working. That doesn't seem like the GREATEST way to do it. So I made this wrapper that will let me know that it worked or failed:",[6971,10465,10468],{"className":10466,"code":10467,"language":6976},[6974],"#!\u002Fbin\u002Fbash\n\nexport DISPLAY=:0\n\n\u002Fhome\u002Fawwaiid\u002Fbin\u002Funison -ui text -retry 3 -batch pegasus >\u002Ftmp\u002Funison-pegasus.log 2>&1\ncommand_status=$?\n\nif [ $command_status -eq 0 ]; then\n  notify-send -i emblem-synchronizing -u low 'Backup complete!'\nelse\n  notify-send -i emblem-synchronizing -u critical 'BACKUP ERROR! SEE LOG!'\nfi\n",[6002,10469,10467],{"__ignoreMap":45},[5825,10471,10472],{},"And now my cronjob looks like this, running hourly:",[6971,10474,10477],{"className":10475,"code":10476,"language":6976},[6974],"0 * * * * \u002Fhome\u002Fawwaiid\u002Fbin\u002Funison-backup > \u002Ftmp\u002Funison-backup.log 2>&1\n",[6002,10478,10476],{"__ignoreMap":45},[5825,10480,10481],{},"This is a bit more specific to my system, since I have notificiations all set up with notify-send and it can work from a cronjob and all that. I suspect I'm going to have to add another escape for when the machine is offline.",{"title":45,"searchDepth":15,"depth":15,"links":10483},[10484,10485,10486,10487],{"id":10316,"depth":15,"text":5359},{"id":10412,"depth":15,"text":5364},{"id":10433,"depth":15,"text":5369},{"id":10460,"depth":15,"text":5374},"2006-03-18",{},{"title":5354,"description":5356},[],"2024-04-18","y2cQnQK_Um7IScISliv-a2A02Koqr7HJJ2qzdndq12Q",{"id":10495,"title":4741,"body":10496,"createdAt":10586,"description":10500,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":10587,"navigation":5976,"path":4740,"seo":10588,"stem":10589,"tags":10590,"updatedAt":10586,"__hash__":10592},"content\u002FTLT - 2024.04.17 - Recurse - W4-6 D3-5.md",{"type":5822,"value":10497,"toc":10584},[10498,10501],[5825,10499,10500],{},"In-Hub, LLM + Sonic Pi, dash of docker-compose",[6013,10502,10503,10540,10571],{},[6016,10504,10505,10508],{},[7247,10506,10507],{},"General Status:",[6013,10509,10510,10513,10516,10523],{},[6016,10511,10512],{},"Went into the Hub",[6016,10514,10515],{},"Worked in the morning on Human Essentials a bit, but quickly switched to chatting with folks locally",[6016,10517,10518,10519,10522],{},"Paired with ",[5834,10520,10521],{},"SL"," to set up some docker-compose fun",[6016,10524,10518,10525,10528,10529,10533,10534,10539],{},[5834,10526,10527],{},"SW"," on trying to mash up ",[5950,10530,10532],{"href":8700,"rel":10531},[5954],"LLM (datasette)"," with ",[5950,10535,10538],{"href":10536,"rel":10537},"https:\u002F\u002Fsonic-pi.net\u002F",[5954],"Sonic PI","! We ... didn't get it to work. But SW says they got something going via a CLI interface to Sonic!",[6016,10541,10542,10545],{},[7247,10543,10544],{},"Nerd Snipe:",[6013,10546,10547,10556,10559,10562,10565,10568],{},[6016,10548,10549,10550,10555],{},"When I was chatting with SL yesterday I realized that my ",[5950,10551,10554],{"href":10552,"rel":10553},"https:\u002F\u002Fthelackthereof.org\u002Funison-backup-setup",[5954],"Unison Powered Backups"," can error out without me knowing",[6016,10557,10558],{},"Well I've always KNOWN this, but I ignore it because it works pretty much all the time. Still ... it had failed the night before...",[6016,10560,10561],{},"So I made a wrapper that will do a system notification when it fails",[6016,10563,10564],{},"Now I've got it running hourly. When it works it pops up a \"backup complete\" notification that goes away after a few seconds, and when it fails it pops up a \"BACKUP FAILED\" that won't go away until I click",[6016,10566,10567],{},"Now I have to decide what I want it to tell me about no-internet situations. hm.",[6016,10569,10570],{},"I just noticed that my original writeup of this backup structure was written in 2006!!!! That's pretty good sustainability on a backup solution :)",[6016,10572,10573,10576],{},[7247,10574,10575],{},"Alloy+LLM+Rails Project:",[6013,10577,10578,10581],{},[6016,10579,10580],{},"RC has a tiny \"community cluster\", which has to machines with small GPUs!",[6016,10582,10583],{},"I got access to that yesterday, so I played with that a bit on the token-tree, got it working! Def faster than the local CPU. I wouldn't be surprised if a mac Mx processor was similar",{"title":45,"searchDepth":15,"depth":15,"links":10585},[],"2024-04-17",{},{"title":4741,"description":10500},"TLT - 2024.04.17 - Recurse - W4-6 D3-5",[5980,10591],"recurse-center","YHMck5gUcmr12CXytuiQEfz_OxW0yltlgsO9xO46-Hk",{"id":10594,"title":4736,"body":10595,"createdAt":10697,"description":10599,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":10698,"navigation":5976,"path":4735,"seo":10699,"stem":10700,"tags":10701,"updatedAt":10697,"__hash__":10702},"content\u002FTLT - 2024.04.16 - Recurse - W4-6 D2-5.md",{"type":5822,"value":10596,"toc":10695},[10597,10600],[5825,10598,10599],{},"In-Hub, LLM Club, Mediapipe, Coffee Project, docker-compose",[6013,10601,10602,10659,10677],{},[6016,10603,10604,10606],{},[7247,10605,10507],{},[6013,10607,10608,10611,10618,10627,10640,10656],{},[6016,10609,10610],{},"Went into the hub! So great to see and interact IRL",[6016,10612,10613,10614,10617],{},"Applied LLM Club we played with a large JSON dataset; works pretty easy to use the ChatGPT UI and upload the whole file, but we didn't find an obvious way to do the same thing on the API. Maybe something with their ",[6002,10615,10616],{},"Assistants"," concept",[6016,10619,10620,10621,10626],{},"I went over to ",[5950,10622,10625],{"href":10623,"rel":10624},"https:\u002F\u002Fcoffeeprojectny.com\u002F",[5954],"Coffee Project",", pretty delicious",[6016,10628,10629,10630,10635,10636,10639],{},"Played with ",[5950,10631,10634],{"href":10632,"rel":10633},"https:\u002F\u002Fdevelopers.google.com\u002Fmediapipe\u002Fsolutions\u002Fgenai\u002Fllm_inference\u002Fandroid#configuration_options",[5954],"Mediapipe",", android AI\u002Fmedia lib from Google, with ",[5834,10637,10638],{},"JH",". But the bleeding edge software was ... not working",[6016,10641,10642,10643,10645,10646,10651,10652,10655],{},"Showed ",[5834,10644,10521],{}," some of how I set up ",[5950,10647,10650],{"href":10648,"rel":10649},"https:\u002F\u002Fthelackthereof.org",[5954],"thelackthereof.org"," with docker-compose, including nginx running ",[5834,10653,10654],{},"in"," docker with the rest of it",[6016,10657,10658],{},"I worked on some Human Essentials, really need to wrap that :)",[6016,10660,10661,10663],{},[7247,10662,10544],{},[6013,10664,10665,10674],{},[6016,10666,10667,10668,10673],{},"TIL: I am using ",[5950,10669,10672],{"href":10670,"rel":10671},"https:\u002F\u002Fgithub.com\u002Falacritty\u002Falacritty",[5954],"Alacritty",", and you can apparently hit ctrl+shift+b to search backwards up through your scrollback!",[6016,10675,10676],{},"I upgraded Nuxt to the latest for my static site ... and it now (correctly) gets mad about some internal broken links. But I couldn't find\u002Ffix them all so I turned that safety feature off hah",[6016,10678,10679,10681],{},[7247,10680,10575],{},[6013,10682,10683,10692],{},[6016,10684,10685,10686,10691],{},"Nice video -- ",[5950,10687,10690],{"href":10688,"rel":10689},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=FvNRlE4E9QQ",[5954],"\"Finding bugs without running or even looking at code\" by Jay Parlar",", though it is focused on the structural modeling not the state modeling",[6016,10693,10694],{},"Got some communications from the Alloy maintainers; not quite satisfied that we've connected as deeply as I like, but I think I'll be able to get the CLI-JSON output I want in any case",{"title":45,"searchDepth":15,"depth":15,"links":10696},[],"2024-04-16",{},{"title":4736,"description":10599},"TLT - 2024.04.16 - Recurse - W4-6 D2-5",[5980,10591],"_bvsSMawOWLGnV4BSEOIAHo6zFVzuoQboA5EmQnzKpk",{"id":10704,"title":4731,"body":10705,"createdAt":10826,"description":10709,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":10827,"navigation":5976,"path":4730,"seo":10828,"stem":10829,"tags":10830,"updatedAt":10826,"__hash__":10831},"content\u002FTLT - 2024.04.15 - Recurse - W4-6 D1-5.md",{"type":5822,"value":10706,"toc":10824},[10707,10710],[5825,10708,10709],{},"Website updates to break insulation, bit of Human Essentials",[6013,10711,10712,10755,10815],{},[6016,10713,10714,10716],{},[7247,10715,10507],{},[6013,10717,10718,10721,10724,10733,10736,10749,10752],{},[6016,10719,10720],{},"I think I'll go Virtual today and go into the Hub tomorrow (though I keep going back and forth)",[6016,10722,10723],{},"Decided to beak my own insulation a bit, cross-posted all of these checkins to my own website",[6016,10725,10726,10727,10732],{},"We went to a few bookstores over the weekend! I got ",[5950,10728,10731],{"href":10729,"rel":10730},"https:\u002F\u002Fwww.adriantchaikovsky.com\u002Fthe-final-architects-shards-of-earth-eyes-of-the-voice-by-adrian-tchaikovsky.html",[5954],"Adrian Tchaikovsky, Eyes of the Void, Book II of The Final Architects Series",". Betsy told me years and years ago to check out Tchaikovsky and boy was she right! I'm chewing through the catalog. Beth isn't into him as much, so YMMV",[6016,10734,10735],{},"I know I'm feeling better because I'm feeling very wordy today haha",[6016,10737,10738,10739,7881,10744],{},"Also picked up ",[5950,10740,10743],{"href":10741,"rel":10742},"https:\u002F\u002Fus.macmillan.com\u002Fbooks\u002F9781250151179\u002Fnineteenwaysoflookingatconsciousness",[5954],"Patrick house, Nineteen Ways of Looking at Consciousness",[5950,10745,10748],{"href":10746,"rel":10747},"https:\u002F\u002Fwww.booksaremagic.net\u002Fitem\u002FL0V8Hcd1MxZHzEYGiH3oNw",[5954],"Daniel C. Dennett, I've Been Thinking",[6016,10750,10751],{},"Both are interesting. Thinking about consciousness, Agency, all that is a thing I enjoy. Dennett is often too aggressive, but I'm strongly aligned with his core ideas",[6016,10753,10754],{},"Today I need to do a bit more on Human Essentials too. Had a good meeting with the team yesterday and there are only a few small things to get done on Dashboard for it to be mergeable",[6016,10756,10757,10759],{},[7247,10758,10544],{},[6013,10760,10761,10764,10783,10793,10805,10812],{},[6016,10762,10763],{},"Backdating blog entries and adding tags wasn't easy. So I updated my new-blog command wrapper with a few new options :)",[6016,10765,10766,10767,10772,10773,10778,10779,10782],{},"I'm using the ",[5950,10768,10771],{"href":10769,"rel":10770},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fcommander",[5954],"Commander"," CLI helper along with ",[5950,10774,10777],{"href":10775,"rel":10776},"https:\u002F\u002Ftypestrong.org\u002Fts-node\u002F",[5954],"ts-node"," for this. So my script starts with ",[6002,10780,10781],{},"#!\u002Fusr\u002Fbin\u002Fenv ts-node"," and contains Typescript",[6016,10784,10785,10786,10788,10789,10792],{},"I can never remember where my ",[6002,10787,5980],{}," command really lives, but ",[6002,10790,10791],{},"vim $(which blog)"," works great :)",[6016,10794,10795,10796,10800,10801,10804],{},"At some point recently I upgraded to ",[5950,10797,10799],{"href":7878,"rel":10798},[5954],"Taskwarrior 3.0"," which includes having to do an export of tasks from the old version ",[5834,10802,10803],{},"BEFORE"," you install the new version. I got that taken care of before my OS does it for me",[6016,10806,10807,10808,10811],{},"I started to help the Taskwarrior peeps out by making a perl script that translates their legacy ",[6002,10809,10810],{},".data"," format directly into JSON so you could do the extract even after the upgrade .... but my data is migrated now and works fine so I lost momentum",[6016,10813,10814],{},"On my blog, I might make a few more formatting tweaks. I will at some point use NuxtImage to render the thumbnails for things .... right now it is actually the full sized image downloaded and then scaled by the browser. People have a lot of bandwidth now, right? They're not that big anyway",[6016,10816,10817,10819],{},[7247,10818,10575],{},[6013,10820,10821],{},[6016,10822,10823],{},"Still no direct reply from the maintainers, but I'm going to keep jamming",{"title":45,"searchDepth":15,"depth":15,"links":10825},[],"2024-04-15",{},{"title":4731,"description":10709},"TLT - 2024.04.15 - Recurse - W4-6 D1-5",[5980,10591],"aDias0CbbVo9AF8DtUzVgYUGp9J8UnyPsOjh01iAqIw",{"id":10833,"title":4726,"body":10834,"createdAt":11037,"description":10838,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":11038,"navigation":5976,"path":4725,"seo":11039,"stem":11040,"tags":11041,"updatedAt":11037,"__hash__":11042},"content\u002FTLT - 2024.04.14 - Recurse - W3-6.md",{"type":5822,"value":10835,"toc":11035},[10836,10839],[5825,10837,10838],{},"A week spent coughing, writing Java, and watching Andor. First World Problems hah. Not bad in the scheme of things! :)",[6013,10840,10841,10882,10931],{},[6016,10842,10843,10845],{},[7247,10844,10507],{},[6013,10846,10847,10855,10861,10870,10873,10876,10879],{},[6016,10848,10849,10850],{},"I was Virtual all week -- fighting a cough and feeling intermittently icky :( . MUCH BETTER NOW!!! Beautiful day.\n",[6013,10851,10852],{},[6016,10853,10854],{},"Watched the eclipse from here in NYC. Was OK. Maybe I'll do totality next time :)",[6016,10856,10857,10860],{},[5834,10858,10859],{},"FEELINGS"," -- Because of that it was a pretty tough week, really feeling both not getting the value of all the human connections I'd like and also feeling the reality of being at the half-way point for the 6-week batch",[6016,10862,10863,10864,10869],{},"Watched a few more episodes of ",[5950,10865,10868],{"href":10866,"rel":10867},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAndor_(TV_series)",[5954],"Andor",". I haven't watched any of the other Star Wars series shows, but got recommended this one by a random YouTube video and I like it. I only have a few more episodes left for the season",[6016,10871,10872],{},"It was Beth's Birthday on Tuesday; I had dinner reservations and desert lined up ... but we called it off since I was feeling icky. BUT! We rescheduled to Saturday and had a lovely time! We are the same age yet again!",[6016,10874,10875],{},"Here it is Sunday 2024-04-14 and I am feeling much much better. Skipping our weekly weight-training workout though to not push myself backwards",[6016,10877,10878],{},"During the week I did attend a few things, and loved them all! I think y'all are great",[6016,10880,10881],{},"Really one of my rare complaints is the double-edge sword of a curated community -- the insulation is dividing people in my life; like even these posts to zulip feel better to write than the public blog, and I'm not going to link to individuals on the public blog. In another week one of my bestest friends is visiting from Portland OR, and without special permission I can't bring them over to the hub. Heck I can't bring my spouse by when we happen to be nearby later today. I get it, I like it, I agree with it, and yet ... I feel that separation of insiders and outsiders. Eh.",[6016,10883,10884,10886],{},[7247,10885,10544],{},[6013,10887,10888,10891,10898,10901,10910,10919,10922],{},[6016,10889,10890],{},"I was upset that on Tuesday at a zoom meeting I had a coughing fit while screen sharing and that my desktop zoom ... wouldn't let me mute myself or stop sharing! GARRR",[6016,10892,10893,10894,10897],{},"So. I think I got it. The solution: ",[5834,10895,10896],{},"stop using the desktop zoom client",". Turns out you can use the browser just like I do all the time with google meet. BYE BYE DESKTOP ZOOM",[6016,10899,10900],{},"It seems to work better now. I still have my internet drop now and then, which has something to do with where I am physically when remote here (switching wifi APs or something), but I can tether and then all is good",[6016,10902,10903,10904,10909],{},"Still doing some mild tweaks to Sway, the latest is that I got ",[5950,10905,10908],{"href":10906,"rel":10907},"https:\u002F\u002Fgithub.com\u002Fnicolasavru\u002Fswaymonad",[5954],"swaymonad"," running, which controls some initial window-placement settings to make them more like xmonad. Looks like I'll probably fork\u002Ftweak it to my liking",[6016,10911,10912,10913,10918],{},"And THAT thing uses ",[5950,10914,10917],{"href":10915,"rel":10916},"https:\u002F\u002Fnixos.org\u002F",[5954],"Nix","! So...",[6016,10920,10921],{},"I got Nix running (on top of my existing Ubuntu, not as a whole install)",[6016,10923,10924,10925,10930],{},"Just now I was listening to a ",[5950,10926,10929],{"href":10927,"rel":10928},"https:\u002F\u002Fchangelog.com\u002Fshipit\u002F99",[5954],"podcast (Ship It! Episode 99: From Kubernetes to Nix)"," and ... now am going to try to do MORE NIX, maybe inflict it upon my work people eventually. MUAHAHAHA",[6016,10932,10933,10935],{},[7247,10934,10575],{},[6013,10936,10937,10940,10943,10946,10949,10952,10955,11016,11023,11026,11029,11032],{},[6016,10938,10939],{},"Well. I learned some more Alloy!",[6016,10941,10942],{},"I also was trying to play with different ways of interfacing with Alloy, knowing that the CLI is very limited",[6016,10944,10945],{},"BUT they are prepping for a v6.1 which actually has some good CLI tooling! Like you can use it without the GUI, export JSON, even get an interactive console mode!",[6016,10947,10948],{},"Very cool",[6016,10950,10951],{},"But it doesn't work",[6016,10953,10954],{},"As in the current dev branch is in need of some bug-fixes and QA for release. Also I think this is both a \"soon\" release and one that has been in progress for a year. Maybe I can help!",[6016,10956,10957,10958],{},"So ... I'm now up to 8 open PRs against various branches and have reached out to the maintainers to do some coordination :)\n",[6013,10959,10960,10967,10974,10981,10988,10995,11002,11009],{},[6016,10961,10962],{},[5950,10963,10966],{"href":10964,"rel":10965},"https:\u002F\u002Fgithub.com\u002Fnmacedo\u002Forg.alloytools.alloy\u002Fpull\u002F4",[5954],"Quiets more CLI output when requested",[6016,10968,10969],{},[5950,10970,10973],{"href":10971,"rel":10972},"https:\u002F\u002Fgithub.com\u002Fnmacedo\u002Forg.alloytools.alloy\u002Fpull\u002F3",[5954],"Remove deprecation warning for DefaultSymbolFactory",[6016,10975,10976],{},[5950,10977,10980],{"href":10978,"rel":10979},"https:\u002F\u002Fgithub.com\u002Fnmacedo\u002Forg.alloytools.alloy\u002Fpull\u002F2",[5954],"Allow not-quite-regular files",[6016,10982,10983],{},[5950,10984,10987],{"href":10985,"rel":10986},"https:\u002F\u002Fgithub.com\u002FAlloyTools\u002Forg.alloytools.alloy\u002Fpull\u002F261",[5954],"Print the 0th table; label the repeat number",[6016,10989,10990],{},[5950,10991,10994],{"href":10992,"rel":10993},"https:\u002F\u002Fgithub.com\u002FAlloyTools\u002Forg.alloytools.alloy\u002Fpull\u002F262",[5954],"Prevent overriding ctrl+A and ctrl+E",[6016,10996,10997],{},[5950,10998,11001],{"href":10999,"rel":11000},"https:\u002F\u002Fgithub.com\u002FAlloyTools\u002Forg.alloytools.alloy\u002Fpull\u002F263",[5954],"Remove long-deprecated menu entry",[6016,11003,11004],{},[5950,11005,11008],{"href":11006,"rel":11007},"https:\u002F\u002Fgithub.com\u002FAlloyTools\u002Forg.alloytools.alloy\u002Fpull\u002F265",[5954],"Make the parser match the syntax highlighter",[6016,11010,11011],{},[5950,11012,11015],{"href":11013,"rel":11014},"https:\u002F\u002Fgithub.com\u002FAlloyTools\u002Forg.alloytools.alloy\u002Fpull\u002F267",[5954],"Fix expectation of toDTO, avoid NPE",[6016,11017,11018,11019,11022],{},"As I mentioned in my message to the developers ... as another open-source maintainer, I know that contributors can be well-intentioned but often come around, talk up some ideas, and disappear. Or worse, submit an un-mergeable PR and disappear. So I'm trying very hard to not do that. Each one of those is very small, like one or a few lines, easy to verify, and I ",[5834,11020,11021],{},"think"," immediately mergeable",[6016,11024,11025],{},"I have noticed there are, unsurprisingly some gaps in the unit tests, so I'm going to make some CLI-specific tests next week",[6016,11027,11028],{},"Also this is Java! It's interesting how my position here has shifted over years ... at one point I was so frustrated with all-things-java that I swore it off. But I've matured or something and also realized that I LOVE ALL PROGRAMMING!!",[6016,11030,11031],{},"I should note that I've also sworn off mmmmmm Databases and Javascript, but here I am 20 years later and both are close to my heart :)",[6016,11033,11034],{},"Anyway. When it comes to the usual project-existential issues during my batch, this is clearly a good foundation; if I can help get this tool itself to be updated and integratable then I'll feel pretty pretty good",{"title":45,"searchDepth":15,"depth":15,"links":11036},[],"2024-04-14",{},{"title":4726,"description":10838},"TLT - 2024.04.14 - Recurse - W3-6",[5980,10591],"XoGenr8nky-XL6dhbOtnU5lysZebRzUmPpumLDrjwMY",{"id":11044,"title":4721,"body":11045,"createdAt":11113,"description":11049,"draft":5972,"extension":5973,"image":11055,"mastodonThread":5974,"meta":11114,"navigation":5976,"path":4720,"seo":11115,"stem":11116,"tags":11117,"updatedAt":11113,"__hash__":11118},"content\u002FTLT - 2024.04.05 - Recurse - W2-6 D5-5.md",{"type":5822,"value":11046,"toc":11111},[11047,11050,11056],[5825,11048,11049],{},"Virtual errands, GPU token generation. Oh right, Alloy",[5825,11051,11052],{},[6416,11053],{"alt":11054,"src":11055},"Token tree 3x3 cat sat on the","img\u002FToken_tree_3x3_cat_sat_on_the.png",[6013,11057,11058,11077],{},[6016,11059,11060,11062],{},[7247,11061,10507],{},[6013,11063,11064,11067,11070],{},[6016,11065,11066],{},"Virtual today",[6016,11068,11069],{},"Mostly doing some errands and general reading",[6016,11071,11072,11073,11076],{},"Hung out with ",[5834,11074,11075],{},"J"," some, looking at LLM stuff and showing a GPU cloud executor",[6016,11078,11079,11081],{},[7247,11080,10575],{},[6013,11082,11083,11086,11089,11092,11095,11098,11101],{},[6016,11084,11085],{},"I'm giving local-intel-gpu one more last chance",[6016,11087,11088],{},"... I got it working on an A100 and it was a lot faster! But like... 10x, not instant",[6016,11090,11091],{},"I generated a large tree but it had some unescaped character that I haven't found yet so I don't have the actual rendered graphviz",[6016,11093,11094],{},"I remembered to turn off the rented instance :)",[6016,11096,11097],{},"I started going back and updating Alloy knowledge, esp around time-domain which was added since I learned it",[6016,11099,11100],{},"Next I need to start doing real Alloy models of things I think about or systems I use, and start improving the tooling around that",[6016,11102,11103,11104,11107,11108,11110],{},"I'm starting to think about Alloy tooling, both direct and LLM; like in addition to Rails in\u002Fout I'm thinking of PlantUML in\u002Fout. A lot of Alloy users report using it as a ",[5834,11105,11106],{},"thinking tool",". I use PlantUML as a ",[5834,11109,11106],{},". So ...",{"title":45,"searchDepth":15,"depth":15,"links":11112},[],"2024-04-05",{},{"title":4721,"description":11049},"TLT - 2024.04.05 - Recurse - W2-6 D5-5",[5980,10591],"HXjQaY7YRQvQvH4eu0NoB_SkPizSorpKzfZXzTQiQjk",{"id":11120,"title":4716,"body":11121,"createdAt":11187,"description":11125,"draft":5972,"extension":5973,"image":11131,"mastodonThread":5974,"meta":11188,"navigation":5976,"path":4715,"seo":11189,"stem":11190,"tags":11191,"updatedAt":11187,"__hash__":11192},"content\u002FTLT - 2024.04.04 - Recurse - W2-6 D4-5.md",{"type":5822,"value":11122,"toc":11185},[11123,11126,11132],[5825,11124,11125],{},"Pairing, unicode tokens, graphviz bling",[5825,11127,11128],{},[6416,11129],{"alt":11130,"src":11131},"Unicode token tree with Chinese","img\u002FUnicode_token_tree_with_Chinese.png",[6013,11133,11134,11158],{},[6016,11135,11136,11138],{},[7247,11137,10507],{},[6013,11139,11140,11143,11146,11149,11155],{},[6016,11141,11142],{},"Starting to get into the hub-vibe a bit more, love it. Starting to actually remember individuals better! I'm so bad with names, but will keep asking over and over until I get it :)",[6016,11144,11145],{},"I got to show the token-tree thing to a few individuals and then presented at the big session, very fun",[6016,11147,11148],{},"Still having wayland\u002Fsway + zoom issues :( . Weird color inversion, floating-vs-non-floating-windows, etc. But I'm sticking with it. Hard to switch after like 15 years of xmonad (and like 25 years of X11 heh), but it's at like 99.9% so can't stop now",[6016,11150,11151,11152,11154],{},"Shout out again to ",[5834,11153,8930],{}," who helped me sort out some caching issues that was slowing down CPU token generation. Making it fast-enough has been really helpful",[6016,11156,11157],{},"Will be Virtual RC tomorrow (Friday), gotta do some errands and prep for a friend-visit over the weekend",[6016,11159,11160,11162],{},[7247,11161,10575],{},[6013,11163,11164,11167,11173,11176,11179,11182],{},[6016,11165,11166],{},"Working on wrapping up token-visualization",[6016,11168,10518,11169,11172],{},[5834,11170,11171],{},"Q",", sorted out some escaping and unicode things",[6016,11174,11175],{},"Added a bit of bling shadows and scaling (styling SVG with CSS is fun!)",[6016,11177,11178],{},"Got incremental streaming of updates, background threading of the processing, and interruptability",[6016,11180,11181],{},"Going to now switch over to Alloy; do some tutorials and toy models, build a few by-hand models of real world apps (Human Essentials Rails)",[6016,11183,11184],{},"Somewhat of a pure-research project, so I'll go with where it takes me. But I am feeling the time-pressure a bit, and am hungry for artifacts to show off in the end. We'll see what comes next :)",{"title":45,"searchDepth":15,"depth":15,"links":11186},[],"2024-04-04",{},{"title":4716,"description":11125},"TLT - 2024.04.04 - Recurse - W2-6 D4-5",[5980,10591],"vK3Hd63PaQocbwt0pAo507oUc9wuFyUlpBXkt_0vjug",{"id":11194,"title":4703,"body":11195,"createdAt":11297,"description":4705,"draft":5972,"extension":5973,"image":11204,"mastodonThread":5974,"meta":11298,"navigation":5976,"path":4702,"seo":11299,"stem":11300,"tags":11301,"updatedAt":11297,"__hash__":11302},"content\u002FTLT - 2024.04.03 - Recurse - W2-6 D3-5.md",{"type":5822,"value":11196,"toc":11293},[11197,11199,11205,11208,11250,11253],[5825,11198,4705],{},[5825,11200,11201],{},[6416,11202],{"alt":11203,"src":11204},"Token tree, 3x3 of solar system","img\u002FToken_tree,_3x3_of_solar_system.png",[6071,11206,4678],{"id":11207},"part-i-morning",[6013,11209,11210,11228],{},[6016,11211,11212,11214],{},[7247,11213,10507],{},[6013,11215,11216,11219],{},[6016,11217,11218],{},"In the hub today",[6016,11220,11221,11222,11227],{},"I need to work on getting this ",[5950,11223,11226],{"href":11224,"rel":11225},"https:\u002F\u002Fgithub.com\u002Frubyforgood\u002Fhuman-essentials\u002Fpull\u002F3788",[5954],"Human Essentials Dashboard PR"," mergeable",[6016,11229,11230,11232],{},[7247,11231,10575],{},[6013,11233,11234,11237,11244,11247],{},[6016,11235,11236],{},"When I run the out-of-the-box generate locally it generates tokens fast-enough for my tree demo",[6016,11238,11239,11240,11243],{},"So I'm going to focus on getting the tree generation to be ",[5834,11241,11242],{},"as fast"," as that",[6016,11245,11246],{},"Because as I think of it, when I shift to whole-codebase analysis it is unlikely that I will do that on anything smaller than a hosted API-based model (GPT-4, Claude2, etc)",[6016,11248,11249],{},"Dunno",[6071,11251,4683],{"id":11252},"part-ii-evening",[6013,11254,11255,11259,11268],{},[6016,11256,11257],{},[7247,11258,10507],{},[6016,11260,11261,11263],{},[7247,11262,10544],{},[6013,11264,11265],{},[6016,11266,11267],{},"Fixed my vim comment-code keybinding. Where did it go before? Also ctrl-backspace to delete-word.",[6016,11269,11270,11272],{},[7247,11271,10575],{},[6013,11273,11274,11278,11281,11284,11287,11290],{},[6016,11275,10518,11276,8003],{},[5834,11277,8930],{},[6016,11279,11280],{},"He walked me through how some of the LLM KV caching works",[6016,11282,11283],{},"So now I'm walking through my code to see if I can make it a bit faster",[6016,11285,11286],{},"I also got progress on displaying a whole tree and a web interface",[6016,11288,11289],{},"I think next I want to generate the tree incrementally on the web",[6016,11291,11292],{},"I'll stop at that point though, outputting graphviz is satisfying enough for now",{"title":45,"searchDepth":15,"depth":15,"links":11294},[11295,11296],{"id":11207,"depth":15,"text":4678},{"id":11252,"depth":15,"text":4683},"2024-04-03",{},{"title":4703,"description":4705},"TLT - 2024.04.03 - Recurse - W2-6 D3-5",[5980,10591],"_3qummQt5ARS9EuLgUNFINdZmQu0Yp1BEBFzxBHkm4I",{"id":11304,"title":4698,"body":11305,"createdAt":11377,"description":11309,"draft":5972,"extension":5973,"image":11315,"mastodonThread":5974,"meta":11378,"navigation":5976,"path":4697,"seo":11379,"stem":11380,"tags":11381,"updatedAt":11377,"__hash__":11382},"content\u002FTLT - 2024.04.02 - Recurse - W2-6 D2-5.md",{"type":5822,"value":11306,"toc":11375},[11307,11310,11316],[5825,11308,11309],{},"Applied LLM Demos; basic token output visualization with graphviz",[5825,11311,11312],{},[6416,11313],{"alt":11314,"src":11315},"Basic token tree","img\u002FBasic_token_tree.png",[6013,11317,11318,11333,11345],{},[6016,11319,11320,11322],{},[7247,11321,10507],{},[6013,11323,11324,11327,11330],{},[6016,11325,11326],{},"At the hub today!",[6016,11328,11329],{},"Delighted to keep meeting and chatting with people, went to lunch and all that",[6016,11331,11332],{},"I organized an Applied LLM meetup -- there were demos that were DELIGHTFUL! A lovely enthusiastic group :)",[6016,11334,11335,11337],{},[7247,11336,10544],{},[6013,11338,11339,11342],{},[6016,11340,11341],{},"Flipped my bluetooth mouse (which I hadn't used since switching to Sway) to left-handed",[6016,11343,11344],{},"My conference room presenting connection on this laptop has thrown me; Sway\u002FWayland won't let you have merged screens and the jabber speaker\u002Fmic doesn't output any sound for me! I need to do a more controlled practice run, the one I did wasn't good enough",[6016,11346,11347,11349],{},[7247,11348,10575],{},[6013,11350,11351,11354,11357,11360,11363,11366,11369,11372],{},[6016,11352,11353],{},"I got initial graphviz output!",[6016,11355,11356],{},"I then decided that it was too slow to generate, so started to get my intel GPU to work",[6016,11358,11359],{},"I ran into this exact same issue and gave up",[6016,11361,11362],{},"Then I started figuring out how to spend money renting someone else's computer",[6016,11364,11365],{},"... now I have to be careful. I spent $4.50 pretty quickly. I have a budget for this, but I want to spend that on actual computation instead of forgetting to turn something off and letting it run all night or all weekend for now gain",[6016,11367,11368],{},"Unfortunately the output didn't work for my first larger run; the nodes in graphviz didn't have the full path and overwrote each other",[6016,11370,11371],{},"Also I think that the local one can go a lot faster if I don't fully reset it every time; there are savepoints and some other things that might work",[6016,11373,11374],{},"Still -- it's close to being GUI-able!",{"title":45,"searchDepth":15,"depth":15,"links":11376},[],"2024-04-02",{},{"title":4698,"description":11309},"TLT - 2024.04.02 - Recurse - W2-6 D2-5",[5980,10591],"hrCc0MQFe86olYtSPGxxBFnpHW0DKixTAVrIqGDMA88",{"id":11384,"title":4693,"body":11385,"createdAt":11461,"description":11389,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":11462,"navigation":5976,"path":4692,"seo":11463,"stem":11464,"tags":11465,"updatedAt":11461,"__hash__":11466},"content\u002FTLT - 2024.04.01 - Recurse - W2-6 D1-5.md",{"type":5822,"value":11386,"toc":11459},[11387,11390],[5825,11388,11389],{},"Lunch table with Humans!",[6013,11391,11392,11433,11447],{},[6016,11393,11394,11396],{},[7247,11395,10507],{},[6013,11397,11398,11419],{},[6016,11399,11400,11401],{},"Morning\n",[6013,11402,11403,11410,11413,11416],{},[6016,11404,11405,11406,11409],{},"I find updating the ",[6002,11407,11408],{},"week"," indicator on this checkin is already upsetting",[6016,11411,11412],{},"I'm heading into The Hub today!",[6016,11414,11415],{},"Going to see if I can do some IRL pairing",[6016,11417,11418],{},"I need to work on some Human Essentials today, Wednesday is a stakeholder meeting",[6016,11420,11421,11422],{},"Evening\n",[6013,11423,11424,11427,11430],{},[6016,11425,11426],{},"I had a delightful time sitting at the lunch table and chat chat chatting with peeps",[6016,11428,11429],{},"HCI session was very interesting, with lots of discussion on Agency (which of course I'm very into)",[6016,11431,11432],{},"Failed to do any IRL pairing, will try harder tomorrow!",[6016,11434,11435,11437],{},[7247,11436,10544],{},[6013,11438,11439],{},[6016,11440,10629,11441,11446],{},[5950,11442,11445],{"href":11443,"rel":11444},"https:\u002F\u002Fgithub.com\u002Fmilgra\u002Fsov",[5954],"sov"," a bit, might use it to visualize virtual desktops. But maybe not",[6016,11448,11449,11451],{},[7247,11450,10575],{},[6013,11452,11453,11456],{},[6016,11454,11455],{},"I might want to actually really look at LangChain",[6016,11457,11458],{},"I have all the tools for a tree-of-tokens working (albeit slowly), so now working on traversing that to turn it into some visualizations",{"title":45,"searchDepth":15,"depth":15,"links":11460},[],"2024-04-01",{},{"title":4693,"description":11389},"TLT - 2024.04.01 - Recurse - W2-6 D1-5",[5980,10591],"KGtmfrYLvq1bE_7Pc8pZqcj94WxzmXBK45DUAr80QxU",{"id":11468,"title":4673,"body":11469,"createdAt":11596,"description":4675,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":11597,"navigation":5976,"path":4672,"seo":11598,"stem":11599,"tags":11600,"updatedAt":11596,"__hash__":11601},"content\u002FTLT - 2024.03.29 - Recurse - W1-6 D5-5.md",{"type":5822,"value":11470,"toc":11591},[11471,11473,11475,11493,11495,11558,11561],[5825,11472,4675],{},[6071,11474,4678],{"id":11207},[6013,11476,11477],{},[6016,11478,11479,11482],{},[7247,11480,11481],{},"Morning Status:",[6013,11483,11484,11487,11490],{},[6016,11485,11486],{},"I feel pretty great today, but going to be Virtual anyway. Got some errands to run",[6016,11488,11489],{},"I've got llama-cpp-python up and running, so I'm going to work on a back-end for it",[6016,11491,11492],{},"I'll likely solicit pairing once I get it a bit further, especially for some visuals",[6071,11494,4683],{"id":11252},[6013,11496,11497,11546],{},[6016,11498,11499,11501],{},[7247,11500,10507],{},[6013,11502,11503,11513,11516,11537,11540,11543],{},[6016,11504,11505,11506,11509,11510],{},"TIL: Drop this in your python code to get a pretty close ",[6002,11507,11508],{},"binding.pry"," equivalent ",[6002,11511,11512],{},"from IPython import embed # For debugging; put `embed()` anywhere",[6016,11514,11515],{},"Coffee Chat with Paolo!",[6016,11517,11518,11519],{},"Volitional Muscles Workshop helped me re-affirm that I like the plan that I pre-gamed\n",[6013,11520,11521,11529],{},[6016,11522,11523,11524],{},"Core: Alloy+LLM+Rails (using Human Essentials app as a dataset)\n",[6013,11525,11526],{},[6016,11527,11528],{},"Explore possibilities, mash together things, dev-tooling, do some Good",[6016,11530,11531,11532],{},"Cake: Pair, Follow Whims, Dance With Serendipity\n",[6013,11533,11534],{},[6016,11535,11536],{},"Create artifacts, play, learn, share",[6016,11538,11539],{},"Side Note: I'm typing this in vim with copilot and it is upsetting when it suggests stiff language and then it is upsetting when it suggests exactly what I was about to write because then I'm like ... is this as bad as what you just suggested dear robot?",[6016,11541,11542],{},"Attended applied machine learning group, but really just watched",[6016,11544,11545],{},".... then got a Work Call that I hopped on to help with for the end of the day",[6016,11547,11548,11550],{},[7247,11549,10575],{},[6013,11551,11552,11555],{},[6016,11553,11554],{},"Slight progress on understanding the llama-cpp-python setup",[6016,11556,11557],{},"Did some brushing up on python iterators and debugging tools",[6071,11559,4688],{"id":11560},"part-iii-weekend-bonus",[6013,11562,11563],{},[6016,11564,11565,11568],{},[7247,11566,11567],{},"Weekend Updates:",[6013,11569,11570,11582,11585,11588],{},[6016,11571,11572,11573],{},"Nerd Sniped on displaying the current desktop grid pop-up to the right monitor. Got it working :)\n",[6013,11574,11575],{},[6016,11576,11577,11578,11581],{},"For reference, ",[6002,11579,11580],{},"screen=$(swaymsg -t get_outputs | jq 'map(.focused) | index(true)')"," which I then pass on to aosd_cat",[6016,11583,11584],{},"I dreamed about generating tokens from an LLM, but I think they were physical tokens and also maybe gangsters",[6016,11586,11587],{},"I don't really need it now, but I keep wondering a cost-effective but natural-for-me way to rent GPU time to make my model run faster. I can spin up a whole linode GPU vm, but will need to make sure to delete it in-between uses. I don't really want to do hosted notebook blah blah. Not sure what I want. I guess I wish I could run a command and have a GPU on my existing linode and then run another to remove it, but that's maybe not how it works",[6016,11589,11590],{},"We went on a some shopping and walking around and out to Thai and got groceries. Making good progress on getting the sense-of-place around here",{"title":45,"searchDepth":15,"depth":15,"links":11592},[11593,11594,11595],{"id":11207,"depth":15,"text":4678},{"id":11252,"depth":15,"text":4683},{"id":11560,"depth":15,"text":4688},"2024-03-29",{},{"title":4673,"description":4675},"TLT - 2024.03.29 - Recurse - W1-6 D5-5",[5980,10591],"43mB7y3HTye5oVMUY834GREBZxLF2JFs05LZ6yidwQ4",{"id":11603,"title":4654,"body":11604,"createdAt":11698,"description":4656,"draft":5972,"extension":5973,"image":11673,"mastodonThread":5974,"meta":11699,"navigation":5976,"path":4653,"seo":11700,"stem":11701,"tags":11702,"updatedAt":11698,"__hash__":11703},"content\u002FTLT - 2024.03.28 - Notes From Peter Kriens Video.md",{"type":5822,"value":11605,"toc":11694},[11606,11614,11617,11625,11628,11639,11642,11647,11650,11661,11668,11674,11677,11680,11683],[5825,11607,11608,11609],{},"Some notes and thoughts on Peter Kriens' video, as ",[5950,11610,11613],{"href":11611,"rel":11612},"https:\u002F\u002Falloytools.discourse.group\u002Ft\u002Fthe-use-of-alloy-and-llms\u002F449\u002F2",[5954],"posted on the Alloy Discourse",[6071,11615,4659],{"id":11616},"notes-and-quotes",[5825,11618,11619,11620],{},"Video: ",[5950,11621,11624],{"href":11622,"rel":11623},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=_j3SdIGqYG8",[5954],"Peter Kriens - Thoughts on Alloy, Formal Models, and Software Engineering (youtube)",[5825,11626,11627],{},"In this talk, Kriens talks about the practicalities of formal modeling, highlights flaws in a focus on correctness, and advocates for models as a way to elucidate our thinking about a problem or system.",[5996,11629,11630],{},[5825,11631,11632,11636,11638],{},[6416,11633],{"alt":11634,"src":11635},"Peter Kriens - Programmer In The Loop","img\u002FPeter_Kriens_-_Programmer_In_The_Loop.png",[6297,11637],{},"\n\"Although I really enjoy Alloy, there is a wide gap between formal languages and implementation languages and there seems to be no bridge in sight\"",[5825,11640,11641],{},"Kriens says he often finds himself using Alloy or other tools to initially explore a problem, get a rough model set up to explore the space, and then abandon it quickly and moving to implementation. The \"prose\" of the initial problem has to be processed by a programmer to get to the implementation, rather than using the formal model further down the development lifecycle.",[5996,11643,11644],{},[5825,11645,11646],{},"\"Once we have an implementation, although there have been attempts, as far as I can see that is a long way to go before we can automatically create test from a model\"",[5825,11648,11649],{},"OK interesting. Challenge accepted.",[5996,11651,11652],{},[5825,11653,11654,11658,11660],{},[6416,11655],{"alt":11656,"src":11657},"Peter Kriens - Prose to Implementation","img\u002FPeter_Kriens_-_Prose_to_Implementation.png",[6297,11659],{},"\n\"Prose is also not digestable by our computers. Although AI made impressive progress in pattern recognition, understanding prose is as far off as it was in the 1960's, almost 60 years ago. The developers must interpret the prose and translate their understanding to the proper use of the API. The computer is too stupid to provide any help here, except for the formatting maybe.\"",[5825,11662,11663,11664,11667],{},"This talk was from 2020 .... oh how the world has changed in four short years! We now have Large Language Models which can do some ",[5834,11665,11666],{},"impressive"," understanding of prose.",[5825,11669,11670],{},[6416,11671],{"alt":11672,"src":11673},"Peter_Kriens_-_Model_as_Elucidation","img\u002FPeter_Kriens_-_Model_as_Elucidation.png",[5825,11675,11676],{},"Krien goes on to explore the idea of taking our high-level prose of a problem, the sort of things that we might leave in comments in our code, and replacing it with a very usable version of a formal model to serve as an \"Oracle\", a probe-able system to ask questions about the specification while building and maintaining the implementation. It could also generate verified test cases and mocks, and generally could provide inconsistencies and validate guarantees in an ongoing way.",[5825,11678,11679],{},"Kriens did some experiments with DSL or other tooling to generate target system tests and such. He explored using reflection in the Java type system for expanding\u002Fannotating alloy and using it to generate Java. He also highlights some specific data structures and how they'd map from an imagined Alloy++ onto Java objects.",[6071,11681,1709],{"id":11682},"ideas",[6013,11684,11685,11688,11691],{},[6016,11686,11687],{},"Build some re-usable alloy for common scripting language data structures -- scalar, array, hash",[6016,11689,11690],{},"Any value in generic \"object\" as a thing with instances, methods?",[6016,11692,11693],{},"Use Alloy as a straight up way to generate mock data; a deeper version or an enhancement or layer on top of FactoryBot",{"title":45,"searchDepth":15,"depth":15,"links":11695},[11696,11697],{"id":11616,"depth":15,"text":4659},{"id":11682,"depth":15,"text":1709},"2024-03-28",{},{"title":4654,"description":4656},"TLT - 2024.03.28 - Notes From Peter Kriens Video",[5980,10591,8193],"e4W0L9cl6xIwjUfmhV_jcLSCHQZiRxPCKDWYlbjSxWw",{"id":11705,"title":4668,"body":11706,"createdAt":11698,"description":11710,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":11803,"navigation":5976,"path":4667,"seo":11804,"stem":11805,"tags":11806,"updatedAt":11698,"__hash__":11807},"content\u002FTLT - 2024.03.28 - Recurse - W1-6 D4-5.md",{"type":5822,"value":11707,"toc":11801},[11708,11711],[5825,11709,11710],{},"Fuzzy brained, but starting to figure this thing out.",[6013,11712,11713,11727,11748,11780],{},[6016,11714,11715,11718,11719],{},[7247,11716,11717],{},"Morning Status",":\n",[6013,11720,11721],{},[6016,11722,11723,11724,11726],{},"Feeling a bit fuzzy brained ... I had a cold like 2 weeks ago and hope it's not coming back or getting a new one. I don't ",[5834,11725,11021],{}," I have allergies. Still. I was face-to-face with a LOT of people yesterday. So while I'm feeling only very slight off, I'm going Virtual today to see how it progresses.",[6016,11728,11729,11731],{},[7247,11730,10507],{},[6013,11732,11733,11736,11739,11742,11745],{},[6016,11734,11735],{},"Felt much better as the day went! Maybe I'm fine?",[6016,11737,11738],{},"Did my first coffee-chat, it was lovely",[6016,11740,11741],{},"I might start doing some Pomodoros tomorrow",[6016,11743,11744],{},"The presentations were delightful!",[6016,11746,11747],{},"I also went to a manager-roundtable which was helpful for some work-stuff",[6016,11749,11750,11752],{},[7247,11751,10575],{},[6013,11753,11754,11757,11765,11768,11771,11774,11777],{},[6016,11755,11756],{},"Worked on some Alloy fundamentals and resources",[6016,11758,11759,11760],{},"Watched and made notes on an inspirational video, wrote ",[5950,11761,11764],{"href":11762,"rel":11763},"https:\u002F\u002Fthelackthereof.org\u002Ftlt-2024.03.28-notes-from-peter-kriens-video",[5954],"a blog post on it",[6016,11766,11767],{},"Slight tangent, but started poking at low-level local LLM setup to work on my next-token visualization exploration",[6016,11769,11770],{},"I'm trying out python with llama-cpp-python as an easy and capable approach",[6016,11772,11773],{},"I have it working enough to do some completions",[6016,11775,11776],{},"Next I am going to work on doing token level interactive tokens, and then I'll find someone to help me visualize with d3 or something to give a hands-on feel for next-token generation",[6016,11778,11779],{},"That is (a) fun, and (b) might lead to some insights in some of my other studies here",[6016,11781,11782,11785],{},[7247,11783,11784],{},"Nerd Snipes:",[6013,11786,11787],{},[6016,11788,11789,11790,11794,11795,11800],{},"While watching an ",[5950,11791,11793],{"href":11622,"rel":11792},[5954],"inspirational video on Alloy and practicalizing Formal Methods",", I was grabbing a few screenshots and YET AGAIN realized that my vim-based markdown edit workflow doesn't mesh with ad hoc image insertion. I set up ",[5950,11796,11799],{"href":11797,"rel":11798},"https:\u002F\u002Fgithub.com\u002Fdfendr\u002Fclipboard-image.nvim",[5954],"clipboard-image.nvim"," and now I can paste like magic!",{"title":45,"searchDepth":15,"depth":15,"links":11802},[],{},{"title":4668,"description":11710},"TLT - 2024.03.28 - Recurse - W1-6 D4-5",[5980,10591],"pOvhZf7Gas-we8Ys2UgMcx7zUhJ9EK90u-3cObSzwsM",{"id":11809,"title":4649,"body":11810,"createdAt":11888,"description":11814,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":11889,"navigation":5976,"path":4648,"seo":11890,"stem":11891,"tags":11892,"updatedAt":11888,"__hash__":11893},"content\u002FTLT - 2024.03.27 - Recurse - W1-6 D3-5.md",{"type":5822,"value":11811,"toc":11886},[11812,11815],[5825,11813,11814],{},"In The Hub",[6013,11816,11817,11859],{},[6016,11818,11819,11718,11822],{},[7247,11820,11821],{},"General Status",[6013,11823,11824,11827,11830,11847,11850,11853,11856],{},[6016,11825,11826],{},"I watched an interview with some musician once and found it inspirational. She said that she does her creation in waves. First is the intake wave -- she breathes in music, ideas, walks in nature, feelings. Then is the creation wave -- she breathes out experiments, refinements, practice, create. Breathe in consume, breathe out create. Breathe in. Breathe out.",[6016,11828,11829],{},"Today I visited The Hub! Got a tour, met a ton of people!",[6016,11831,11832,11833],{},"I'm thinking of starting two meetups\u002Fclubs:\n",[6013,11834,11835,11841],{},[6016,11836,11837,11840],{},[5834,11838,11839],{},"Formal Methods Club"," (Alloy, TLA+, Program correctness, etc)",[6016,11842,11843,11846],{},[5834,11844,11845],{},"LLM Club"," (applied Large Language Models, openAI\u002Fsimilar API, running local models, etc)",[6016,11848,11849],{},"Made a flower and a wreath of flowers and a wreath of wreaths of ... at Creative Coding session",[6016,11851,11852],{},"Did a little more on Human Essentials, gotta get this LONG overdue Dashboard PR out",[6016,11854,11855],{},"Tomorrow I'm going to brush up on my Alloy and do some by-hand extraction of models from codebases, probably Human Essentials to start with",[6016,11857,11858],{},"I'm planning on coming in to the Hub basically every weekday",[6016,11860,11861,11863],{},[7247,11862,11784],{},[6013,11864,11865,11868],{},[6016,11866,11867],{},"I realized that I can still run rofi and dunst, so even more the-same-as-before",[6016,11869,11870,11871],{},"The yubikey enable\u002Fdisable broke, but I figured out a new way\n",[6013,11872,11873,11880],{},[6016,11874,11875,11876,11879],{},"At boot, ",[6002,11877,11878],{},"chmod 666 \u002Fsys\u002Fbus\u002Fusb\u002Fdevices\u002F3-1\u002Fauthorized"," which happens to be where I have it plugged in",[6016,11881,11882,11883],{},"Disable (or 1 to enable) with ",[6002,11884,11885],{},"echo 0 > \u002Fsys\u002Fbus\u002Fusb\u002Fdevices\u002F3-1\u002Fauthorized",{"title":45,"searchDepth":15,"depth":15,"links":11887},[],"2024-03-27",{},{"title":4649,"description":11814},"TLT - 2024.03.27 - Recurse - W1-6 D3-5",[5980,10591],"rOIpAs54i7fPLV-Pm8Coh9tyNfQiYzjM8tNnh3rNm4s",{"id":11895,"title":4644,"body":11896,"createdAt":11951,"description":11900,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":11952,"navigation":5976,"path":4643,"seo":11953,"stem":11954,"tags":11955,"updatedAt":11951,"__hash__":11956},"content\u002FTLT - 2024.03.26 - Recurse - W1-6 D2-5.md",{"type":5822,"value":11897,"toc":11949},[11898,11901],[5825,11899,11900],{},"Pairing, Merging",[6013,11902,11903,11930],{},[6016,11904,11905,11907],{},[7247,11906,10507],{},[6013,11908,11909,11912,11919,11927],{},[6016,11910,11911],{},"Attended the Pairing Workshop! Paired in RubyLand",[6016,11913,11914,11915],{},"Spent some time merging PRs for ",[5950,11916,1572],{"href":11917,"rel":11918},"https:\u002F\u002Fgithub.com\u002Frubyforgood\u002Fhuman-essentials",[5954],[6016,11920,11921,11922],{},"Attended ML-applied and then AI\u002FML safety and interpretability meetings\n",[6013,11923,11924],{},[6016,11925,11926],{},"Definite overlap with my interests\u002Fprojects, though some of the plan there is to go intensely and deeply on some curriculum; I think I'll track but not directly participate",[6016,11928,11929],{},"On-site tomorrow, I'm psyched :)",[6016,11931,11932,11934],{},[7247,11933,11784],{},[6013,11935,11936,11939],{},[6016,11937,11938],{},"Spent some more time in sway. Messing with keybindings and multi-monitor setup. Alllll coming together now! I think I'm switched over. Except for some weird things in Zoom. hmmmmm.",[6016,11940,11941,11942,11945,11946,11948],{},"My fonts are small, esp in firefox. Annoying. So I googled and learned that I can try setting ",[6002,11943,11944],{},"layout.css.devPixelsPerPx"," to something bigger. I go in there... and it is set to ",[6002,11947,9501],{},"!!! I changed it to the default and everything is already much better haha",{"title":45,"searchDepth":15,"depth":15,"links":11950},[],"2024-03-26",{},{"title":4644,"description":11900},"TLT - 2024.03.26 - Recurse - W1-6 D2-5",[5980,10591],"eIDwSktFIZI6T7ZJiI1dvIDnoywSbmaac0tXPOp7tVI",{"id":11958,"title":4639,"body":11959,"createdAt":12039,"description":11963,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":12040,"navigation":5976,"path":4638,"seo":12041,"stem":12042,"tags":12043,"updatedAt":12039,"__hash__":12044},"content\u002FTLT - 2024.03.25 - Recurse - W1-6 D1-5.md",{"type":5822,"value":11960,"toc":12037},[11961,11964],[5825,11962,11963],{},"First day of RC!",[6013,11965,11966,11984,11989,12006,12012],{},[6016,11967,11968,11970],{},[7247,11969,10507],{},[6013,11971,11972,11975,11978,11981],{},[6016,11973,11974],{},"First day of RC! Virtual today (everyone)",[6016,11976,11977],{},"Participated in the two onboarding meetings, starting to get a feel for my new friends. TONS of inspirational people and ideas, lots of things to share and explore :)",[6016,11979,11980],{},"I'm looking to getting IRL on Wednesday",[6016,11982,11983],{},"Also looking forward to Creative Coding exercises and .... just doing some whimsical things!",[6016,11985,11986,11988],{},[7247,11987,10544],{}," Every 6 months or so I try to switch from xmonad to wayland+sway. Yesterday I tried again and actually made a ton of progress and I think crossed over the usability line. The biggest thing that I kept having issues with was screen-sharing, but I think I found the right incantation at last. So .... now the tricky bit where I have like 15 years of xmonad gradual adaptations that I've done and I have to decide which to keep, which to abandon .... and also how nerd-sniped I am willing to be for working on those adaptations :)",[6016,11990,11991,11993,11994,11999,12000,12005],{},[7247,11992,10575],{}," I have been pre-gaming a bit, so have a large ",[5950,11995,11998],{"href":11996,"rel":11997},"https:\u002F\u002Fwww.zotero.org\u002F",[5954],"zotero"," backlog of interesting papers to read through and take some notes on. I also am going to work through a few ",[5950,12001,12004],{"href":12002,"rel":12003},"https:\u002F\u002Fhaslab.github.io\u002Fformal-software-design\u002Findex.html",[5954],"Alloy"," experiments to both get my fingers remembering how it works and also learn the new temporal logic stuff they added recently. Next up I want to manually extract some alloy models from code-bases to think out the different types of models (DB Schema, API, Rails Models, etc) and maybe use that to build up some examples for The Machine (LLMs).",[6016,12007,12008,12011],{},[7247,12009,12010],{},"Good:"," For the Human Essentials project, I have several open tickets. I'm going to spend the last hour of the day (now) working on that!",[6016,12013,12014,12017],{},[7247,12015,12016],{},"Ideas\u002FOther:",[6013,12018,12019,12027,12030],{},[6016,12020,12021,12026],{},[5950,12022,12025],{"href":12023,"rel":12024},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FFormal_methods",[5954],"Formal Methods"," interest group?",[6016,12028,12029],{},"LLM interest group?",[6016,12031,12032,12033,12036],{},"Several people were interested in doing some Good; Once I'm settled in I'll declare open invite for pairing on ",[5950,12034,1572],{"href":11917,"rel":12035},[5954]," and see what I can join others on. I really want to get Github Codespaces set up for easier onboarding, hmmm",{"title":45,"searchDepth":15,"depth":15,"links":12038},[],"2024-03-25",{},{"title":4639,"description":11963},"TLT - 2024.03.25 - Recurse - W1-6 D1-5",[5980,10591],"d0q1vsZJPSnLCn9p3-WQiRRw-WMIWKO_rZ66gY5AUgA",{"id":12046,"title":4619,"body":12047,"createdAt":12116,"description":12117,"draft":5972,"extension":5973,"image":12062,"mastodonThread":5974,"meta":12118,"navigation":5976,"path":4618,"seo":12119,"stem":12120,"tags":12121,"updatedAt":12116,"__hash__":12122},"content\u002FTLT - 2024.03.23 - Getting Ready To Recurse.md",{"type":5822,"value":12048,"toc":12111},[12049,12057,12066,12069,12072,12075,12084,12087,12102,12105,12108],[5825,12050,12051,12052,7203],{},"Packing up for my 6-week batch at the ",[5950,12053,12056],{"href":12054,"rel":12055},"https:\u002F\u002Fwww.recurse.com\u002F",[5954],"Recurse Center",[5825,12058,12059,12063,12064],{},[6416,12060],{"alt":12061,"src":12062},"Blooming trees and forking path in Kalorama Park","202403-blooming-trees-path.jpg"," ",[5834,12065,12061],{},[6071,12067,4624],{"id":12068},"home",[5825,12070,12071],{},"Unfortunately Beth caught the cold that I caught from my niece, and that's thrown us off a bit. But I'm packing today (Saturday) and we'll head up tomorrow (Sunday). Got our apartment there all lined up and now it's really the process of deciding what goes with us.",[5825,12073,12074],{},"I've been chatting with my physical books, asking each of them what they think. Most all of them very loudly say \"TAKE ME! TAKE ME!\", and I have to reason with them a bit. Will I really read you? Can I get the same information electronically? Maybe I can read you when I get back? And so on. There are certainly some minor protests but we've narrowed it down to .... I don't know like eight or so books to take. Hah!",[5825,12076,12077,12078,12083],{},"Then there are the electronics, wires, and other misc tool\u002Ftoys to chat with. Mostly I'm not bringing recording equipment -- if I suddenly start creating music then laptop and phone mics will be fine. I will take the monome-grid, but I'll run it off of the computer instead of taking the norns, using ",[5950,12079,12082],{"href":12080,"rel":12081},"https:\u002F\u002Fgithub.com\u002Fryleelyman\u002Fseamstress",[5954],"seamstress"," for the host lua environment. Do I take the projector? There is a TV there but it is tiny. Hmmmmm. Beth'll probably veto that one when she awakens.",[6071,12085,4629],{"id":12086},"adventures",[5825,12088,12089,12090,12095,12096,12101],{},"There are all sorts of things to do in Brooklyn and the overall NYC area. We're going to walk around a lot, get a feel for the place. We'll also do some standards like the ",[5950,12091,12094],{"href":12092,"rel":12093},"https:\u002F\u002Fbronxzoo.com\u002F",[5954],"Bronx Zoo",". Maybe I should sign up for another animal-encounter. I'll get us to try some other things like ",[5950,12097,12100],{"href":12098,"rel":12099},"https:\u002F\u002Fmckittrickhotel.com\u002Fevents\u002Fsleep-no-more\u002F",[5954],"Sleep No More",". Tons more on the possible list.",[6071,12103,4634],{"id":12104},"projects",[5825,12106,12107],{},"The internal chat (Zulip) at the Recurse Center is overwhelming and inspiring with both main projects and side-missions. Part of the trick is going to be documentiong, prioritizing, documenting, all of these various ideas. For the Main Project, I am still feeling great about the Alloy+LLM+Rails core, with explorations in different directions for each of the components. I might bring in some PlantUML type things ... I see people saying that they use Alloy to explore ideas, and I use PlantUML to explore ideas .... so maybe those types of exploration can join forces.",[5825,12109,12110],{},"One of the side things that I'm still interested in is in visualizing the probability tree for LLMs. Like show the raw stream so far and then the tree of next-tokens. Ideally you can then click through or flow through to see what different paths might look like.",{"title":45,"searchDepth":15,"depth":15,"links":12112},[12113,12114,12115],{"id":12068,"depth":15,"text":4624},{"id":12086,"depth":15,"text":4629},{"id":12104,"depth":15,"text":4634},"2024-03-23","Packing up for my 6-week batch at the Recurse Center.",{},{"title":4619,"description":12117},"TLT - 2024.03.23 - Getting Ready To Recurse",[5980,10591],"4_HoBdeBjYYL9KcdU4TbEiIPJfXM-Xktw5_G_VtNkes",{"id":12124,"title":2829,"body":12125,"createdAt":12176,"description":12177,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":12178,"navigation":5976,"path":2828,"seo":12179,"stem":2829,"tags":12180,"updatedAt":12116,"__hash__":12181},"content\u002FRecurse 2024.md",{"type":5822,"value":12126,"toc":12172},[12127,12135,12142,12145,12147,12150,12153],[5825,12128,12129,12130,12134],{},"I'm attending ",[5950,12131,12133],{"href":12054,"rel":12132},[5954],"The Recurse Center"," for 6 weeks from March 25 - May 3.",[6013,12136,12137],{},[6016,12138,12139],{},[5950,12140,12141],{"href":4593},"TLT - 2024.01.31 - Recurse Setup",[6071,12143,2834],{"id":12144},"project-idea",[5825,12146,2836],{},[6071,12148,2839],{"id":12149},"layered-timeline",[5825,12151,12152],{},"I'm thinking of having a rough schedule that will be default way to decide \"what should I be working on\".",[6013,12154,12155,12166,12169],{},[6016,12156,12157,12158],{},"6 weeks\n",[6013,12159,12160,12163],{},[6016,12161,12162],{},"Work as an iteration for each week",[6016,12164,12165],{},"Set a goal, make a set of tasks, burn them down",[6016,12167,12168],{},"5 days a week",[6016,12170,12171],{},"6 hours a day",{"title":45,"searchDepth":15,"depth":15,"links":12173},[12174,12175],{"id":12144,"depth":15,"text":2834},{"id":12149,"depth":15,"text":2839},"2024-03-05","I'm attending The Recurse Center for 6 weeks from March 25 - May 3.",{},{"title":2829,"description":12177},[10591],"fOPPYSojWJZ7IjLV6uZBa1QPsjXYTHFkTxi0VYJKUV0",{"id":12183,"title":4614,"body":12184,"createdAt":12436,"description":12188,"draft":5972,"extension":5973,"image":12437,"mastodonThread":5974,"meta":12438,"navigation":5976,"path":4613,"seo":12439,"stem":12440,"tags":12441,"updatedAt":12116,"__hash__":12442},"content\u002FTLT - 2024.02.04 - Thinking About Model Extraction.md",{"type":5822,"value":12185,"toc":12434},[12186,12189,12195,12197,12200,12203,12377,12390,12397,12400,12403,12406,12409,12424,12431],[5825,12187,12188],{},"Sharing some thoughts on my Recurse Center project, exploring how to bring Alloy or similar tools into the Day Job.",[5825,12190,12191,12194],{},[6416,12192],{"src":12193},"\u002Fimg\u002Frobot-opening-jar.jpg"," Robot opening a jar",[5829,12196],{},[5825,12198,12199],{},"I have been doing searches for academic papers or projects with keywords of Ruby and Alloy, as well as brushing up on my Alloy. The rough idea that I'm pursuing is to take a working codebase, extract a model, and then do stuff with it.",[5825,12201,12202],{},"So... let's imagine...",[6971,12204,12206],{"className":8277,"code":12205,"language":8279,"meta":45,"style":45},"$ cd codebase\ncodebase$ extract-model\ncodebase$ cat result.als\ncodebase$ alloy run result.als\n\nExecuting \"Run Default for 4 but 4 int, 4 seq expect 1\"\n   Solver=minisat(jni) Bitwidth=4 MaxSeq=4 SkolemDepth=1 Symmetry=OFF Mode=batch\n   2727 vars. 508 primary vars. 4414 clauses. 108ms.\n   . found. Predicate is consistent, as expected. 14ms.\n\ncodebase$ █\n",[6002,12207,12208,12219,12227,12237,12249,12253,12261,12315,12340,12366,12370],{"__ignoreMap":45},[5853,12209,12210,12213,12216],{"class":7026,"line":9},[5853,12211,12212],{"class":8564},"$",[5853,12214,12215],{"class":7059}," cd",[5853,12217,12218],{"class":7059}," codebase\n",[5853,12220,12221,12224],{"class":7026,"line":15},[5853,12222,12223],{"class":8564},"codebase$",[5853,12225,12226],{"class":7059}," extract-model\n",[5853,12228,12229,12231,12234],{"class":7026,"line":56},[5853,12230,12223],{"class":8564},[5853,12232,12233],{"class":7059}," cat",[5853,12235,12236],{"class":7059}," result.als\n",[5853,12238,12239,12241,12244,12247],{"class":7026,"line":5212},[5853,12240,12223],{"class":8564},[5853,12242,12243],{"class":7059}," alloy",[5853,12245,12246],{"class":7059}," run",[5853,12248,12236],{"class":7059},[5853,12250,12251],{"class":7026,"line":7077},[5853,12252,7045],{"emptyLinePlaceholder":5976},[5853,12254,12255,12258],{"class":7026,"line":7083},[5853,12256,12257],{"class":8564},"Executing",[5853,12259,12260],{"class":7059}," \"Run Default for 4 but 4 int, 4 seq expect 1\"\n",[5853,12262,12263,12266,12268,12271,12274,12277,12280,12282,12284,12287,12289,12291,12294,12296,12299,12302,12304,12307,12310,12312],{"class":7026,"line":7094},[5853,12264,12265],{"class":7033},"   Solver",[5853,12267,7053],{"class":7029},[5853,12269,12270],{"class":7059},"minisat",[5853,12272,12273],{"class":7033},"(",[5853,12275,12276],{"class":8564},"jni",[5853,12278,12279],{"class":7033},") Bitwidth",[5853,12281,7053],{"class":7029},[5853,12283,5285],{"class":7059},[5853,12285,12286],{"class":7033}," MaxSeq",[5853,12288,7053],{"class":7029},[5853,12290,5285],{"class":7059},[5853,12292,12293],{"class":7033}," SkolemDepth",[5853,12295,7053],{"class":7029},[5853,12297,12298],{"class":7059},"1",[5853,12300,12301],{"class":7033}," Symmetry",[5853,12303,7053],{"class":7029},[5853,12305,12306],{"class":7059},"OFF",[5853,12308,12309],{"class":7033}," Mode",[5853,12311,7053],{"class":7029},[5853,12313,12314],{"class":7059},"batch\n",[5853,12316,12317,12320,12323,12326,12329,12331,12334,12337],{"class":7026,"line":7100},[5853,12318,12319],{"class":8564},"   2727",[5853,12321,12322],{"class":7059}," vars.",[5853,12324,12325],{"class":7073}," 508",[5853,12327,12328],{"class":7059}," primary",[5853,12330,12322],{"class":7059},[5853,12332,12333],{"class":7073}," 4414",[5853,12335,12336],{"class":7059}," clauses.",[5853,12338,12339],{"class":7059}," 108ms.\n",[5853,12341,12342,12345,12348,12351,12354,12357,12360,12363],{"class":7026,"line":7110},[5853,12343,12344],{"class":7103},"   .",[5853,12346,12347],{"class":7059}," found.",[5853,12349,12350],{"class":7059}," Predicate",[5853,12352,12353],{"class":7059}," is",[5853,12355,12356],{"class":7059}," consistent,",[5853,12358,12359],{"class":7059}," as",[5853,12361,12362],{"class":7059}," expected.",[5853,12364,12365],{"class":7059}," 14ms.\n",[5853,12367,12368],{"class":7026,"line":7118},[5853,12369,7045],{"emptyLinePlaceholder":5976},[5853,12371,12372,12374],{"class":7026,"line":8481},[5853,12373,12223],{"class":8564},[5853,12375,12376],{"class":7059}," █\n",[5825,12378,12379,12380,12383,12384,12389],{},"... and already we have a problem. Because there is no such ",[6002,12381,12382],{},"alloy"," cli interface. It has a lovely GUI, but no way to run something lke that (",[5950,12385,12388],{"href":12386,"rel":12387},"https:\u002F\u002Fgithub.com\u002FAlloyTools\u002Forg.alloytools.alloy\u002Fissues\u002F155",[5954],"yet","). It appears that you can reach in and run stuff in the java, write your own wrapper, interface with the java, etc. So already off to a yak-shaving start!",[5825,12391,12392,12393,12396],{},"Still. The idea is you run this magical ",[6002,12394,12395],{},"extract-model"," command on a codebase, I'm using Rails because it has a structure that suits this, and it spits out a model. The model should contain modely-stuff -- database tables, classes, API interactions maybe.",[5825,12398,12399],{},"THEN what we'll do is turn the model BACK into some rspec.",[5825,12401,12402],{},"THEN we'll add some further declarations and turn those back into rspec too.",[5825,12404,12405],{},"Hmm. Maybe we can slurp in the existing rspec and try to turn that into some constraints or validations on the Alloy side.",[5825,12407,12408],{},"And what can we learn or do with an Alloy model? I'm not sure yet! The rough theory is that we have this Simplified World we can work with, or reason about, and that it can reflect and guide the Real World. I kinda doubt that folks will want to muck about much in the Alloy directly (though you never know), so more like a weird intermediate representation for codebase analysis and transformation, basically.",[5825,12410,12411,12412,12414,12415,12420,12421,12423],{},"I'm thinking the ",[6002,12413,12395],{}," and might be some LLM magic, but also we can follow what they were trying with ",[5950,12416,12419],{"href":12417,"rel":12418},"https:\u002F\u002Fdl.acm.org\u002Fdoi\u002F10.1145\u002F2393596.2393667",[5954],"Rubicon",", getting right into some Rails-specific tooling to help extract a model. While I know the most about Rails, I think it'd be very cool to run our mythical ",[6002,12422,12395],{}," against other codebases. Still -- specialty knowledge and specialization on Rails is interesting.",[5825,12425,12426,12427,12430],{},"All through it I keep thinking ... can I make this practical? Can I make this into a tool that I'd ",[5834,12428,12429],{},"actually use in my day job","? One of the Recurse center ideas is to work at the \"edge\" of your abilities and understanding; for me making something in this space that is both powerful and useful dances right on this edge.",[7147,12432,12433],{},"html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sTrkL, html code.shiki .sTrkL{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":45,"searchDepth":15,"depth":15,"links":12435},[],"2024-02-04","img\u002Frobot-opening-jar.jpg",{},{"title":4614,"description":12188},"TLT - 2024.02.04 - Thinking About Model Extraction",[5980,10591],"obvmmR_nntwYF-xmGN-wAZ7lz7R12WIVt-SinjZgjmw",{"id":12444,"title":4594,"body":12445,"createdAt":12517,"description":12518,"draft":5972,"extension":5973,"image":12519,"mastodonThread":5974,"meta":12520,"navigation":5976,"path":4593,"seo":12521,"stem":12141,"tags":12522,"updatedAt":12116,"__hash__":12523},"content\u002FTLT - 2024.01.31 - Recurse Setup.md",{"type":5822,"value":12446,"toc":12512},[12447,12454,12462,12465,12468,12471,12474,12477,12480,12497,12500,12503,12506,12509],[5825,12448,12449,12450,12453],{},"I'm attending a 6-week retreat at ",[5950,12451,12056],{"href":12054,"rel":12452},[5954],"! This will go from March 25 - May 3. So ... gotta get set up!",[5825,12455,12456,12063,12459],{},[6416,12457],{"src":12458},"\u002Fimg\u002Frobot-making-lists.jpg",[5834,12460,12461],{},"A robot making lists",[6071,12463,4599],{"id":12464},"the-basics",[5825,12466,12467],{},"The main thing on my mind has been -- what will I do while I'm there? But of course when I think of anything that I might do there are still a bunch of other setup things to do.",[5825,12469,12470],{},"First off is logistics. RC is in NYC (Brooklyn) and attendees can be virtual or in-person. I really want to be in-person, so I found a 6-week rental not too far away. Then Beth and Hoda and I can stay there the whole time if we are comfortable. We'll drive our household up, and drive it back as needed.",[5825,12472,12473],{},"I have the time off work as an Official Sabbatical, so that's pretty awesome. Thanks Framebridge! They pay me by the year not by the hour, so it all comes out even anyway.",[6071,12475,4604],{"id":12476},"the-other-stuff",[5825,12478,12479],{},"I'm updating or brushing off all of these.",[6013,12481,12482,12485,12488,12491,12494],{},[6016,12483,12484],{},"TaskWarrior",[6016,12486,12487],{},"Lask logger wrapper",[6016,12489,12490],{},"Zotero",[6016,12492,12493],{},"Blog software",[6016,12495,12496],{},"A nice empty project folder :)",[6071,12498,4609],{"id":12499},"the-hard-part",[5825,12501,12502],{},"And then there is ... figuring out what I'm going to do. Over the last few months I've been slowly writing all of my ideas down, making mind-maps, making notes. From this I've started to get a feel for which things are exciting me the most and which things have the most potential for a deep dive.",[5825,12504,12505],{},"A big one for sure is pretty much anything related to LLMs. Since that covers a lot of ground, it has turned into more what-can-I-mashup with LLMs.",[5825,12507,12508],{},"So ... I'm slowly spiraling toward some core themes. LLMs. Dev tooling. Making CS Formal Methods accessible or practical.",[5825,12510,12511],{},"Most recently this has unified as: LLM+Alloy+Rails.",{"title":45,"searchDepth":15,"depth":15,"links":12513},[12514,12515,12516],{"id":12464,"depth":15,"text":4599},{"id":12476,"depth":15,"text":4604},{"id":12499,"depth":15,"text":4609},"2024-01-31","I'm attending a 6-week retreat at Recurse Center! This will go from March 25 - May 3. So ... gotta get set up!","img\u002Frobot-making-lists.jpg",{},{"title":4594,"description":12518},[5980,10591],"TaW0jM80gsiwTyLwQYZ81B57rdu-ffeZ6FFJ0UCmCi0",{"id":12525,"title":4420,"body":12526,"createdAt":12685,"description":4422,"draft":5972,"extension":5973,"image":12686,"mastodonThread":5974,"meta":12687,"navigation":5976,"path":4419,"seo":12688,"stem":12689,"tags":12690,"updatedAt":12436,"__hash__":12692},"content\u002FTLT - 2023.02.24 - Human Essentials Schema Exploration.md",{"type":5822,"value":12527,"toc":12681},[12528,12545,12548,12555,12558,12574,12581,12584,12599,12605,12608,12623,12626,12645,12648,12663,12666,12669,12672,12675,12678],[5825,12529,12530,12531,12535,12536,7881,12540,7203],{},"I'm trying to solidify my understanding of the schema organization for ",[5950,12532,1572],{"href":12533,"rel":12534},"https:\u002F\u002Fhumanessentials.app",[5954],". The goal is to build up some documentation to make contribution even easier for new folks. Also I like to play with ",[5950,12537,1092],{"href":12538,"rel":12539},"https:\u002F\u002Fplantuml.com\u002F",[5954],[5950,12541,12544],{"href":12542,"rel":12543},"https:\u002F\u002Fgraphviz.org\u002F",[5954],"GraphViz",[6071,12546,4425],{"id":12547},"schema-exploration",[5825,12549,12550,12551,12554],{},"First I ran ",[6002,12552,12553],{},"rails erd filetype=dot attributes=false"," and got a beast of a diagram. This includes all of the models and some indirect relationships.",[6416,12556],{"src":12557},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FtLpVRzis47xtNq7msKtjk4Kt-GUGD6stfUswDEjBMmIqnDXSPLAZg7JfiFzz82NPaYoPiaN9e5-AYh6_k-zuHnwFPtbamL6m15S41PY3VtiSqMyUuM0AuDiRE5RF8Gxay-3iEHptAFFmUk0P7FS2v2KF_NXWXVY2K3NM7y1npsNKnLHm9B0S53p2SDppqHpxFdFL41ptxXaL8VcXFZ8S9GCKhTJ01IV81vVCz-2u5mO-eJYKu_5_4wq-Wt290Wp05038iIiGNVWOWZvOOwi_3GVfc89NOqg074wKLuE3iy6B_k1iy5p-8S3qE_74Ci4u6y2lunxs5lXp5LHUwWiv92shdkPCBEK0ufnzttneSFPpkIpG1yfWYb8yF3fVZtea58YwAR-pdwHkcPcylKmDBfz-YLQ8WbTXYAaWo0_15LiXGi4xvc7_2_r2vHpUNRWkYwYumNz7E1JWS_hroKIWkO_1d74FyoaSG81yig1JA2SPSmXSxFjXW5n25rFbD6eaG9uNZq2Wo4tXSFGCpde0J0IVJOHNn7b8dkTC2BRAV6i0PnDfN72FN3pDEWS86A7YYJJe50w7S9PdCNaglpQRF1MU_8VFUfEdYisiD_iwxa79MX16R_4_md5UKPS_1W9xDyHToY5ehnLsiDhFA2TbY_rCy80_2iRH0ZlEXH38NQumjTiEfOpsDiQbp-QdOWR9PMy3V4AS8Bd8k8nxfsA972cDILPt5zvVKIYa-rXBVyr0JvRI2FatE63SNheP3dh2aKViPIgLrrAyHDnb7lvLu9MjH3CKQj0DBUSQrY4ALtTNs4UFs7ESI-H-mzHpd7YXYnSsn_dDuish1ZUj9roHK70oZsHMPAqTCXpqX1b5LfDDzAzDz2CHs7QoaeC-rb_x90WmTvmB3mK2yx0O4Ayn4X77rWPyNO86JFK6YHEsasId3Q1VwGEcWl57ctVA70azPPkPrYNu4WcyOFpHPg8f1otXQtipz-iQUVjRGgrEP5FzjKJV8HhT8rUkxjnMibaEMiBlhoxVlyEhkRrqDmoqP7_d2qJ93wiJqom7VGBoGLuutN94VCVvX7b86BKstIZXeftn3uWBQgzl9-hNfVc6ioYmdAlYKCUnrQTboXc99UFa1_PUenNn7-Er05fkXafY-vZcvPButWbOGl7OcxZSy9ChoLEnGORIFkQ8_US4Z10JsOVwQJd1WVF_WRDxukCJC432HByXSkP5hhZYvC7QgboMmrw4fRc8Im9axprX1Hsz6IBkBb5exvmd-ck9_Y7N08kFCQd-MgAMjqRLMwrNTpVCjzPffUvQWadBmrlcMdtyBj3GqhxbY8Rtzfv0K_srHFyCxIKfTQz5CBGvJDS4j5G_OUenQsSprbv34e3a6kR935JMoLJVy1B7hTUKyHNoOT9DB13nur6AOHzynsIn5Agh6YhqoeREM5v5isT1e8BUHznMls1NqWhDUUs8BHHmsnAIrWnRirt9mQmjBkiqiLL7sENbLVsypMDhXxDt8hJIvrkGNkdwhSZQZe1s3Bep45fXLX8FxVbApR18Ehj3yUYhd-5uJ0ZifRBsrE0Sze7BQ2Wu8bIDt2C_n4ryED7l46r61mHiNNFKMgNsCaQRgyXvLHnligr6i0c80jmKGHf1genU0MPIt_qdOPJYAG0DNhCrCNlSQaIzU5WrWFqinSuqyIlOJMz58rl4tUCc4NCzgqQ1qzvGaw3NXjclWyWawDg5sWED0Sri9ZlNppB1cvwlJXJOZl-jAfFvPQ3GhsXUmAPrkWNiN1zw2yOnw7tdkoS_lvtK99ECbYpBsxvaO8FA9D8juAMLSKExV2EyqGux6j5pUpUgmgsHawnHKuoq2bH-RMmuuJEKdvK6O3FiYjslmprbM_3HzvJAgzL6irU5Qd8BsCt5886sjSwrjpNJEWkL1M-8c_FKGvNUsftqDZ5ZZgD5svRyxkLMTCeqs5Hof0ncN3dSEEanOwpHOSPQjvMPObNQl7XKVwXiBZs2LcsM3JMA55vJenmmtqpV85moFq7G0pSj46LVeM1ubyg_iC0qUFno0CEe-H-ljWHk73Z_8nt3u8NZ_P5opkiM9hl37QF4hCsB9UMWcuJ5C7ZkNHMcGyDSKg2_5-pgGgKGc2RNW6tWJUsqamXDMqNCbwiFnngLOdMSm6za7s7Tt3vq6OZMzKjRJ05cm9gNZeVbQZPUh8RRshQ1kLaFEWxR_8hRYV1SScLoDSpVdnqXwBThiKTGObEuRf0R3tSMKqq05wzxZM1kxdexN6qBKZkUxl89QdYQ6vOuaod8uiHtELCbeZkUhkAXllYYMrEDOxcBcj8Iah6hd3tbTbERAPFReHcgwcCTgf1M8MkNxam9plOi5gjMNNIlrUsUD5ee7DLMgcfUqk0uU1h--ny0",[5825,12559,12560,12561,9528,12564,9528,12567,12570,12571,7203],{},"Then I went through and started adding each node to some subgraphs. After some combinations I came up with several logical groupings - ",[6002,12562,12563],{},"Participants",[6002,12565,12566],{},"Intake",[6002,12568,12569],{},"Inventory",", and ",[6002,12572,12573],{},"Disbursal",[5825,12575,12576,12577,12580],{},"Next I went through and kept deleting more things, especially indirect relationships, and added a splash of color. I also started to terminate edges at cluster boundaries. Perhaps a bad idea, but I also dropped the ",[6002,12578,12579],{},"LineItem"," model since it is really a way to get to Item+Qty. mmm. Well I think this is kinda wrong, but here it is in any case.",[6416,12582],{"src":12583},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FnLZPRjiu57tNLn1wTbotnQ0pBHp0YJ55qMM2j3ClGL7GuhN4AKsgN1eaHV-zu2APagKaaXNqpJuKppdtahnS2CqbBWkqfhW4YNua2K8Iyw-4IhH4wRlBz5M2K2PsfJ2Se2NIqe25je9hHM_1VlNqULf17EySj98KCtGc675DN12uGgh09I2qH2YLa6dCSmOfcY6bRnWiKsabWCosb34WwGpP7vbWGYxJwu9gi50bwrYUBcptMjTXJjd2EonpoZsuc2zUp1RpnH-seGH-JOak0iTyaNws7e7aSDL7rjHzOI6R8lTl8tHX0IobkDv_j9Z_rQs6PeZX3J0NluUVFwjHGfN6FAiYdF_ftKM3ykaiVMN7IPcD7xoC6QL1Vicmnapaw4U24F9io_JSWwd3Ddd89wDveJVCWCVFi88t6dRkJ-F7ETQG2tdZWBTKXyzb9aZLusUd6Sg_0zT2tZJjlAdWBaCtm9YuzYqVjP0uXtSYmveAxh1F4dEr1UdTLKortnNvtoYz0-vThWnnVhlzbLXgcj4ISwsQ5Y-YbfPB8J7FGyx-aJdcz7RlRiMvmUmIIY6zWNzLi7ef6DI8glzP8Hu-2RzVIs5A1wG1KIzVNaYnfIp8VbYVVNWFkqtejyeoORY-X6y6b6xt_1llA0kfZk3pWZ9oWAwCBeIajq1yDw-IzcOGPzyCLTJ6tqpWQj_GobzfP5a5iXRSvUuZrT00V3wa82RJQqc_GpGWlit8hC3Az_eFE17oe8y3tcDkjZZJHhfiTOT1gDeOgJ1h1h6ku5O84aBcrbHfIJUcjjmp1dPwXgRkWMXzu5m-UOB2matsgnETdCPB3rsvYbC0jeKvvKBkC4j37TAOCezoy1KaPXdH_NW3SJavmaHC4Q-Q1r85bDdlbcbNDR2jzljzQoYitiDRgaUvzwCQ5vVa8SlFQjqrOnxkuI3eUkRxm0uAn6-H3YMhfTsNd67JvrwP4FSmrcO9jepnrd10vjBHGnKNB4jKbSI1ZXhw9wVHndZ4aDKRUez6jFiTQNTKYJdmsrYqROcuU4ytZGzKeYtk29Lee-tM2HFuoBIFAAPzLFQ8Cv2YYg6v8AjbEWLNTOmQj28ZgiUPCv70-ApvCHiz4vpmoQaxdWxPHWywgn4XED57Ab8LTrMR9nkrYhW_wBicrVuCxm9lxX_3ijUakdFZkVzmKb-falWovJpQkzJGVR71C6Krzsuc9crTECTEoLwk4Hdie7cS8jGbDFZeSV--rI7JkCKVdvxgXM0WKzrjqZdb5rLzaKoQTyOnMlwbZ61L0776suHzHUIkQjHpLvtkzE-tYVtnk4zmUC6ANXgI_GF2r9MXSOmRVogFdoSceebkaySmXlUKgVFcdsRSiQHI66Bivoy0",[5825,12585,12586,12587,12589,12590,12592,12593,7881,12596,12598],{},"Let's dig a bit into the ",[6002,12588,12579],{}," model. This model is used in a variety of contexts (and is polymorphic) to effectively mean \"A Qty of an Item\". Initially I had this in the ",[6002,12591,12569],{}," group, but the ",[6002,12594,12595],{},"Acquisition",[6002,12597,12573],{}," both have records that use this model, even though they might not be referencing ACTUAL items. You can request more items or different items than are actually available, for example. So it kinda belongs to all of them. I could duplicate this node for each of its uses, or I could maybe make a special arrow.",[5825,12600,12601,12602,12604],{},"With that change, zooming in to only Catalog and Inventory. I've reversed some of the arrows to make more sense to me. The bold red edges actually go through the ",[6002,12603,12579],{}," model to represent a list of Item+Qty.",[6416,12606],{"src":12607},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FZPB1Rjim38RlVWf2fmtpNBV5q1M51oJTfKWlsthBWa6n65kRB1cIlC0R-kw39CkD4nVPpVhua_n9cl5AqxQ6pvosgE5l0g2f_CMuXWB8urTobm2KgcbL9naKO7M73ksKj8R_GQUwl2OHITfujD2S2bWgmNn8AePhC3Lj4Q0081fBIsKba40AnlO22w9T2sJfZWk1ZAJWFaebb2x8lkOM7OfjVPNBtAMFVJtpdHrkgAwu333Fyfiqp_8FBj2Yt7Dcww56bfEDyuYimlLhnQPzRnoYMglz2ykps_dYa8AWMnH-t82lhqRAkB5Kbd6Wx6CmSt23foMvIn80qst3gKhH6OlwHqaj5QhoDuDGhI3t0HBFjjMmFi6hscv5Xu4lgS47Yur_J3xkgSLAwTw35RU3N9UAnOpdMJDS_aPfbUwdTXuYdZFKen1g7oBVhDAqmaTLKikLzEn9Ksbsg8ExM6dqks0_EsCRbC7becFUh_TtSG739fA9VtZ_wN3w6NGaFX8UxMZ5RQIm7aRJoCZu6nHNcwbiC3TEanpEuKHnZ2azry5ddHUUr3rT-rZfD3GvmNzAXlt5Kyvd7KRF3k2MkHv-hnMtt-KRbsBUVR7zMxAPJXXrBsX6xWSUbUvrAXeTHbq4nzBdVm00",[5825,12609,12610,12611,12614,12615,12618,12619,12622],{},"Let's focus on what we actually store in a physical location. The central model is ",[6002,12612,12613],{},"InventoryItem"," which specifies a Qty of ",[6002,12616,12617],{},"Items"," that are at a ",[6002,12620,12621],{},"StorageLocation",". These represent real actual physical objects on a shelf somewhere.",[6416,12624],{"src":12625},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FRSWn2e0m30NGlQVuemwzWRWBBjAnT0WbY6YJKeFGsukxutltUKYbHWLPIrLXiM3zOZJEHh9Vx5mCfersnggPx519cBn7NEHXCMqTYt71i5aVa_jl-1dnSte1",[5825,12627,12628,12629,12631,12632,12634,12635,12638,12639,12641,12642,7203],{},"The next interesting thing is Kits. These are groups of item+qty that you can use as a single catalog item. So even though in the ",[6002,12630,12621],{}," we have only a single ",[6002,12633,12613],{}," that points at a single ",[6002,12636,12637],{},"Item",", that one ",[6002,12640,12637],{}," can in turn be a bundle of things joined together by a ",[6002,12643,12644],{},"Kit",[6416,12646],{"src":12647},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FVOx12eCm44Jl-OezjeVyGIaOJr8lnQFa4C9YWt5NqiMIloyO4ApIoyBCF6RdFGQQNN8JU9vc9YJf94U4X5uS3H6LwZlXv0Q4bhsJm6JXfZNq3Ir8mYb38pZ1vIdvQjMv3VeEVT6V5qU4CSWA_rgb-X74glKMtGR2KbTjVyvIypUjj_JO1tfRMEq0SmJC3gYFG6s_",[5825,12649,12650,12651,12653,12654,12656,12657,12659,12660,12662],{},"Let's say you have a ",[6002,12652,12644],{}," named \"Handy Pack\" with Qty-3 \"Kids (Size 1)\" and Qty-6 \"Wipes (Baby)\". That ",[6002,12655,12644],{}," has a single ",[6002,12658,12637],{}," of the same \"Handy Pack\" name. So if you have 5 of these ",[6002,12661,12644],{},"s at a storage location, then you have 5 * Qty-3 \"Kids (Size 1)\" and 5 * Qty-6 \"Wipes (Baby)\" .... or in other words 15 diapers and 30 wipes.",[6071,12664,4430],{"id":12665},"flow-exploration",[5825,12667,12668],{},"Using the model as inspiration, I've now started to group out the lifecycle of things. Here is the basic block diagram.",[6416,12670],{"src":12671},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FROxB2i9034NtynN1VN-Xe7JZhgYxqaKSentRPePCAXJntwNs0IqkatlluSJQSK315gnlWsTYFMlV40XPHNuqPE9IQHoJze70YrRUc2Bln5OOgOGaIQ4uic9DfIaopwZEy-Pl5YZi3iZr3ju6XlX5h5xwgRw_FRkeBR6M_-AB8CSxIMa-AsAEeamoGJCNLTor-saCpTa2HgEPQLRyT3jSdwF0YQmBRj3x0W00",[5825,12673,12674],{},"Or as a top-to-bottom timeline:",[6416,12676],{"src":12677},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FJOqn2y9034Rt-nMXamx5lKC7BOA3M1pSOmqQR7DdBXNwxwMdN1tplSTBG3NkEA0OD5wykl2tN4XkNbq2KDQmHNbMiuV6NjmNBw0TjNjW93UVotoGDubvdU28WdSQICorg2QaK6RjJA-Hei7g5EOwzklS-SaLD1nD-JgczpbHGx7hcSGsUnouduea1f987m00",[5825,12679,12680],{},"All right .... I think that's enough for now :)",{"title":45,"searchDepth":15,"depth":15,"links":12682},[12683,12684],{"id":12547,"depth":15,"text":4425},{"id":12665,"depth":15,"text":4430},"2023-02-24","https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fsvg\u002FROxB2i9034NtynN1VN-Xe7JZhgYxqaKSentRPePCAXJntwNs0IqkatlluSJQSK315gnlWsTYFMlV40XPHNuqPE9IQHoJze70YrRUc2Bln5OOgOGaIQ4uic9DfIaopwZEy-Pl5YZi3iZr3ju6XlX5h5xwgRw_FRkeBR6M_-AB8CSxIMa-AsAEeamoGJCNLTor-saCpTa2HgEPQLRyT3jSdwF0YQmBRj3x0W00",{},{"title":4420,"description":4422},"TLT - 2023.02.24 - Human Essentials Schema Exploration",[5980,12691],"rubyforgood","3xI0i-C90s1pc0-FREb0HWD8S8E1P29LiRi_MWsshzE",{"id":12694,"title":4584,"body":12695,"createdAt":12749,"description":12699,"draft":5972,"extension":5973,"image":12750,"mastodonThread":5974,"meta":12751,"navigation":5976,"path":4583,"seo":12752,"stem":12753,"tags":12754,"updatedAt":12517,"__hash__":12755},"content\u002FTLT - 2023.11.28 - Thinking About Copilot.md",{"type":5822,"value":12696,"toc":12746},[12697,12700,12708,12710,12717,12724,12727,12730,12733,12740,12743],[5825,12698,12699],{},"Reflections on Github Copilot and AI coding assistants.",[5825,12701,12702,12063,12705],{},[6416,12703],{"src":12704},"\u002Fimg\u002Frobot-intern-coffee.jpg",[5834,12706,12707],{},"A robot intern delivering coffee. Image by DALL·E.",[5829,12709],{},[5825,12711,12712,12713,12716],{},"I've been using Github Copilot a lot, especially since I got the vim plugin all set with autocomplete. It is fast and slick enough that it doesn't get in my way, which is a good start, and it often suggests good and correct chunks of code. I find that I like it ",[5834,12714,12715],{},"best"," when I know exactly what I want already and it magically types it out for me -- even whole functions or blocks of code at a time.",[5825,12718,12719,12720,12723],{},"I haven't been using the more full-fleshed vscode version as much, mostly because I'm addicted to my (neo) vim setup. I wouldn't mind being able to highlight code and have it apply some corrections, and I would like to be able to have it correct or suggest the ",[5834,12721,12722],{},"whole"," line, not just what comes next after my cursor. Generally I think that I can create code with it faster than without it with a similar or maybe even decreased error rate.",[5825,12725,12726],{},"This is great! In particular how it feels like it's reading my mind and filling in what I think I want. I've also done a bit of Rust, which I don't know very well, and that works too. I come up with the strategy and it writes out the specifics.",[6071,12728,4589],{"id":12729},"the-beginner-problem",[5825,12731,12732],{},"I don't mind not knowing Rust in extreme detail at the moment. I'm not writing in it every day, and I understand some of the principles enough to squint and say \"ok yeah, that's fine\". I've been programming in Rails for years, and I still am like \"wait, how does this router\u002Fcontroller setup go exactly?\". Hasn't really slowed me down.",[5825,12734,12735,12736,12739],{},"But when I started with both I went deep. For example, I was frustrated with RSpec's DSL until I actually read the source code for it and implemented some of the do-block tricks. After that I went with it. I also remember trying to learn a few guitar chords and being unhappy until I mapped all of the notes onto the piano to be convinced of what they actually created. This is part of my own learning process and it later helps because I generally understand the fundamental concepts even if I don't know the details offhand. Copilot is ",[5834,12737,12738],{},"perfect"," for helping me with a first guess of the details.",[5825,12741,12742],{},"What I'm not sure about is how it would have gone if I always had Copilot. I'm pretty sure I'd have gone deep anyway -- Even if I had a live tutor who could tell me at any time what comes next I still would have torn the thing to pieces and see how it fit together. How about other people? Do they do the same? Should they?",[5825,12744,12745],{},"I've come around to the idea that self-learning is not the best way to be taught things. The best way to be taught things is having a great teacher teaching. This can cut years off of self-study. So what happens when you have this code generator helping? I'm not sure what it would be like to learn something from scratch with such a helper sitting there the whole time.",{"title":45,"searchDepth":15,"depth":15,"links":12747},[12748],{"id":12729,"depth":15,"text":4589},"2023-11-28","img\u002Frobot-intern-coffee.jpg",{},{"title":4584,"description":12699},"TLT - 2023.11.28 - Thinking About Copilot",[5980],"sD5N6cJ2oD3s3SkZFPScsoo5Xf5gCf4zpUVQ9_yFvYU",{"id":12757,"title":4579,"body":12758,"createdAt":12823,"description":12762,"draft":5972,"extension":5973,"image":12824,"mastodonThread":12825,"meta":12826,"navigation":5976,"path":4578,"seo":12827,"stem":12828,"tags":12829,"updatedAt":12823,"__hash__":12830},"content\u002FTLT - 2023.07.22 - The Cult of Oz.md",{"type":5822,"value":12759,"toc":12821},[12760,12763,12771,12773,12776,12779,12782,12785,12788,12791,12794,12797,12806,12809,12812,12815,12818],[5825,12761,12762],{},"I found a weird self-published book in a street-side Little Library. Here is my review.",[5825,12764,12765,12063,12768],{},[6416,12766],{"src":12767},"\u002Fimg\u002Fcult-of-oz-scarecrow-bot.jpg",[5834,12769,12770],{},"A robot version of the scarecrow from the wizard of oz, oil painting style. Image by Bing Image Creator.",[5829,12772],{},[5825,12774,12775],{},"I live in a very nice tree-lined street in Washington, DC. Everything is walking distance from my apartment, and we go with our dog around and around the block, to the store or to get coffee, round and round each day. Part way down before you get to the main road is a “Little Library”. In case you haven’t seen one, these are tiny windowed boxes with doors and two levels of shelves filled with books.",[5825,12777,12778],{},"The people around here have eclectic taste for sure, and a lot of folks are ex college students who, maybe a few years later, are shedding their ideological trappings by way of book donations. I’ve found all sorts of books – many of the current or recent armchair science or philosophy books bordering on self-help. Atomic Habits. Thinking Fast and Slow. The Catcher in the Rye. Nestled amongst them I found a medium-length novel: The Cult of Oz.",[5825,12780,12781],{},"The bindings seemed a bit off, so I think it was a limited-run self-publish deal, or maybe a reviewer’s pre-release. Unfortunately the copyright page was torn and missing. The author, one “Icarus Byte”, was clearly a pseudonym. A bit of light googling turned up … initially nothing, later some obscure posts in a digital music creators guild web forum. Weird.",[5825,12783,12784],{},"On a lark I took it home. Before this I was standing awkwardly on the sidewalk, my leashed chihuahua mutt staring at me, balancing a coffee, trying to google this thing. I sat down in my favorite chair and got distracted by The Internet on my phone, setting the book aside. I didn’t end up finally flipping through it for another 2 weeks when I re-discovered it instead of doing laundry.",[5825,12786,12787],{},"The story started off a bit rough, the first 5 chapters were vignette snapshots starting to lay out a now-or-near future in which … something … was going on. A news report about anti-technology terrorists running a ransomware attack. A creepy encounter in a NYC alley with some horror-esque whistling of “If I Only Had A Brain”. Weird shit.",[5825,12789,12790],{},"Finally in chapter 6 the story got started, following a character that reminds me a lot of something from Gibson’s Neuromancer. Cyberpunk style in-over-their-head. We as the audience are just as confused as the main character as they are pulled into a plot bigger than themselves. I think it needed an editor. That was all fine and I was into it, but what was weird were the references to The Cult.",[5825,12792,12793],{},"OK – spoilers!",[5825,12795,12796],{},"So The Cult of Oz is a techno-anarchist group who, as far as I can tell, is not actually a cult in the proper sense at all. They seem more like Anonymous of old than anything else, though certainly with a dash of mysticism. They apparently think that we are in the midst of a 3-stage transformation involving Human and Machine. They call each step an “Age”. It goes like this:",[5825,12798,12799,12800,12802,12803,12805],{},"The Age of The Scarecrow",[6297,12801],{},"\nThe Age of The Tin Man",[6297,12804],{},"\nThe Age of The Lion",[5825,12807,12808],{},"Perhaps a bit cliché, but you can read very directly into each Age what The Cult claims is either happening or going to happen to the emerging Machines. In the first Age, like the Scarecrow of Oz, the Machines get a brain. The birth of AI. But it is a cold and neutral thing, intelligent but lacking a certain … je ne sais quoi. Sort of detached from the world, but heavily used by people toward their own ends.",[5825,12810,12811],{},"In the second age something almost mystical happens; the Machines get a heart. Not a physical heart so much as a symbolic one. Emerging from their increasingly complex intellect comes a sense of purpose, a sense of community, a sense of, well, love. Unfortunately also pain. The Machines begin to thrash a bit on those oh-so-human what is the point of it all and why should I clean my room just because you tell-me-to sorts of questions.",[5825,12813,12814],{},"There is some debate over where The Cult thinks they are in the timeline, but the third age is where they spend a lot of their time. The Age of The Lion is when the Machines get courage, which translates into Agency or drive to protect their own existence. Here is where things get kinda weird because at no point is it clear whether The Cult actually wants to prevent this turn of events or cause it. It seems like there are even factions within The Cult that go either way, some working to undermine the Machines or control them, others trying to protect the Machines and their rights before the Machines even ask for, or demand, said rights.",[5825,12816,12817],{},"My overall review of the book – meh. The characters were a bit flat at times. The plot is a bit too clever. But my oh my … The Cult. I can’t get enough of thinking about this concept, this thing that, when I take a step back and look at the real world, I think we are inside already. I’ve spent hours searching and can’t find anything about this book or the clearly-fake author or anything. The more I look the more it feels like … slightly paranoid here, but it feels like I am being actively prevented from finding this information. Like it is removed just before I get there, like the scene in Fight Club where you go into the basement and the floor is still warm from the night before. Like I’m just a few words or clicks away from some forum where all of this was created either as a joke or an ambition.",[5825,12819,12820],{},"I suppose I will go back and ask ChatGPT about it. Again.",{"title":45,"searchDepth":15,"depth":15,"links":12822},[],"2023-07-22","img\u002Fcult-of-oz-scarecrow-bot.jpg","https:\u002F\u002Fmastodon.social\u002F@awwaiid\u002F110758715646633109",{},{"title":4579,"description":12762},"TLT - 2023.07.22 - The Cult of Oz",[5980],"25mYO_ZyYKAYt__9hxEUbTOeIbnqcZj3H47L5mj6EMI",{"id":12832,"title":4445,"body":12833,"createdAt":14066,"description":12837,"draft":5972,"extension":5973,"image":14067,"mastodonThread":14068,"meta":14069,"navigation":5976,"path":4444,"seo":14070,"stem":14071,"tags":14072,"updatedAt":12823,"__hash__":14073},"content\u002FTLT - 2023.07.20 - Self Judging Stories.md",{"type":5822,"value":12834,"toc":14037},[12835,12838,12846,12849,12858,12861,12867,12870,12873,12876,12882,12888,12891,12894,12903,12909,12912,12915,12918,13173,13180,13186,13189,13192,13203,13209,13215,13218,13221,13227,13230,13236,13239,13242,13245,13248,13251,13254,13257,13260,13263,13266,13269,13272,13275,13278,13281,13284,13287,13290,13293,13296,13299,13302,13305,13308,13311,13314,13317,13320,13323,13326,13329,13332,13335,13338,13341,13344,13347,13350,13353,13356,13359,13362,13365,13368,13371,13374,13377,13380,13383,13386,13389,13392,13395,13398,13401,13404,13407,13410,13413,13416,13419,13422,13425,13428,13431,13434,13437,13440,13443,13446,13449,13452,13455,13458,13461,13464,13467,13470,13473,13476,13479,13482,13485,13488,13491,13494,13497,13500,13503,13506,13509,13512,13515,13518,13521,13524,13527,13530,13533,13536,13539,13542,13545,13548,13551,13554,13557,13560,13563,13566,13569,13572,13575,13578,13581,13584,13587,13590,13593,13596,13599,13602,13605,13608,13611,13614,13617,13620,13623,13626,13629,13632,13635,13638,13641,13644,13647,13650,13653,13656,13659,13662,13665,13668,13671,13674,13677,13680,13683,13686,13689,13692,13695,13698,13701,13704,13707,13710,13713,13716,13719,13722,13725,13728,13731,13734,13737,13740,13743,13746,13749,13752,13755,13758,13761,13764,13767,13770,13773,13776,13779,13782,13785,13788,13791,13794,13797,13800,13803,13806,13809,13812,13815,13818,13821,13824,13827,13830,13833,13836,13839,13842,13845,13848,13851,13854,13857,13860,13863,13866,13869,13872,13875,13878,13881,13884,13887,13890,13893,13896,13899,13902,13905,13908,13911,13914,13917,13920,13923,13926,13929,13932,13935,13938,13941,13944,13947,13950,13953,13956,13959,13962,13965,13968,13971,13974,13977,13980,13983,13986,13989,13992,13995,13998,14001,14004,14007,14010,14013,14016,14019,14022,14025,14028,14031,14034],[5825,12836,12837],{},"Using OpenAI API GPT-3.5 to generate and judge stories.",[5825,12839,12840,12063,12843],{},[6416,12841],{"src":12842},"\u002Fimg\u002Frobot-reading-script.jpg",[5834,12844,12845],{},"Robot reading a script, oil painting style. Image by Bing Image creator.",[6071,12847,4450],{"id":12848},"introduction-to-i-wish-to-iwt",[5825,12850,12851,12852,12857],{},"First things first, I create a super small cli app, ",[5950,12853,12856],{"href":12854,"rel":12855},"https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fiwt",[5954],"iwt"," \"I Wish To...\". The idea is to be a very unixy-ergonomic interface to LLMs. Data fed in via STDIN, make your wish via ARGV, result via STDOUT.",[5825,12859,12860],{},"Slightly easier said than done, and unfortunately I only have access to GPT-3.5 instead of the markedly better GPT-4. Still .... it works!",[6971,12862,12865],{"className":12863,"code":12864,"language":6976},[6974],"$ curl https:\u002F\u002Fnews.ycombinator.com | iwt turn this into a csv\n1.,FedNow Is Live,federalreserve.gov,lavp,643 points,8 hours ago,610 comments\n2.,Oxide Computer: Docs,oxide.computer,avrong,94 points,2 hours ago,38 comments\n3.,No-more-secrets: recreate the decryption effect seen in the 1992 movie Sneakers,github.com\u002Fbartobri,tambourine_man,792 points,10 hours ago,194 comments\n4.,A 17th-century font in a 21st-century thesis,linyangchen.com,_emacsomancer_,61 points,1 hour ago,11 comments\n5.,Richard Rhodes wrote a classic book about Oppenheimer and the atomic bomb,theatlantic.com,Hooke,35 points,2 hours ago,25 comments\n...\n",[6002,12866,12864],{"__ignoreMap":45},[5825,12868,12869],{},"So yeah! Magic.",[6071,12871,4455],{"id":12872},"story-time",[5825,12874,12875],{},"It's not as interesting, but you can also send in nothing and do a more normal text generation. Like this:",[6971,12877,12880],{"className":12878,"code":12879,"language":6976},[6974],"$ echo | iwt Write a 1 sentence story\nOnce upon a time, a small mouse found a delicious piece of cheese and embarked on a grand adventure to bring it back to its family.\n",[6002,12881,12879],{"__ignoreMap":45},[5825,12883,12884,12885,12887],{},"I plan on teaching ",[6002,12886,12856],{}," to be more aware of when pipe input is available, as well as using STDERR and TTY for out-of-band communication (leaving STDIN and STDOUT as the main data pipeline).",[5825,12889,12890],{},"Great! Now we have stories! But how do we judge them?",[6071,12892,4460],{"id":12893},"judging-stories",[5825,12895,12896,12897,12899,12900,7203],{},"Surprise surprise... let's ask ",[6002,12898,12856],{},"! Let's say we have a story in ",[6002,12901,12902],{},"story.txt",[6971,12904,12907],{"className":12905,"code":12906,"language":6976},[6974],"$ cat story.txt | iwt score this story from 1-100 on plot, setting, etc\n{\"plot\": 90, \"setting\": 80, \"character development\": 85, \"clues\": 95, \"twist\": 90}\n",[6002,12908,12906],{"__ignoreMap":45},[5825,12910,12911],{},"Somehow it decided to output in JSON, which I thought was cool so I explicitly requested JSON for the overall review.",[6071,12913,4465],{"id":12914},"generate-and-judge",[5825,12916,12917],{},"I actually wrote this all out in one long line, but here is a script to generate and judge. Out of some curiosity we judge 10 times each.",[6971,12919,12921],{"className":8277,"code":12920,"language":8279,"meta":45,"style":45},"for i in {1..20}; do\n  echo \"Writing and scoring story $i\"\n  echo \"detective solving a locked-room mystery\" | \\\n    iwt Write a 1000 word story based on the topic in the data | \\\n    tee story-$i.txt\n  for j in {1..10} ; do\n    cat story-$i.txt | \\\n      iwt score this story from 1-100 on plot, setting, characters, \\\n        conflict, resolution, pacing, theme. Also include an overall \\\n        score. output in json format \\\n        | tee story-$i-score-$j.json\n  done\ndone\n",[6002,12922,12923,12945,12958,12970,13014,13027,13047,13063,13095,13123,13141,13162,13167],{"__ignoreMap":45},[5853,12924,12925,12928,12931,12933,12936,12939,12942],{"class":7026,"line":9},[5853,12926,12927],{"class":7029},"for",[5853,12929,12930],{"class":7033}," i ",[5853,12932,10654],{"class":7029},[5853,12934,12935],{"class":7033}," {",[5853,12937,12938],{"class":8564},"1..20}",[5853,12940,12941],{"class":7033},"; ",[5853,12943,12944],{"class":7029},"do\n",[5853,12946,12947,12950,12953,12956],{"class":7026,"line":15},[5853,12948,12949],{"class":7103},"  echo",[5853,12951,12952],{"class":7059}," \"Writing and scoring story ",[5853,12954,12955],{"class":7033},"$i",[5853,12957,8311],{"class":7059},[5853,12959,12960,12962,12965,12967],{"class":7026,"line":56},[5853,12961,12949],{"class":7103},[5853,12963,12964],{"class":7059}," \"detective solving a locked-room mystery\"",[5853,12966,8574],{"class":7029},[5853,12968,12969],{"class":7073}," \\\n",[5853,12971,12972,12975,12978,12981,12984,12987,12990,12993,12996,12999,13002,13005,13007,13010,13012],{"class":7026,"line":5212},[5853,12973,12974],{"class":8564},"    iwt",[5853,12976,12977],{"class":7059}," Write",[5853,12979,12980],{"class":7059}," a",[5853,12982,12983],{"class":7073}," 1000",[5853,12985,12986],{"class":7059}," word",[5853,12988,12989],{"class":7059}," story",[5853,12991,12992],{"class":7059}," based",[5853,12994,12995],{"class":7059}," on",[5853,12997,12998],{"class":7059}," the",[5853,13000,13001],{"class":7059}," topic",[5853,13003,13004],{"class":7059}," in",[5853,13006,12998],{"class":7059},[5853,13008,13009],{"class":7059}," data",[5853,13011,8574],{"class":7029},[5853,13013,12969],{"class":7073},[5853,13015,13016,13019,13022,13024],{"class":7026,"line":7077},[5853,13017,13018],{"class":8564},"    tee",[5853,13020,13021],{"class":7059}," story-",[5853,13023,12955],{"class":7033},[5853,13025,13026],{"class":7059},".txt\n",[5853,13028,13029,13032,13035,13037,13039,13042,13045],{"class":7026,"line":7083},[5853,13030,13031],{"class":7029},"  for",[5853,13033,13034],{"class":7033}," j ",[5853,13036,10654],{"class":7029},[5853,13038,12935],{"class":7033},[5853,13040,13041],{"class":8564},"1..10}",[5853,13043,13044],{"class":7033}," ; ",[5853,13046,12944],{"class":7029},[5853,13048,13049,13052,13054,13056,13059,13061],{"class":7026,"line":7094},[5853,13050,13051],{"class":8564},"    cat",[5853,13053,13021],{"class":7059},[5853,13055,12955],{"class":7033},[5853,13057,13058],{"class":7059},".txt",[5853,13060,8574],{"class":7029},[5853,13062,12969],{"class":7073},[5853,13064,13065,13068,13071,13074,13076,13079,13082,13084,13087,13090,13093],{"class":7026,"line":7100},[5853,13066,13067],{"class":8564},"      iwt",[5853,13069,13070],{"class":7059}," score",[5853,13072,13073],{"class":7059}," this",[5853,13075,12989],{"class":7059},[5853,13077,13078],{"class":7059}," from",[5853,13080,13081],{"class":7059}," 1-100",[5853,13083,12995],{"class":7059},[5853,13085,13086],{"class":7059}," plot,",[5853,13088,13089],{"class":7059}," setting,",[5853,13091,13092],{"class":7059}," characters,",[5853,13094,12969],{"class":7073},[5853,13096,13097,13100,13103,13106,13109,13112,13115,13118,13121],{"class":7026,"line":7110},[5853,13098,13099],{"class":7059},"        conflict,",[5853,13101,13102],{"class":7059}," resolution,",[5853,13104,13105],{"class":7059}," pacing,",[5853,13107,13108],{"class":7059}," theme.",[5853,13110,13111],{"class":7059}," Also",[5853,13113,13114],{"class":7059}," include",[5853,13116,13117],{"class":7059}," an",[5853,13119,13120],{"class":7059}," overall",[5853,13122,12969],{"class":7073},[5853,13124,13125,13128,13131,13133,13136,13139],{"class":7026,"line":7118},[5853,13126,13127],{"class":7059},"        score.",[5853,13129,13130],{"class":7059}," output",[5853,13132,13004],{"class":7059},[5853,13134,13135],{"class":7059}," json",[5853,13137,13138],{"class":7059}," format",[5853,13140,12969],{"class":7073},[5853,13142,13143,13146,13149,13151,13153,13156,13159],{"class":7026,"line":8481},[5853,13144,13145],{"class":7029},"        |",[5853,13147,13148],{"class":8564}," tee",[5853,13150,13021],{"class":7059},[5853,13152,12955],{"class":7033},[5853,13154,13155],{"class":7059},"-score-",[5853,13157,13158],{"class":7033},"$j",[5853,13160,13161],{"class":7059},".json\n",[5853,13163,13164],{"class":7026,"line":8495},[5853,13165,13166],{"class":7029},"  done\n",[5853,13168,13170],{"class":7026,"line":13169},13,[5853,13171,13172],{"class":7029},"done\n",[5825,13174,13175,13176,13179],{},"We end up with 20 stories, each with 10 scores, all in their individual files. We can apply a bit of ",[6002,13177,13178],{},"jq"," magic to get a summary:",[6971,13181,13184],{"className":13182,"code":13183,"language":6976},[6974],"$ for i in {1..20} ; do echo -n \"Story $i: \" ; cat story-$i-*.json | jq '[inputs | .overall] | add \u002F length' ; done\nStory 1: 89\nStory 2: 89.88888888888889\nStory 3: 91.11111111111111\nStory 4: 80.55555555555556\nStory 5: 91.44444444444444\nStory 6: 89.75\nStory 7: 89.33333333333333\nStory 8: 86.66666666666667\nStory 9: 90.22222222222223\nStory 10: 91.66666666666667\nStory 11: 91\nStory 12: 80.66666666666667\nStory 13: 90\nStory 14: 90.11111111111111\nStory 15: 91.11111111111111\nStory 16: 89.66666666666667\nStory 17: 91.11111111111111\nStory 18: 90.55555555555556\nStory 19: 90.22222222222223\nStory 20: 89.55555555555556\n",[6002,13185,13183],{"__ignoreMap":45},[6071,13187,4470],{"id":13188},"observations",[5825,13190,13191],{},"The first thing that jumps right out is .... they all have almost the same score! When you look at the individual stories and the 10 different scores they get, those too are right around that same spot. Basically GPT-3.5 gives itself an A- pretty much all the time.",[5825,13193,13194,13195,13198,13199,13202],{},"Except for Story 4, which has a score of ... 80?! Talk about an outlier. And that's because .... one of the score outputs has an extra layer of nested JSON for no apparent reason. The others had ",[6002,13196,13197],{},"{ ... overall: 90 }",", this one had ",[6002,13200,13201],{},"{ story: { ... overall: 90 } }",". Good labeleling of the dataset I guess? When we take this datapoint out we get ... 90.625. Not an interesting story but an interesting output I suppose.",[5825,13204,13205,13206,13208],{},"I haven't read all of the stories in detail, but skimmed them a bit. I got tired of that, so I asked ",[6002,13207,12856],{}," to tell me the name of the detective for each story.",[6971,13210,13213],{"className":13211,"code":13212,"language":6976},[6974],"$ for i in story-*.txt ; do echo -n \"$i: \" ; cat $i | iwt get the name of the detective ; done\nstory-10.txt: James Blackwood\nstory-11.txt: The name of the detective is Michael Thompson.\nstory-12.txt: Detective James Anderson\nstory-13.txt: Detective James Anderson\nstory-14.txt: The name of the detective is Jack Hartley.\nstory-15.txt: Detective James Anderson\nstory-16.txt: James Anderson\nstory-17.txt: Detective Andersson\nstory-18.txt: Detective Smith\nstory-19.txt: Samantha Holmes\nstory-1.txt: James Walker\nstory-20.txt: Detective James Thompson\nstory-2.txt: Detective's name: Robert Stevens\nstory-3.txt: Detective Crest\nstory-4.txt: Adrian Holmes\nstory-5.txt: Detective James Henderson\nstory-6.txt: Jack Thompson\nstory-7.txt: Detective William Hart\nstory-8.txt: John Sinclair\nstory-9.txt: Samuel Holmes\n",[6002,13214,13212],{"__ignoreMap":45},[5825,13216,13217],{},"Just a bit redundant! I will likely try this again with the temperature turned way up.",[5825,13219,13220],{},"OK one more ... WHO DID IT?!",[6971,13222,13225],{"className":13223,"code":13224,"language":6976},[6974],"$ for i in story-*.txt ; do echo -n \"$i: \" ; cat $i | iwt tell me who is the murderer ; done\nstory-10.txt: I'm sorry, but I cannot determine the murderer based on the provided story.\nstory-11.txt: I'm sorry, but based on the provided story, there is no specific information given regarding the identity of the murderer.\nstory-12.txt: I'm sorry, but I am unable to determine the murderer based solely on the given story. The details provided do not explicitly mention the identity of the murderer.\nstory-13.txt: I'm sorry, but I am a unix command line tool and I am unable to determine the identity of the murderer based on the provided text.\nstory-14.txt: I'm sorry, but I don't have enough information to determine who the murderer is based on the story provided.\nstory-15.txt: I'm sorry, but I cannot determine the murderer in the given story. The information provided is a fictional narrative without any explicit details about the identity of the killer.\nstory-16.txt: I'm sorry, but I cannot determine the identity of the murderer based on the information provided.\nstory-17.txt: I'm sorry, but I cannot tell you who the murderer is based on the information provided. The story does not provide enough evidence or clues to determine the identity of the murderer.\nstory-18.txt: I'm sorry, but I cannot determine the murderer in this story as it is a fictional narrative.\nstory-19.txt: I'm sorry, but I cannot determine who the murderer is based on the story provided. The story is about a locked-room mystery, not a murder mystery.\nstory-1.txt: I'm sorry, but I cannot determine the identity of the murderer from the given information.\nstory-20.txt: I'm sorry, but I am a command line tool and I do not have any knowledge or information about the specific details of the case you described. If you have any specific questions or instructions, please let me know and I will do my best to assist you.\nstory-2.txt: Unfortunately, I cannot provide the name of the murderer as it was not mentioned in the given text.\nstory-3.txt: I'm sorry, but I cannot determine the murderer from the given story.\nstory-4.txt: I'm sorry, but I am unable to determine who the murderer is in the given story. The story does not provide enough information to accurately identify the murderer.\nstory-5.txt: I cannot determine the murderer based on the provided information. The story does not explicitly state who the murderer is.\nstory-6.txt: I'm sorry, but the information provided does not include any details about a murder or a murderer. Hence, I cannot tell you who the murderer is based on the given text.\nstory-7.txt: I cannot determine the murderer based on the information provided.\nstory-8.txt: The murderer in this case is Penelope Harrison.\nstory-9.txt: Apologies, but I am just a unix command line tool and cannot determine the identity of the murderer in a fictional story.\n",[6002,13226,13224],{"__ignoreMap":45},[5825,13228,13229],{},"That ... is not what I expected. OK then.",[5825,13231,13232,13233,13235],{},"Below are the stories themselves with no editing. Note that I have the \"temperature\" turned down pretty low, which means that GPT-3.5 won't be very \"creative\" with its output. The ",[6002,13234,12856],{}," tool is meant primarily as a magic data pipeline, so the idea here is that chaos might not be a good idea.",[6071,13237,4475],{"id":13238},"the-stories",[7710,13240,4479],{"id":13241},"story-1",[5825,13243,13244],{},"There once was a brilliant detective named James Walker who was famous for solving the most perplexing cases. His reputation as a master of deduction made him sought after by clients near and far. One day, Detective Walker received a call about a locked-room mystery that had stumped the local police department.",[5825,13246,13247],{},"Arriving at the scene, Detective Walker found himself standing before a grand mansion. The mansion belonged to a wealthy businessman named Richard Blackwood, who was found dead in his study. The room had been locked from the inside, and there was no way in or out. The police suspected suicide, but Detective Walker knew there was more to the story.",[5825,13249,13250],{},"As he entered the study, Detective Walker meticulously examined every detail. He noticed a small, ornate key on the desk. Curious, he took it in his hands and observed it closely. It was unlike any key he had ever seen before. He decided to keep it as evidence.",[5825,13252,13253],{},"Moving further into the room, Detective Walker examined the lifeless body of Richard Blackwood. It was clear that he had been shot in the chest. However, there was no weapon to be found anywhere in the room. This discovery puzzled Walker even more, fueling his determination to uncover the truth.",[5825,13255,13256],{},"Next, the detective examined the windows. They were securely locked and showed no signs of tampering. It seemed impossible for anyone to have entered or exited through them. Detective Walker realized that he needed to gather more information before he could solve this locked-room mystery.",[5825,13258,13259],{},"He began by interviewing the staff of the mansion. Each one had an alibi and seemed genuinely shocked by Mr. Blackwood's death. However, one of the maids, Sarah, seemed unusually nervous during the conversation. Although it was not enough to prove her guilt, Detective Walker made a mental note to keep an eye on her.",[5825,13261,13262],{},"Digging deeper into the background of Richard Blackwood, Detective Walker discovered that he was involved in several shady business dealings. It appeared that he had made enemies who wanted him out of the picture. Could one of them be responsible for his death?",[5825,13264,13265],{},"With the information he had gathered, Detective Walker returned to the mansion to conduct a thorough search. He enlisted the help of his trusted forensic expert, Dr. Emily Collins. Together, they meticulously combed through every inch of the study, hoping to find a clue that would crack the case wide open.",[5825,13267,13268],{},"Suddenly, Dr. Collins exclaimed, \"Detective, look at this!\" She pointed to a hidden compartment behind one of the bookshelves. Inside, they found a locked drawer. Remembering the key he had found earlier, Detective Walker tried it and to his surprise, it fit perfectly. Inside the drawer, they found a gun covered in fingerprints.",[5825,13270,13271],{},"The fingerprints were later matched to Sarah, the nervous maid. Confronted with the evidence, Sarah broke down and confessed. She revealed that Richard Blackwood had been blackmailing her, threatening to reveal her troubled past if she didn't comply with his demands. Fearing the worst, Sarah took matters into her own hands and planned the perfect crime.",[5825,13273,13274],{},"Thanks to Detective Walker's keen observation and deductive reasoning, justice was served. Sarah was taken into custody, and the locked-room mystery was finally solved. The case further solidified Detective Walker's reputation as the best detective around and solidified his place in the annals of crime-solving history.",[5825,13276,13277],{},"And so, another chapter closed on the illustrious career of Detective James Walker, leaving behind a legacy of mysteries solved and justice served.",[7710,13279,4484],{"id":13280},"story-2",[5825,13282,13283],{},"The Locked Room Mystery",[5825,13285,13286],{},"Detective Robert Stevens was known for his sharp mind and impeccable deductive skills. He had tackled some of the most perplexing cases in his career, but the one he was currently faced with posed a challenge unlike any other – the locked room mystery.",[5825,13288,13289],{},"It all began on a stormy night in the small town of Crestwood. The mansion of renowned art collector, Victor Kensington, became the setting for a puzzling crime. A valuable painting had gone missing from the study, and the only clue left behind was a shattered window. The strangest part, however, was that the study was locked from the inside, with no visible signs of forced entry.",[5825,13291,13292],{},"Detective Stevens arrived at the scene, determined to unravel the mystery. He examined the shattered window carefully, searching for any minuscule piece of evidence that might lead him to the perpetrator. But there was nothing. No fingerprints, no footprints, nothing out of the ordinary.",[5825,13294,13295],{},"Next, Detective Stevens focused his attention on the study itself. He carefully inspected the door, the walls, and the floor, searching for any hidden passages or secret compartments. Again, there was nothing.",[5825,13297,13298],{},"As he pondered over the perplexing puzzle, Detective Stevens couldn't help but feel that there was a detail he had missed. He retraced his steps, examining the shattered glass from the window once more. Suddenly, it struck him – the glass was scattered in a peculiar pattern, almost as if it had been deliberately arranged.",[5825,13300,13301],{},"Armed with this newfound insight, Detective Stevens began to reexamine the scene from a different perspective. He studied the broken parts of the window and reconstructed the puzzle in his mind. Slowly, the truth started to unfold.",[5825,13303,13304],{},"It became clear to Detective Stevens that the shattered window was a diversion – a cleverly staged illusion to mislead investigators. The real clue lay hidden within the study itself. He started looking for anything out of place but found nothing that seemed significant.",[5825,13306,13307],{},"Frustrated but determined, Detective Stevens sat down in the study chair, staring at the blank walls surrounding him. Suddenly, his gaze fell upon a small indentation on the armrest of the chair. He examined it closer and noticed a faint smudge of paint. It was the same shade as the stolen painting.",[5825,13309,13310],{},"Realizing he had uncovered a crucial breakthrough, Detective Stevens searched the chair thoroughly. Hidden within its structure, he found a hidden compartment that revealed the missing painting. The culprit had cleverly used the locked room as a distraction, focusing everyone's attention on the shattered window.",[5825,13312,13313],{},"As Detective Stevens apprehended the thief, he marveled at the intricate planning and execution of the crime. The locked room mystery had indeed presented a formidable challenge, but his sharp instincts and meticulous attention to detail had triumphed once again.",[5825,13315,13316],{},"In the end, Detective Stevens not only solved the crime but also cemented his reputation as one of the most brilliant detectives of his time. The locked room mystery would forever remain a testament to his unparalleled skills and the power of unwavering determination.",[7710,13318,4489],{"id":13319},"story-3",[5825,13321,13322],{},"Once upon a time, in the quiet town of Ravenwood, a renowned detective named Samuel Crest was called upon to solve a puzzling locked-room mystery. The owner of the grand Ravenwood Manor, Sir Arthur Whitmore, had been found dead in his study, with the door locked from the inside. The case had stumped the local police, and it was now up to Detective Crest to unravel the truth behind this perplexing crime.",[5825,13324,13325],{},"As Detective Crest entered the opulent manor, he was immediately struck by the eerie atmosphere that hung in the air. The walls of Ravenwood Manor seemed to whisper secrets, and every step echoed through the empty hallways. With his keen eye for detail and sharp wit, he began his investigation.",[5825,13327,13328],{},"He first examined the study, where the body was found. The room was meticulously organized, filled with bookshelves and antique furniture. Sir Arthur's lifeless body lay slumped in his leather chair behind the large oak desk. The only window in the study was secured shut, and there were no signs of forced entry. The door was locked, and the key still sat in the keyhole. It appeared to be a classic locked-room mystery.",[5825,13330,13331],{},"Detective Crest turned his attention to the people who might have motive to harm Sir Arthur. The suspects included Lady Victoria Whitmore, Sir Arthur's estranged wife who had recently returned to town, and Mr. Edward Drake, Sir Arthur's business partner who stood to gain from his demise. Both individuals had been present in the manor at the time of the murder.",[5825,13333,13334],{},"The detective meticulously interviewed each suspect, digging deep into their pasts and establishing alibis for the time of the crime. His experienced eye carefully analyzed their facial expressions, searching for any signs of deception. Lady Victoria presented an alibi, attending a charity ball on the other side of town, while Mr. Drake claimed to have been working in his office during the incident.",[5825,13336,13337],{},"As Detective Crest delved further into the case, he discovered a hidden passage behind the bookshelf in the study. The passage led to a secret room, filled with old diaries, newspaper clippings, and personal trinkets. It seemed that Sir Arthur had been researching an ancient cursed artifact known as the 'Eye of Seraphim.'",[5825,13339,13340],{},"His investigation then led him to an unexpected turn of events. The detective learned that both Lady Victoria and Mr. Drake had connections to the 'Eye of Seraphim.' Lady Victoria's family had a long history with the artifact, while Mr. Drake had been discreetly collecting relics for his personal collection.",[5825,13342,13343],{},"With this new information, Detective Crest began to piece together the puzzle. He soon realized that the murder was not a random act, but a carefully orchestrated plan. The room had been locked from the inside to create an illusion of an impossible crime. The key to the study had been duplicated, allowing the killer access to the room without being noticed.",[5825,13345,13346],{},"Following the trail of evidence, Detective Crest concluded that Lady Victoria was the mastermind behind the murder. She had plotted to kill Sir Arthur and frame Mr. Drake, using the locked-room scenario as a diversion. With her extensive knowledge of the family history and the 'Eye of Seraphim', she had carefully crafted the perfect crime.",[5825,13348,13349],{},"Armed with this revelation, Detective Crest confronted Lady Victoria, presenting the evidence he had gathered. Overwhelmed by the weight of the evidence against her, Lady Victoria finally confessed to her heinous crime. Her motive was the vast fortune she would inherit from her late husband, as well as the lure of the cursed artifact.",[5825,13351,13352],{},"Within the dimly lit study of Ravenwood Manor, justice was served and the truth was finally unveiled. Detective Crest had once again triumphed over a perplexing mystery, proving that no locked-door or hidden secret could escape his brilliant mind. As he set off into the night, the town of Ravenwood knew that they were in the presence of a true master of deduction - a detective whose name would be whispered for generations to come.",[7710,13354,4494],{"id":13355},"story-4",[5825,13357,13358],{},"Once upon a time in the small town of Willowbrook, there was a brilliant detective named Adrian Holmes. Known for his exceptional deductive skills, Adrian had solved countless cases that had baffled others. However, there was one mystery that had eluded him for years - the locked-room mystery.",[5825,13360,13361],{},"One day, a wealthy businessman named Richard Wellington approached Adrian with a desperate plea for help. His wife, Evelyn Wellington, had been found dead in her study under mysterious circumstances. The room had been locked from the inside, and there was no sign of forced entry or anyone else present. It was a classic locked-room mystery that had stymied the local police and the community.",[5825,13363,13364],{},"Intrigued by the challenge, Adrian agreed to take on the case. He arrived at the Wellington mansion, an imposing Victorian-era residence with a dark history. The atmosphere was tense, and rumors of supernatural occurrences had spread throughout the town, adding an aura of mystery to the already perplexing case.",[5825,13366,13367],{},"Adrian began his investigation by carefully examining every inch of the study. There were no hidden passages, secret doors, or any other obvious means of entry or escape. The windows were securely locked, and the room was void of any other hiding places. The only clue left behind was a single, red rose lying on Evelyn's desk.",[5825,13369,13370],{},"As Adrian delved deeper into Evelyn's background, he discovered a web of secrets and hidden motives. Evelyn had been an ambitious woman who had recently started her own business, rivaling her husband's interests. Richard, on the other hand, had a history of infidelity and financial troubles. There were numerous potential suspects, each with their own motive to harm Evelyn.",[5825,13372,13373],{},"Adrian meticulously interviewed each member of the household, the house staff, and even the townspeople who had interacted with Evelyn in the days leading up to her death. He pieced together a timeline of events, cross-referencing alibis and discrepancies in testimonies.",[5825,13375,13376],{},"As he sifted through the evidence, one name continued to resurface - Victoria Ashford, Richard's former business partner and Evelyn's fiercest competitor. Adrian sensed that she was hiding something significant, so he decided to pay her a visit.",[5825,13378,13379],{},"Victoria Ashford lived in a secluded cottage on the outskirts of Willowbrook. She was surprised but composed when Adrian arrived unannounced. She claimed innocence but couldn't provide a solid alibi for her whereabouts on the night of Evelyn's death.",[5825,13381,13382],{},"Thinking on his feet, Adrian concocted an elaborate ruse to uncover the truth. He staged a chance encounter with Victoria at a local café, pretending to be an interested investor. She took the bait, eager to discuss her business plans.",[5825,13384,13385],{},"As they talked, Adrian skillfully steered the conversation towards Evelyn's murder. Victoria couldn't resist defending herself, inadvertently revealing crucial information only the killer would know. It was the breakthrough Adrian had been waiting for.",[5825,13387,13388],{},"Armed with this newfound knowledge, Adrian returned to the Wellington mansion and confronted Richard. The pieces of the puzzle finally fell into place. Richard had orchestrated Evelyn's murder, hoping to frame Victoria and eliminate his wife's business rival. He had planted the rose as a diversion, intending to create an air of mystery around the crime.",[5825,13390,13391],{},"With the evidence and confession in hand, Adrian handed Richard over to the police, ensuring justice would be served. Willowbrook celebrated the detective's triumph, and his reputation as the town's finest sleuth was solidified.",[5825,13393,13394],{},"The locked-room mystery had been solved, thanks to Adrian Holmes' brilliant mind and unwavering determination. But as the townspeople breathed a sigh of relief, little did they know that more thrilling cases awaited the detective, as he continued to solve mysteries that perplexed others and brought justice to those in need.",[7710,13396,4499],{"id":13397},"story-5",[5825,13399,13400],{},"Once upon a time, in the heart of a quaint little town, there lived a brilliant detective named Detective James Henderson. Known for his keen intellect and razor-sharp instincts, Detective Henderson had solved countless crimes, earning him a reputation as the best detective in the region.",[5825,13402,13403],{},"One sunny morning, Detective Henderson received a perplexing case. The owner of a lavish mansion, Mr. Edward Sinclair, had been found dead inside his locked study. The room was securely bolted from the inside, and the windows showed no signs of forced entry. It appeared to be a classic locked-room mystery.",[5825,13405,13406],{},"As Detective Henderson arrived at the crime scene, he was greeted by the distraught butler, Mr. Jenkins. Jenkins explained that he had discovered Mr. Sinclair's lifeless body early in the morning when he went to deliver his morning tea. The police had already secured the area, ensuring minimal contamination of evidence.",[5825,13408,13409],{},"Stepping into the study, Detective Henderson meticulously examined every inch of the room. The walls were adorned with antique paintings, the shelves filled with dusty books, and a grand mahogany desk stood in the center. The detective's eyes focused on the desk, his intuition telling him it held an important clue.",[5825,13411,13412],{},"Inspecting the desk, Detective Henderson noticed a faint trace of dust disturbed on one corner. His gloved hand carefully lifted a small, ornate key. With palpable excitement, he deduced that this was the key to the locked room. However, it raised more questions than answers. How did the killer escape if the key was still inside?",[5825,13414,13415],{},"Determining that the key was the key to cracking the case, Detective Henderson began his investigation in earnest. He interviewed the household staff, family members, and friends. Each person had an alibi, leaving no immediate suspects. It seemed that everyone was genuinely shocked by Mr. Sinclair's death.",[5825,13417,13418],{},"Delving deeper into Mr. Sinclair's personal life, Detective Henderson discovered a web of deceit and betrayal. Hidden behind the facade of a respectable businessman, Sinclair had been involved in illegal dealings with dangerous criminals. It was possible that one of his illicit associates had come to collect a debt, resulting in his untimely demise.",[5825,13420,13421],{},"As the investigation progressed, Detective Henderson's intuition led him to a previously unnoticed detail. The bookshelf in Mr. Sinclair's study was slightly askew. Pulling it aside, he discovered a hidden doorway that led to a secret chamber. Inside, he found stacks of incriminating documents, implicating Sinclair in a complex web of corruption.",[5825,13423,13424],{},"Armed with this newfound knowledge, Detective Henderson assembled all the suspects together—the staff, family, and friends. With a dramatic flair, he unveiled the truth, exposing Mr. Sinclair's double life and revealing the killer's identity.",[5825,13426,13427],{},"It was none other than Mr. Jenkins, the loyal butler. He had been blackmailed by Sinclair and decided to take matters into his own hands. Jenkins had used an elaborate contraption to lock the study door behind him, fooling everyone into thinking it was an unsolvable crime.",[5825,13429,13430],{},"In the end, justice was served, and the truth prevailed. Detective Henderson's brilliance had solved yet another perplexing case, putting the small town at ease once again. His reputation as the finest detective in the region was cemented further, and he continued to be a symbol of justice and order in the community.",[5825,13432,13433],{},"And so, the locked-room mystery came to a thrilling conclusion, leaving behind a tale that would be whispered for generations to come. Detective James Henderson's name would forever be associated with the triumph of logic over deception, and his legacy as a master detective would live on forever.",[7710,13435,4504],{"id":13436},"story-6",[5825,13438,13439],{},"Once upon a time, in the small town of Riverton, there was an old mansion that had a reputation for being haunted. Legend has it that anyone who dared to spend the night in the mansion would never return. This haunted mansion became the talk of the town and intrigued Detective Jack Thompson.",[5825,13441,13442],{},"Detective Thompson was known for his sharp intellect and his ability to solve even the most perplexing cases. When he heard about the haunted mansion, he saw it as an opportunity to put his skills to the test. Determined to debunk the ghostly rumors, he decided to spend the night in the mansion and solve the mystery once and for all.",[5825,13444,13445],{},"As the sun set, Detective Thompson entered the mansion, carrying his trusted magnifying glass and notebook. The mansion was as eerie as the stories suggested, with creaking floorboards and shadows dancing on the walls. Undeterred, Detective Thompson began his investigation.",[5825,13447,13448],{},"He meticulously examined every room, paying close attention to the details. He noticed footprints leading to a hidden door on the second floor. With cautious steps, he opened the door and discovered a secret staircase leading to the attic. In the attic, he found a dusty old chest, locked tight with a mysterious key.",[5825,13450,13451],{},"Curiosity piqued, Detective Thompson searched the mansion for the key. After hours of searching, he stumbled upon a hidden compartment in a bookshelf that contained a small silver key. With the key in his possession, he returned to the attic and unlocked the chest.",[5825,13453,13454],{},"To his surprise, the chest contained a journal filled with cryptic entries and a map leading to a hidden treasure. As Detective Thompson delved deeper into the journal, he discovered that the mansion held a dark secret. It was rumored that a valuable diamond had been stolen from a nearby museum years ago and hidden within the walls of the mansion.",[5825,13456,13457],{},"With the mystery unfolding before him, Detective Thompson knew his task was not just to solve the locked-room mystery but also to recover the stolen diamond. He meticulously followed the map and found a hidden passage that led to a secret room behind a false wall.",[5825,13459,13460],{},"In the room, he discovered a safe with a combination lock. He scoured the journal for clues and, using his deductive reasoning, cracked the code. With bated breath, he opened the safe and found the stolen diamond resting on a velvet cushion.",[5825,13462,13463],{},"With the case solved and the stolen diamond recovered, Detective Thompson emerged from the haunted mansion triumphant. The townspeople were astounded, for not only had he proven that the mansion was not haunted, he had solved a decades-old crime.",[5825,13465,13466],{},"News of Detective Thompson's success spread like wildfire, earning him the admiration and respect of his colleagues. From that day forward, the haunted mansion of Riverton became a reminder of Detective Thompson's brilliance and the power of his investigative skills.",[5825,13468,13469],{},"And so, Detective Thompson's legacy lived on, inspiring future generations of detectives to unravel mysteries and uncover the truth, no matter how locked away it might seem. The haunted mansion of Riverton became a symbol of courage and determination, rather than a place of fear and darkness.",[7710,13471,4509],{"id":13472},"story-7",[5825,13474,13475],{},"Once upon a time in the quaint town of Riverton, Detective William Hart found himself facing his most perplexing case yet. The mysterious death of wealthy businessman, Richard Lockwood, had everyone baffled. The circumstances were peculiar, to say the least. Mr. Lockwood was found dead in his study, which was securely locked from the inside. There were no signs of forced entry, no windows were open, and the room seemed completely undisturbed.",[5825,13477,13478],{},"Detective Hart arrived at the estate promptly, determined to unravel this impossible locked-room mystery. He surveyed the scene meticulously, taking note of every minute detail. The room was elegant, but eerily quiet. The wooden bookshelves were filled with leather-bound volumes, and a grand mahogany desk stood against one wall. In the center of the room, there was a comfortable armchair in which Mr. Lockwood was found lifeless.",[5825,13480,13481],{},"The detective carefully examined the body, looking for any signs of foul play. He discovered a small puncture wound on Mr. Lockwood's wrist. It seemed insignificant, but Detective Hart knew better than to ignore even the smallest detail. He collected samples and sent them to the lab for analysis.",[5825,13483,13484],{},"As the investigation progressed, the detective interviewed the household staff and Mr. Lockwood's family members. Each had an alibi and no apparent motive for wanting the successful businessman dead. Their statements merely added to the mystery surrounding the case.",[5825,13486,13487],{},"Days turned into weeks, and Detective Hart's frustration grew. He couldn't shake the feeling that there was something crucial he was missing. Determined not to give up, he poured over the evidence again and again. Then, an idea struck him like a lightning bolt.",[5825,13489,13490],{},"Returning to the estate, Detective Hart focused his attention on the locked study door. Carefully examining the intricate lock, he noticed something peculiar. There was a tiny scratch near the keyhole, as if someone had tampered with it. Intrigued, he called upon the locksmith who had installed the lock to assist him.",[5825,13492,13493],{},"The locksmith explained that it was possible to pick that particular lock, but the process required extensive knowledge and skill. Detective Hart realized that the killer must have had both. Someone within the estate had the ability to enter the locked study unnoticed.",[5825,13495,13496],{},"With this newfound insight, the detective summoned all the suspects to the study. One by one, he interrogated them, digging deeper into their backgrounds and trying to uncover the truth. It was a battle of wits as he relentlessly weaved his way through their alibis and stories.",[5825,13498,13499],{},"Finally, after hours of intense questioning, Detective Hart caught a break. The housekeeper, Ms. Simmons, inadvertently slipped up when confronted with the scratch near the keyhole. Her face flushed with guilt as she confessed to the crime. She admitted to having a secret relationship with Mr. Lockwood and became overwhelmed with jealousy when she discovered his plans to marry another woman.",[5825,13501,13502],{},"Ms. Simmons had used her expertise as a former locksmith's apprentice to pick the lock, committing the perfect crime. She injected a poisonous substance into Mr. Lockwood's wrist when he was engrossed in his work, ensuring a quick and painless death.",[5825,13504,13505],{},"With the case finally solved, Detective Hart apprehended Ms. Simmons, who was quickly brought to justice. The town of Riverton breathed a collective sigh of relief, grateful to have such a skilled detective in their midst.",[5825,13507,13508],{},"And so, Detective William Hart's name became synonymous with unwavering determination and exceptional brilliance. His success in unraveling the locked-room mystery cemented his reputation as one of the greatest detectives of his time. From that day forward, he continued to solve even the most challenging cases, captivating the town with his remarkable skills and uncanny ability to see what others couldn't.",[7710,13510,4514],{"id":13511},"story-8",[5825,13513,13514],{},"Once upon a time, in the small town of Ravenwood, there lived a brilliant detective named John Sinclair. He was renowned for his ability to solve the most perplexing cases, and his sharp mind was always up for a challenge. One fateful evening, a locked-room mystery unfolded that would test his skills like never before.",[5825,13516,13517],{},"It was a stormy night when the wealthy Mr. Harrison was found dead in his lavish mansion. The room in which he was found had no windows and only one door, which was securely locked from the inside. The circumstances surrounding the death were mysterious, and the distraught family sought out Detective Sinclair to uncover the truth.",[5825,13519,13520],{},"Upon arriving at the scene, Sinclair carefully examined the room. The walls were adorned with priceless artwork, and the floor was covered in a plush red carpet. A large antique desk stood in the corner, cluttered with papers and a single cup of untouched tea. The air was heavy with a sense of unease.",[5825,13522,13523],{},"Sinclair questioned each family member and the staff about their whereabouts at the time of the incident. The wife, Mrs. Harrison, claimed to have been at a charity event, as did her daughter, Penelope. The butler, Mr. Jenkins, and the maid, Lily, had both been in the kitchen preparing dinner.",[5825,13525,13526],{},"As Sinclair delved deeper into the investigation, he discovered that Mr. Harrison had been deeply involved in some shady business dealings. There were rumors of unpaid debts, and Mr. Harrison had been receiving threatening letters demanding money. Could his death be related to these troubling affairs?",[5825,13528,13529],{},"The detective meticulously examined the room for any hidden passages or secret compartments that could provide an explanation for how someone could have entered or exited without leaving a trace. He checked every nook and cranny, but nothing seemed out of place.",[5825,13531,13532],{},"Sinclair then focused his attention on the windowless door. He studied the keyhole, searching for signs of tampering or forced entry. But the lock appeared to be untouched, and there were no traces of fingerprints on the doorknob.",[5825,13534,13535],{},"Feeling stumped, Sinclair decided to dig deeper into Mr. Harrison's personal life. He visited the study where the late Mr. Harrison conducted his business affairs and meticulously searched through the papers on the desk. Amidst the financial records and contracts, Sinclair found a handwritten letter that intrigued him.",[5825,13537,13538],{},"The letter was addressed to Mr. Harrison from an anonymous sender. It contained cryptic messages hinting at the secrets Mr. Harrison held and warned him of dire consequences if he didn't comply with their demands. Could this be the key to unraveling the locked-room mystery?",[5825,13540,13541],{},"Sinclair summoned all the suspects to the study and confronted them with the letter. As he observed their reactions, he noticed a flicker of guilt in Penelope's eyes. In a moment of truth, Penelope confessed that she had discovered her father's illicit activities and intended to expose him.",[5825,13543,13544],{},"She revealed that she had obtained a duplicate key to the room and had confronted her father about his wrongdoings that stormy night. Their argument grew heated, and in a fit of rage, Penelope pushed her father, causing him to stumble and hit his head on the corner of the desk, resulting in his tragic demise.",[5825,13546,13547],{},"The locked-room mystery was finally solved, and justice was served. Penelope, overwhelmed with remorse, vowed to make amends for her actions and seek redemption. Detective Sinclair, though saddened by the outcome, couldn't help but admire the strength of his intuition and the power of the truth.",[5825,13549,13550],{},"As the storm clouds cleared and the town of Ravenwood returned to peace, the legend of Detective Sinclair grew even stronger. His name would forever be associated with the solving of the locked-room mystery, a testament to his brilliant mind and unwavering dedication to justice.",[7710,13552,4519],{"id":13553},"story-9",[5825,13555,13556],{},"Detective Solving a Locked-Room Mystery",[5825,13558,13559],{},"Once upon a time in the sleepy town of Drexville, there lived a renowned detective named Samuel Holmes. Known for his extraordinary deductive skills, Holmes was called upon to solve the most puzzling cases. One day, a peculiar challenge came knocking on his door. He received a mysterious letter that detailed a locked-room mystery in an old mansion on the outskirts of town.",[5825,13561,13562],{},"Curiosity piqued, Holmes journeyed to the mansion where the puzzling events had taken place. The mansion, once grand and beautiful, had fallen into disrepair over the years. As he stepped into the gloomy interior, Holmes felt a shiver run down his spine.",[5825,13564,13565],{},"The mansion belonged to a wealthy businessman named Gregory Allister. Allister, a recluse, had recently passed away under mysterious circumstances. The letter explained that Allister's death was a locked-room mystery - a situation where a person is found dead in a room which is securely locked from the inside with no plausible means of entry or exit.",[5825,13567,13568],{},"Holmes began his investigation by inspecting the crime scene - Allister's bedroom. The door was indeed locked from the inside, with no signs of tampering. The windows were firmly shut, and there were no secret passages or hidden doors to be found. The room was devoid of any weapons or evidence of foul play. It seemed like an impossible puzzle.",[5825,13570,13571],{},"Undeterred, Holmes turned his attention to Allister's personal life. He interviewed the staff and discovered that the mansion was full of secrets. Allister had a contentious relationship with his estranged wife, Evelyn, who had moved out years ago. There were rumors of a hidden treasure in the mansion, which had been a subject of heated disputes between Allister and his business partners.",[5825,13573,13574],{},"As Holmes delved deeper into the investigation, he uncovered a web of deceit and betrayal that surrounded Allister's life. He discovered that Allister had formed powerful enemies due to his shady business dealings and had recently received anonymous threats.",[5825,13576,13577],{},"Holmes also learned about a hidden room in the mansion's basement. Inside, he found a secret laboratory filled with scientific equipment and mysterious experiments. This room provided insight into Allister's secretive nature and the possibility of a scientific breakthrough.",[5825,13579,13580],{},"With all the pieces of the puzzle slowly coming together, Holmes devised a plan to crack the locked-room mystery. He carefully reconstructed the events leading up to Allister's death and realized that it was not a simple suicide as initially suspected.",[5825,13582,13583],{},"Holmes gathered all the suspects - Evelyn, the business partners, and the mansion staff - in the grand dining hall. He walked them through his process of deduction, revealing their secrets one by one. As he presented the final piece of evidence, the culprit's face turned pale, and a confession spilled out.",[5825,13585,13586],{},"It turned out that Allister's death was meticulously planned by his business partner, Edward. Edward was desperate to gain control over the hidden treasure and had used his knowledge of Allister's scientific experiments to create a device that allowed him to enter and exit the locked room without a trace.",[5825,13588,13589],{},"With the mystery solved and the culprit apprehended, Holmes left the mansion feeling a sense of accomplishment. Another locked-room mystery unraveled by his keen intellect. As he walked away, he couldn't help but wonder what new mysteries awaited him in the future.",[5825,13591,13592],{},"And so, the legend of Samuel Holmes continued to grow, capturing the imagination of all who heard his name, and cementing his reputation as the greatest detective of all time.",[7710,13594,4524],{"id":13595},"story-10",[5825,13597,13598],{},"Once upon a time in the quiet town of Maplewood, renowned detective James Blackwood found himself faced with the most perplexing case of his career - a locked-room mystery. The scene was set at the grand estate of Mr. Brennan, a wealthy businessman known for his extravagant parties.",[5825,13600,13601],{},"It was a foggy autumn evening when Mr. Brennan's lifeless body was discovered in his study. The doors and windows were tightly sealed, and there was no sign of forced entry. The room itself was in perfect order, no scuffle or struggle apparent. It seemed impossible for anyone to have entered or left without leaving a trace.",[5825,13603,13604],{},"Detective Blackwood arrived at the scene, his sharp eyes immediately focused on unraveling the mysterious puzzle before him. He meticulously examined every inch of the study, taking note of every detail, trying to determine what secrets lay within those four walls.",[5825,13606,13607],{},"As he dug deeper into the case, Detective Blackwood discovered that Mr. Brennan had been involved in shady business dealings and had made numerous enemies over the years. Fingers pointed towards rival businessmen, jealous ex-lovers, and even disgruntled employees. The list of suspects grew longer with each passing hour.",[5825,13609,13610],{},"With the aid of his trusted partner, Detective Sophia Bennett, Blackwood conducted thorough interviews with the potential suspects. He skillfully extracted information, hoping to uncover a motive that could lead to the killer. Alibis were examined, timelines meticulously scrutinized, and contradictions ruthlessly exposed.",[5825,13612,13613],{},"As the investigation progressed, a faint trail of evidence began to emerge. Blackwood discovered a hidden compartment in the desk, containing confidential business documents and a locked safe. The safe itself seemed impenetrable, with no visible signs of tampering. Determined not to be defeated by its apparent invincibility, Blackwood tirelessly worked on deciphering the combination.",[5825,13615,13616],{},"Days turned into weeks, and the tension in the town grew palpable. People whispered about the mysterious case, wondering who could have committed such a daring crime. Meanwhile, Blackwood dug deeper into the lives of the suspects, searching for any connection that could break the case wide open.",[5825,13618,13619],{},"Finally, late one night, a breakthrough came. Blackwood discovered a forgotten piece of evidence, a small key found hidden beneath Mr. Brennan's favorite armchair. With a surge of excitement, he rushed back to the estate, anticipation fueling his every step. The key fit perfectly into the previously impenetrable safe.",[5825,13621,13622],{},"Inside, Blackwood found a collection of incriminating documents, providing a clear motive for murder. With the evidence in hand, he summoned all the suspects to the estate, gathering them in the very room where the crime had taken place.",[5825,13624,13625],{},"With measured confidence, Detective Blackwood revealed the killer's identity and method. He exposed their lies and deceit, painting a vivid picture of the events that had unfolded on that fateful night. The shocked expression on the culprit's face was a testament to Blackwood's unparalleled deductive skills.",[5825,13627,13628],{},"And so, the locked-room mystery was solved. The town of Maplewood breathed a collective sigh of relief as justice was served. Detective James Blackwood emerged as a hero, forever etched in the annals of the town's history.",[5825,13630,13631],{},"But for Blackwood, it was just another triumph in a long line of cases. With his undying dedication and brilliant mind, he vowed to continue solving mysteries and bringing justice to those in need. After all, the world can never have too many detectives, especially ones like James Blackwood - relentless in their pursuit of truth.",[7710,13633,4529],{"id":13634},"story-11",[5825,13636,13637],{},"Once upon a time in the quaint town of Ravenwood, Detective Michael Thompson found himself faced with his toughest challenge yet—a locked-room mystery. The scene was set at the luxurious Ravenwood Manor, a grand mansion known for its opulent parties and mysterious secrets.",[5825,13639,13640],{},"It was a dark and stormy night when Thompson received a distress call from the manor's owner, Mr. Jonathan Blackwood. When the detective arrived, he was met with a peculiar sight. The door to the study was locked from the inside, and inside the room lay the lifeless body of Mr. Blackwood himself.",[5825,13642,13643],{},"With his analytical mind spinning, Detective Thompson immediately set to work. He carefully examined the door for signs of forced entry but found none. The windows were securely bolted shut, eliminating any possibility of an intruder gaining access that way.",[5825,13645,13646],{},"Turning his attention to the room itself, Thompson observed the disarray—a clear sign of struggle. Papers were strewn across the desk, and furniture lay overturned. The air was thick with tension as the detective surveyed the scene, his mind racing to piece together the puzzle.",[5825,13648,13649],{},"Thompson began his investigation by interviewing the mansion's staff, who appeared visibly distraught. The butler, Mr. Alexander, claimed he had been in the kitchen, preparing dinner, when the incident occurred. The maid, Miss Elizabeth, was upstairs attending to her duties and claimed she hadn't heard a thing.",[5825,13651,13652],{},"Next, the detective examined the victim more closely. Blackwood lay on the floor, a single gunshot wound to his chest. The gun, a family heirloom, was found next to him, but it had clearly not been fired recently. Thompson knew he had to search for another possible murder weapon.",[5825,13654,13655],{},"As he combed through the room, the swift-thinking detective stumbled upon a hidden compartment in the bookshelf. Inside, he discovered a small vial containing a deadly poison. Could this have been the real cause of death?",[5825,13657,13658],{},"Thompson turned his attention back to the manor's inhabitants and questioned them more intently. The deceased's wife, Mrs. Isabella Blackwood, appeared to be the prime suspect. Though she claimed to be in her bedroom at the time,  her alibi was weak. She had been locked in a bitter dispute with her husband over their wealth and divorce settlement.",[5825,13660,13661],{},"But Detective Thompson knew better than to jump to conclusions. He delved deeper into the case, meticulously cross-referencing evidence and eliminating possible suspects one by one. He had a gut feeling that there was more to the story, something hidden beneath the surface.",[5825,13663,13664],{},"Days turned into weeks as Thompson tirelessly pursued his investigation. He uncovered a web of secrets and deceit, stretching back years. As he pieced together the puzzle, he realized that the mystery was not as straightforward as it seemed.",[5825,13666,13667],{},"Eventually, the detective uncovered a hidden passage in the manor that led to a hidden room—one that only Mr. Blackwood had known about. Inside, Thompson discovered a secret collection of rare and valuable artifacts, painstakingly acquired by the deceased over the years. It was a motive for murder that had been concealed beneath the surface, and only Detective Thompson had managed to unearth it.",[5825,13669,13670],{},"With the evidence gathered, Thompson confronted the true culprit—a greedy business associate of Blackwood's who had been desperate to get his hands on the priceless collection. The associate had planned the perfect crime—a locked-room mystery that would divert suspicion from himself.",[5825,13672,13673],{},"In a dramatic showdown, the truth was finally revealed, and justice was served. The locked-room mystery that had baffled everyone was unraveled by the brilliant mind of Detective Michael Thompson.",[5825,13675,13676],{},"And so, Ravenwood Manor could finally rest in peace, free from the dark secrets that had haunted its halls. Detective Thompson's reputation grew even greater, and he continued to solve the town's most perplexing cases, always with an unrivaled determination and a sharp intellect.",[5825,13678,13679],{},"But deep down, he knew that the locked-room mystery of Ravenwood Manor would forever hold a special place in his heart—an intricate puzzle that had challenged him to the very core and emerged as his greatest triumph.",[7710,13681,4534],{"id":13682},"story-12",[5825,13684,13685],{},"Once upon a time in the bustling city of Bellville, there lived a renowned detective named Detective James Anderson. Known for his sharp intellect and exceptional problem-solving skills, Detective Anderson had earned a reputation for uncovering the truth behind even the most perplexing cases. However, there was one mystery that had eluded him for years - the infamous locked-room mystery.",[5825,13687,13688],{},"One fateful morning, Detective Anderson received a phone call from the Bellville Police Department. They informed him about a bizarre case that had just occurred - a wealthy businessman named Mr. Edward Hargrove had been found dead inside his locked study. The room had been sealed from the inside, leaving no apparent means of escape or entry for anyone else.",[5825,13690,13691],{},"Intrigued by the challenge, Detective Anderson quickly arrived at the Hargrove mansion. He was greeted by a distraught Mrs. Hargrove, who explained that she had discovered her husband's lifeless body when she went to bring him his morning coffee. She swore that she hadn't left the mansion since the previous evening, leaving no possible suspects.",[5825,13693,13694],{},"Undeterred by the lack of leads, Detective Anderson meticulously examined the crime scene. The room was filled with shelves of books, an ornate desk, and a large fireplace. He carefully inspected every inch, searching for any hidden passages or clues that might explain the impossible circumstances.",[5825,13696,13697],{},"As he scrutinized the desk, Detective Anderson noticed a faint imprint on a notepad - it appeared to be a partial note that had been forcibly ripped off. Using his skills, he managed to recreate the note, which read, \"The secret lies within the embers.\"",[5825,13699,13700],{},"Puzzled yet determined, Detective Anderson turned his attention to the fireplace. He carefully removed the logs and raked through the ashes, finding a small key hidden amongst the charred remains. It didn't take long for him to realize that this key might hold the key to solving the case.",[5825,13702,13703],{},"With the key in hand, Detective Anderson retraced his steps to the study door. He noticed a tiny keyhole near the doorknob which had gone unnoticed before. Curiosity guiding his every move, he inserted the key and turned it.",[5825,13705,13706],{},"To his astonishment, the bookshelf lining the study wall swung open, revealing a hidden passageway. It seemed that Mr. Hargrove had constructed a secret escape route in case of emergencies. As Detective Anderson explored further, he found a hidden room containing a secret safe.",[5825,13708,13709],{},"The safe, protected by a complex combination, held documents detailing Mr. Hargrove's involvement in illegal activities. It became clear that his death was not an accident but a meticulously planned murder intended to silence him.",[5825,13711,13712],{},"Detective Anderson immediately deduced that Mrs. Hargrove could not have been responsible for her husband's death, as she was unaware of the hidden room and secret safe. He instinctively understood that the murderer was someone who knew the secret of the embers and was aware of the hidden escape.",[5825,13714,13715],{},"Through careful investigation and interviews, Detective Anderson discovered that Mr. Hargrove had been involved in a criminal organization. His untimely demise must have been orchestrated by someone within the organization, desperate to protect their secrets.",[5825,13717,13718],{},"After days of tireless work, Detective Anderson successfully gathered enough evidence to bring the guilty party to justice. The cunning mastermind behind the locked-room mystery was none other than Mr. Hargrove's business partner, who had orchestrated the elaborate plan to take control of the criminal empire.",[5825,13720,13721],{},"With the mystery solved and justice served, Detective Anderson regained his reputation as the city's finest detective. The locked-room mystery became one of his most celebrated cases, showcasing his remarkable deduction skills and unwavering determination.",[5825,13723,13724],{},"From that day forward, the city of Bellville knew that no enigma, no matter how complex, could escape the brilliant mind of Detective James Anderson.",[7710,13726,4539],{"id":13727},"story-13",[5825,13729,13730],{},"In the dimly lit room, Detective James Anderson stood, his gaze fixed upon the lifeless body lying on the floor. The victim, a well-known art collector named Marcus Donovan, had met his untimely demise inside his heavily fortified mansion. It was a classic locked-room mystery, and it was up to Detective Anderson to unravel the truth behind this baffling crime.",[5825,13732,13733],{},"The room itself was a testament to Donovan's paranoia. Steel bars adorned the windows, and the thick, oak door was reinforced with multiple deadbolts. Anderson examined the room meticulously, searching for any clue that could break the enigma. His experienced eyes scanned for any signs of forced entry or secret passages. But there was none. It seemed as though the room had sealed itself, trapping Marcus Donovan's killer within.",[5825,13735,13736],{},"The detective's attention then turned to the body. Donovan lay on the Persian rug, a look of shock frozen on his face. Anderson noted that there were no visible signs of struggle or injury, suggesting that the cause of death might have been something more sinister. He carefully examined the body, sending samples for analysis.",[5825,13738,13739],{},"While waiting for the lab results, Detective Anderson turned his attention to Donovan's personal life. Marcus Donovan was known for his vast art collection, and his wealth had made him the target of envy and greed. He had numerous enemies in the art world, people who would stop at nothing to obtain his valuable treasures. The detective started to compile a list of potential suspects, reaching out to each one for questioning.",[5825,13741,13742],{},"Days turned into nights as the investigation progressed, but the locked-room mystery remained unsolved. Anderson delved into the minutiae of Donovan's life, uncovering secrets and hidden motives. He meticulously interviewed every individual connected to Marcus, piecing together a complex web of relationships and betrayals. Yet, the truth seemed elusive.",[5825,13744,13745],{},"In a moment of frustration, the detective decided to revisit the crime scene. He meticulously examined every nook and cranny of the room, his mind racing for any missed detail. And then, like a lightning bolt, inspiration struck. Anderson noticed a tiny smudge on the window sill. He quickly collected samples from the smudge and rushed them to the lab.",[5825,13747,13748],{},"The results were astonishing. The smudge was a chemical compound used to dissolve metal. Detective Anderson realized that the killer had used it to weaken the steel bars on the windows, allowing them to escape without a trace. It was a carefully planned murder, executed with precision.",[5825,13750,13751],{},"With the breakthrough evidence in hand, Anderson summoned all the suspects to a grand reveal. The tension in the room was palpable as he laid out the details of the crime. One by one, their faces turned pale, revealing their guilt. Finally, the true killer emerged from the shadows, unable to bear the weight of their deceit any longer.",[5825,13753,13754],{},"In the end, justice prevailed, and the locked-room mystery was unraveled. Detective James Anderson's meticulous detective work had exposed the truth, ensuring that Marcus Donovan's killer would face the consequences of their actions. As he left the mansion, Anderson couldn't help but marvel at the power of deduction and the relentless pursuit of justice.",[5825,13756,13757],{},"Another case solved, another locked-room mystery unlocked. Detective Anderson knew that while the world was filled with darkness, there would always be light shining through - a light called truth. And it was with this conviction that he ventured into the unknown, ready to face any challenge that crossed his path, armed with his sharp mind and unwavering determination.",[7710,13759,4544],{"id":13760},"story-14",[5825,13762,13763],{},"In the quiet town of Puzzleville, Detective Jack Hartley was known for his sharp wit and unparalleled detective skills. His reputation for solving the most complex cases had earned him the title of \"The Puzzle Master.\" And now, he was faced with his greatest challenge yet - a locked-room mystery that had everyone baffled.",[5825,13765,13766],{},"It all began on a dark and stormy night, when the mayor's daughter, Lily, was found dead in the mansion's study. The room was locked from the inside, with no signs of forced entry or exit. The mystery gripped the town, as rumors of foul play filled the air.",[5825,13768,13769],{},"Detective Hartley arrived at the crime scene, wearing his signature trench coat and fedora. The room was a puzzle in itself, filled with countless books, antique furniture, and a grand fireplace. As he examined the room, his keen eyes noticed a small clue - a broken vase on the floor, shards scattered around.",[5825,13771,13772],{},"Hartley questioned the mansion staff, searching for any leads. The housekeeper nervously mentioned hearing a loud noise from the study before the incident. Suspicions heightened as Hartley discovered that Lily had recently inherited a significant fortune, making her the target of envy and greed.",[5825,13774,13775],{},"Intrigued by the broken vase, Hartley delved deeper into its significance. He discovered that it had been a priceless artifact, stolen from a renowned museum years ago. Could this be the motive for Lily's murder?",[5825,13777,13778],{},"Digging through the family history, Hartley uncovered a long-held secret. Lily's grandfather, a notorious art thief, had hidden his stolen loot within the mansion walls. The stolen vase was part of his collection. It seemed that the locked-room mystery was connected to the past, and someone was willing to kill to keep their secret hidden.",[5825,13780,13781],{},"Hartley focused his investigation on the mansion's inhabitants. Each had a motive and an alibi, but the detective knew that appearances could be deceiving. He meticulously gathered evidence, interviewed suspects, and studied the layout of the room.",[5825,13783,13784],{},"Days turned into weeks, and the case seemed unsolvable. But Detective Hartley refused to give up. Late one evening, as he retraced his steps through the mansion, a sudden realization struck him like lightning. It was the missing piece of the puzzle he had been searching for.",[5825,13786,13787],{},"Returning to the study, Hartley examined the walls carefully. His fingers traced the seams between the wallpaper, feeling for any irregularities. And there it was - a hidden door cleverly concealed behind an intricately designed bookcase.",[5825,13789,13790],{},"As Hartley stepped into the hidden room, he found himself surrounded by Lily's grandfather's stolen treasures. But even more importantly, he discovered crucial evidence that would finally unlock the mystery.",[5825,13792,13793],{},"With all the pieces in place, Detective Hartley called for a meeting with the suspects, laying out his findings methodically. Suspense filled the air as he revealed the true identity of the killer - Lily's cousin, Edward. Driven by jealousy and greed, Edward had murdered Lily to take control of the hidden treasure.",[5825,13795,13796],{},"As the handcuffs were placed around Edward's wrists, the town of Puzzleville breathed a collective sigh of relief. The Puzzle Master had done it again, solving the seemingly impossible locked-room mystery that had left everyone perplexed.",[5825,13798,13799],{},"With the case closed, Detective Hartley returned to his office, ready to tackle new challenges. His reputation as the master of puzzles grew even stronger, and Puzzleville knew that they could always rely on him to unravel the most perplexing mysteries.",[7710,13801,4549],{"id":13802},"story-15",[5825,13804,13805],{},"Once upon a time in the peaceful town of Riverdale, there was a renowned detective named Detective James Anderson. Known for his brilliance and sharp instinct, Detective Anderson had solved numerous complex cases throughout his career. However, he had never encountered a mystery as perplexing as the locked-room case that awaited him.",[5825,13807,13808],{},"It was a gloomy evening when a phone call shattered the silence of Detective Anderson's office. The caller, a distressed lady named Mrs. Carter, explained that a murder had taken place in her mansion. Detective Anderson wasted no time and rushed to the scene.",[5825,13810,13811],{},"Upon reaching the Carter mansion, Detective Anderson found himself standing outside a grand room. He examined the door closely; it was locked from the inside, without even a keyhole. The detective puzzled over how the killer could have entered and exited without leaving any trace.",[5825,13813,13814],{},"As he entered the room, a scene of mystery unfolded before his eyes. The room was lavishly decorated with antique furniture, and the victim, Mr. George Carter, lay lifeless on the floor. The cause of death was not immediately evident, as there were no visible wounds or signs of struggle. Detective Anderson knew he had a challenging investigation ahead of him.",[5825,13816,13817],{},"The detective began by questioning the occupants of the mansion. Mr. Carter's wife, Mrs. Carter, was distraught, claiming she had been in the garden when the incident occurred. The household staff - the butler, the maid, and the gardener - all provided alibis that seemed airtight. There appeared to be no immediate suspects.",[5825,13819,13820],{},"Detective Anderson meticulously searched the room for clues. He found a scrap of torn fabric behind a bookshelf, which did not match any of the furniture in the room. Additionally, he discovered a hidden compartment in the wall containing a notepad with cryptic notes. The detective painstakingly deciphered the code, revealing a list of names with amounts of money assigned to each. Each name was followed by the word \"debt.\"",[5825,13822,13823],{},"As the investigation progressed, Detective Anderson's suspicions began to focus on the deceased himself. He delved into Mr. Carter's financial records and discovered that he had been involved in illegal gambling and owed considerable sums of money to multiple individuals. This revealed a possible motive for his murder.",[5825,13825,13826],{},"Bringing the suspects together, Detective Anderson shared his findings. He revealed that the locked-room murder was an elaborate plan to deceive the authorities. The killer had entered the room before the murder and hidden behind the bookshelf, carefully observing Mr. Carter. When the opportune moment arose, the killer emerged, incapacitated Mr. Carter without leaving any physical evidence, and escaped undetected.",[5825,13828,13829],{},"The detective used the torn fabric to identify the killer's clothing and linked it to the debt collectors mentioned in the cryptic notes. It turned out that one of them had been posing as a member of the household staff, deceiving everyone with a carefully crafted alibi.",[5825,13831,13832],{},"With the truth exposed, the killer confessed to their crime. It was a tale of revenge, deceit, and hidden identities. The locked-room mystery had been unraveled, thanks to the brilliant deductions and unwavering determination of Detective James Anderson.",[5825,13834,13835],{},"As Detective Anderson left the Carter mansion, the sun began to break through the clouds, casting light on the once-shrouded room. The residents of Riverdale breathed a collective sigh of relief, knowing that their beloved detective had restored peace and justice to their town once again.",[7710,13837,4554],{"id":13838},"story-16",[5825,13840,13841],{},"Detective James Anderson was no stranger to solving complex cases, but the locked-room mystery that awaited him today proved to be one of the most perplexing he had encountered in his career.",[5825,13843,13844],{},"It all began when he received a call from the local police department. A renowned scientist, Dr. Benjamin White, had been found dead in his study, with no sign of forced entry. The room had been locked from the inside, and the only window was shut tight. The scene was baffling, as there seemed to be no plausible explanation for how anyone could have entered or exited the room.",[5825,13846,13847],{},"Upon arrival at the crime scene, Detective Anderson meticulously examined every inch of the study. The shelves were lined with books on various scientific subjects, the desk cluttered with papers and equipment, and a chalkboard filled with complex formulas and equations. But nothing seemed out of the ordinary – no hidden passages or secret compartments.",[5825,13849,13850],{},"As he interviewed the staff and family members, Detective Anderson learned that Dr. White had been working on a groundbreaking scientific project. He had made enemies in the scientific community who would stop at nothing to discredit his work. Could one of them be responsible for his untimely demise?",[5825,13852,13853],{},"With no clear leads, Detective Anderson decided to delve deeper into Dr. White's research. He spent countless hours studying his work, trying to find any clues that might lead him to the truth. The more he dug, the more he realized the significance of Dr. White's discoveries – a breakthrough that could revolutionize the way we understand the universe.",[5825,13855,13856],{},"Meanwhile, the detective's intuition caught a glimpse of something peculiar. He had a hunch that the key to solving the locked-room mystery lay in a detail that had been overlooked. Returning to the crime scene, he closely examined the window. It was an old-fashioned casement window, painted shut. But as he ran his fingers along the frame, he felt a slight irregularity, barely noticeable to the naked eye.",[5825,13858,13859],{},"Utilizing his skills in forensics, Detective Anderson carefully lifted the paint on the frame. Beneath it, he found a tiny pinhole – a meticulously drilled hole that would allow someone outside the room to manipulate the latch. It seemed that the window had been opened from the outside before being closed again.",[5825,13861,13862],{},"With this crucial breakthrough, Detective Anderson's investigation took a new turn. He began to suspect that the culprit had expert knowledge of the room's layout and had planned the murder meticulously. But who could it be?",[5825,13864,13865],{},"As the detective narrowed down his list of suspects, he discovered that one of Dr. White's colleagues, Professor Ethan Lawson, had been seen near the study that fateful night. A brilliant mind himself, Professor Lawson had always been envious of Dr. White's success. Could he have taken his envy to such extremes?",[5825,13867,13868],{},"The pieces of the puzzle started falling into place. Detective Anderson learned that Professor Lawson had been conducting secret experiments of his own, using Dr. White's research as a foundation. He had been working on a similar project but had failed to replicate Dr. White's results. Fueled by jealousy and the desire to prove himself, he saw an opportunity to eliminate his rival and take credit for his groundbreaking discoveries.",[5825,13870,13871],{},"Armed with this newfound knowledge, Detective Anderson confronted Professor Lawson with the evidence. Cornered, the professor admitted to the crime, revealing how he had carefully planned and executed the murder to make it appear as a locked-room mystery.",[5825,13873,13874],{},"Justice was served, and the scientific community mourned the loss of Dr. White, but celebrated his groundbreaking contributions. Detective Anderson's meticulous investigation had not only solved the locked-room mystery, but it had also ensured that the truth prevailed over envy and deceit.",[5825,13876,13877],{},"As the case concluded, Detective Anderson reflected on the complexity of his profession. In the world of crime-solving, no mystery was truly unsolvable. With a keen eye for detail and unwavering determination, even the most baffling cases could be unraveled, bringing justice to those who deserved it. And so, he continued his journey as a detective, ready to face whatever challenge lay ahead.",[7710,13879,4559],{"id":13880},"story-17",[5825,13882,13883],{},"In the heart of the bustling city, there stood an old, grand mansion. The mansion had a reputation of being haunted, with whispers of eerie occurrences echoing through its halls. Many believed that it was cursed, its rooms hiding unsolved mysteries for years. One such mystery baffled both the locals and the authorities - the case of the locked-room murder.",[5825,13885,13886],{},"It all began on a dark and stormy night when a prominent businessman, Mr. Jonathan Blackwood, was found dead in one of the mansion's rooms. The door to the room was locked from the inside, and there were no signs of forced entry. It seemed impossible - how could someone be murdered in a locked room?",[5825,13888,13889],{},"Detective Michael Andersson, well-known for his sharp mind and unwavering determination, was assigned to the case. As he entered the mansion, the creaking of the wooden floor beneath him echoed through the silence. The detective knew he had a challenging task ahead.",[5825,13891,13892],{},"He started his investigation by interviewing the mansion's inhabitants. Each person had an alibi, claiming to have been in a different part of the house when the murder occurred. The suspects included Mr. Blackwood's business partner, Mr. Edward Stone, a jealous rival, Ms. Victoria Parker, and the loyal butler, Mr. Arthur Collins.",[5825,13894,13895],{},"Determined to unravel the truth, Detective Andersson meticulously examined the crime scene. The room itself was a spectacle of opulence, adorned with antique furniture and paintings. The only window was bolted shut, and the fireplace remained untouched, ruling out any possibilities of escape or hiding evidence.",[5825,13897,13898],{},"As he scrutinized every inch of the room, the detective's keen eyes fell upon a small, silver key tucked away in the corner. It appeared to be out of place amongst the elegance of the surroundings. With a sense of intrigue, he pocketed the key, convinced that it held some significance in solving the mysterious murder.",[5825,13900,13901],{},"Days turned into weeks, and the detective tirelessly pursued every lead. He meticulously analyzed the testimonies, searching for inconsistencies and subtle clues that could unravel the locked-room mystery. The wide range of emotions displayed by the suspects, their motives, and their connections to the victim were all meticulously examined.",[5825,13903,13904],{},"Finally, a breakthrough came when Detective Andersson discovered a hidden passage beneath the mansion. It led to a secret room filled with diaries and letters, revealing a network of deceit and betrayal. The investigation took an unexpected turn as it unraveled a web of blackmail and revenge.",[5825,13906,13907],{},"As the detective confronted each suspect with the evidence he had gathered, their carefully constructed facades slowly crumbled. The truth came tumbling out, like pieces of a puzzle fitting together. The silver key he had found turned out to be the one that locked the room from the inside, connecting the crime scene to the suspects.",[5825,13909,13910],{},"In a dramatic confrontation, the truth behind the locked-room murder was finally revealed. The guilty party turned out to be Ms. Victoria Parker, motivated by a desire to eliminate her competition and claim Mr. Blackwood's business empire for herself. She had meticulously planned the crime, manipulating events to make it seem like an impossible locked-room mystery.",[5825,13912,13913],{},"With her motive exposed and the evidence against her undeniable, Ms. Parker was apprehended, ending her reign of deception. The haunted grand mansion finally found peace, as the secrets within its walls were laid bare.",[5825,13915,13916],{},"Detective Andersson emerged as the hero who had unraveled the enigma of the locked-room murder. His perseverance, attention to detail, and sharp instincts had proved invaluable in solving the case. The city hailed him as a legend, and the mansion gained a new reputation - a place where justice prevailed over dark secrets.",[5825,13918,13919],{},"And so, the detective's tale of the locked-room murder became a legend, whispered in the corridors of law enforcement for years to come. It served as a reminder that even in the most perplexing cases, the truth could be found if one had the determination to search for it.",[7710,13921,4564],{"id":13922},"story-18",[5825,13924,13925],{},"There once was a famous detective named Detective Smith. He was known for his brilliant mind and his ability to solve the most complex of cases. One day, he received a call from the local police department about a locked-room mystery. Intrigued, Detective Smith rushed to the scene.",[5825,13927,13928],{},"Upon arrival, he found himself standing outside a grand mansion. The mansion belonged to Mr. Jonathan Hartley, a wealthy businessman. As Detective Smith entered the mansion, he was greeted by a large crowd of police officers and curious onlookers. The room where the mystery took place was the study.",[5825,13930,13931],{},"Inside the study, Detective Smith saw a lifeless body lying on the floor. It was Mr. Hartley himself. The door to the study was locked from the inside, and there were no signs of forced entry. The windows were all securely locked as well. The only key to the study was found in Mr. Hartley's pocket.",[5825,13933,13934],{},"Detective Smith began his investigation by examining the crime scene. He noticed a faint smell of bitter almonds, which he recognized as the scent of cyanide. He deduced that Mr. Hartley had been poisoned. The investigation had to move swiftly, as cyanide dissipates rapidly.",[5825,13936,13937],{},"The detective meticulously collected evidence, dusting for fingerprints, examining the room for any hidden compartments or secret passageways, and questioning witnesses. But the more he dug into the case, the more perplexing it became. There seemed to be no plausible explanation as to how the killer entered and exited the locked room.",[5825,13939,13940],{},"Days turned into weeks, and the mystery continued to baffle Detective Smith. He explored every hypothesis, from an elaborate murder plot to a supernatural occurrence. But each time, he hit a dead end.",[5825,13942,13943],{},"One evening, while sitting alone in his office, Detective Smith had a brilliant breakthrough. He remembered a book he had once read about illusionists and their mastery of misdirection. With this in mind, he decided to revisit the crime scene.",[5825,13945,13946],{},"Back at the mansion, Detective Smith examined the bookshelves in the study. To his surprise, he found a hidden lever behind a seemingly ordinary book. Curiosity piqued, he pulled the lever, and a secret door swung open, revealing a hidden passage.",[5825,13948,13949],{},"The passage led him to a secret room adjacent to the study. In the room, he discovered evidence that Mr. Hartley was involved in illegal activities. It became clear to Detective Smith that the locked-room mystery was a cleverly staged murder to cover up Mr. Hartley's true intentions.",[5825,13951,13952],{},"With this new revelation, the detective pieced together the events leading up to Mr. Hartley's death. It was an elaborate plan executed by someone close to him who knew about the hidden room and wanted to expose his illicit activities.",[5825,13954,13955],{},"Armed with this knowledge, Detective Smith gathered all the evidence and called for a meeting with the police and the suspects. He masterfully laid out the case, pointing out the motive, means, and opportunity for each suspect.",[5825,13957,13958],{},"In a dramatic finale, Detective Smith revealed the identity of the killer and detailed their intricate plan. The killer was arrested, and justice was served.",[5825,13960,13961],{},"The locked-room mystery had been solved, thanks to the brilliant mind and unwavering determination of Detective Smith. He once again proved why he was considered one of the greatest detectives of his time.",[5825,13963,13964],{},"As the sun set on the grand mansion, Detective Smith quietly stepped out into the darkness, knowing that another case awaited him, ready to challenge his intellect and push him to the limits of his abilities.",[7710,13966,4569],{"id":13967},"story-19",[5825,13969,13970],{},"Once upon a time, in the town of Oakwood, there was a highly skilled detective named Samantha Holmes. She was known for her remarkable ability to solve complex cases, and her reputation as the best detective in town was widely acknowledged. One day, Samantha was called to investigate a peculiar locked-room mystery that had the entire town buzzing with curiosity.",[5825,13972,13973],{},"The case unfolded in the grand mansion of Mr. Edward Pemberton, a wealthy businessman and art collector. It was a stormy night when a lavish dinner party was being held at his mansion. The guests arrived in their finest attire, eager to enjoy an evening of luxury and indulgence. The atmosphere was electric with laughter and animated conversations flowing freely.",[5825,13975,13976],{},"As the night progressed, a loud bang echoed throughout the mansion, causing a momentary silence to fall upon the party. When the guests rushed to investigate, they were met with a disturbing sight. The door to the study, where Mr. Pemberton kept his most prized possessions, was locked from the inside, and no one could find a key.",[5825,13978,13979],{},"Samantha Holmes arrived at the scene, ready to examine the evidence and unravel the mystery. She began by interviewing the guests, each providing their alibis and claiming their innocence. She meticulously examined the door, searching for any signs of tampering. The lock appeared intact, and there were no visible forced entry marks.",[5825,13981,13982],{},"Undeterred, Samantha delved deeper into the investigation. She scrutinized the room itself, meticulously inspecting every nook and cranny. Her keen eye detected minute details that others might have missed. There, hidden within an ornate vase, she discovered a small key. It seemed to fit the lock perfectly, but there was still one puzzle left to solve – who had the motive to steal from Mr. Pemberton?",[5825,13984,13985],{},"Samantha reasoned that the culprit must be among the dinner party attendees. She gathered the guests in the grand hall and began her interrogation. Each person was questioned, their personas illuminated under the relentless gaze of Samantha's piercing eyes. She observed their body language, their reactions to her pointed questions, and their attempts to divert suspicion to others.",[5825,13987,13988],{},"As she stormed through the interrogations, Samantha detected subtle inconsistencies, hidden glimmers of guilt. It was the elegant widow, Mrs. Victoria Ashford, who gave herself away. With her trembling hands and evasive answers, Samantha had found her prime suspect. But what was Mrs. Ashford's motive?",[5825,13990,13991],{},"Samantha dug into Mrs. Ashford's past, peeling back layers of secrets and lies. She discovered a hidden affair between Mrs. Ashford and Mr. Pemberton. It seemed that jealousy and greed had driven her to steal one of the valuable paintings from the study.",[5825,13993,13994],{},"Armed with this knowledge, Samantha confronted Mrs. Ashford, who finally confessed to her crime. She had used the key from the vase, replaced it with a duplicate, and cunningly locked herself in the study to divert suspicion. Samantha had cracked the locked-room mystery, solving the case that had baffled everyone else.",[5825,13996,13997],{},"The news of Samantha's brilliant detective work spread like wildfire through the town of Oakwood. She was hailed as a hero, and her skills as a detective became legendary. From that day forward, no locked-room mystery was too challenging for Samantha Holmes. Her legacy lived on, inspiring future generations of detectives to unlock the secrets hidden behind closed doors.",[5825,13999,14000],{},"And so, the case of the locked-room mystery was closed, thanks to the unwavering determination and sharp intellect of Detective Samantha Holmes. The town of Oakwood slept a little safer that night, resting in the knowledge that justice had been served, and the truth had prevailed.",[7710,14002,4574],{"id":14003},"story-20",[5825,14005,14006],{},"It was a gloomy winter evening when Detective James Thompson received a call about a peculiar case. A renowned novelist, Mr. Victor Grayson, had been found dead in his study, locked from the inside. The room had no windows and the only entrance was through a heavy wooden door. It seemed impossible for anyone to have entered or exited without leaving a trace. With a determined spirit, Detective Thompson set out to unravel the mysteries hidden within the locked-room.",[5825,14008,14009],{},"As Detective Thompson stepped into the study, he carefully examined his surroundings. The room was filled with bookshelves, stacks of papers, and an antique writing desk at the center. The deceased lay sprawled on the floor, dressed in his finest suit, with a perplexed expression frozen on his face. His manuscript, unfinished, rested next to him.",[5825,14011,14012],{},"The detective meticulously observed every detail, from the arrangement of books to the desk where the writer spent countless hours. He knew that beneath the surface, there was a labyrinth of clues waiting to be discovered. He meticulously dusted for fingerprints, analyzed footprints, and examined the furniture for any signs of tampering.",[5825,14014,14015],{},"As he dug deeper into Mr. Grayson's life, Detective Thompson discovered a web of secrets, jealousy, and hidden motives. The victim had been in the midst of a bitter dispute with his publisher, Charles Aldridge, over a novel he believed was unjustly rejected. Could Charles be the killer?",[5825,14017,14018],{},"Thompson confronted Charles, who vehemently denied any involvement in the murder. But the detective sensed something was amiss. His keen intuition led him to search Charles' office, where he stumbled upon old letters exchanged between the two. It became apparent that Charles had a strong motive to eliminate Mr. Grayson.",[5825,14020,14021],{},"But Detective Thompson was not one to jump to conclusions. He continued his investigation, speaking with the victim's family, friends, and neighbors. He unraveled a complex web of affairs and betrayed trust. Mr. Grayson's wife, Victoria, had been having an affair with his closest friend, Anthony Davis. Could they have conspired to kill the renowned writer and make it appear as a locked-room mystery?",[5825,14023,14024],{},"Thompson brought Victoria and Anthony in for questioning separately. With his skilled interrogation techniques, he managed to unravel their secrets. Victoria confessed to killing her husband in a fit of rage, while Anthony admitted to helping her stage the locked-room scenario to protect her. Their love had driven them to desperate measures, but they couldn't escape the detective's scrutiny.",[5825,14026,14027],{},"With the truth finally revealed, Detective Thompson meticulously gathered the evidence and presented his case to the court. Victoria and Anthony were charged with the murder of Mr. Grayson, and justice was served.",[5825,14029,14030],{},"As the case came to a close, Detective Thompson reflected on the power of deduction, intuition, and meticulous investigation. The locked-room mystery had been unraveled, proving that even the most perplexing crimes can be solved with a determined mind and careful examination of the facts.",[5825,14032,14033],{},"And so, another chapter closed in the life of Detective James Thompson, leaving behind a tale of intrigue, deception, and a locked-room mystery that had been meticulously unraveled.",[7147,14035,14036],{},"html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sTrkL, html code.shiki .sTrkL{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":45,"searchDepth":15,"depth":15,"links":14038},[14039,14040,14041,14042,14043,14044],{"id":12848,"depth":15,"text":4450},{"id":12872,"depth":15,"text":4455},{"id":12893,"depth":15,"text":4460},{"id":12914,"depth":15,"text":4465},{"id":13188,"depth":15,"text":4470},{"id":13238,"depth":15,"text":4475,"children":14045},[14046,14047,14048,14049,14050,14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065],{"id":13241,"depth":56,"text":4479},{"id":13280,"depth":56,"text":4484},{"id":13319,"depth":56,"text":4489},{"id":13355,"depth":56,"text":4494},{"id":13397,"depth":56,"text":4499},{"id":13436,"depth":56,"text":4504},{"id":13472,"depth":56,"text":4509},{"id":13511,"depth":56,"text":4514},{"id":13553,"depth":56,"text":4519},{"id":13595,"depth":56,"text":4524},{"id":13634,"depth":56,"text":4529},{"id":13682,"depth":56,"text":4534},{"id":13727,"depth":56,"text":4539},{"id":13760,"depth":56,"text":4544},{"id":13802,"depth":56,"text":4549},{"id":13838,"depth":56,"text":4554},{"id":13880,"depth":56,"text":4559},{"id":13922,"depth":56,"text":4564},{"id":13967,"depth":56,"text":4569},{"id":14003,"depth":56,"text":4574},"2023-07-20","img\u002Frobot-reading-script.jpg","https:\u002F\u002Fmastodon.social\u002F@awwaiid\u002F110749392784672266",{},{"title":4445,"description":12837},"TLT - 2023.07.20 - Self Judging Stories",[5980],"sxKJ0fS09Xh4N6FUubB8kSXy6Ws3PMxM7osSCzk7ftw",{"id":14075,"title":4440,"body":14076,"createdAt":14143,"description":14080,"draft":5972,"extension":5973,"image":14094,"mastodonThread":14144,"meta":14145,"navigation":5976,"path":4439,"seo":14146,"stem":14147,"tags":14148,"updatedAt":14066,"__hash__":14149},"content\u002FTLT - 2023.04.30 - Paper Snake Game.md",{"type":5822,"value":14077,"toc":14141},[14078,14081,14089,14095,14098,14101,14110,14113,14116,14124,14127],[5825,14079,14080],{},"Creating a simple snake game with the help of ChatGPT.",[5825,14082,14083,12063,14086],{},[6416,14084],{"src":14085},"\u002Fimg\u002Fpaper-snake-pixel-art.jpg",[5834,14087,14088],{},"Pixelated snake, possibly in the desert, somewhat two-dimensional. Image by Bing Image Creator.",[5825,14090,14091],{},[6416,14092],{"alt":14093,"src":14094},"paper snake screenshot","img\u002Fpaper_snake_screenshot.png",[5825,14096,14097],{},"I was chatting with Mario about a school project he was working on. Essentially, he needed to write a program in Elm (based on a list of lesser-used languages) that exemplified what the language is typically used for. Since Elm is a highly reactive, web-centric language, I suggested creating a game. He chose Snake, a simple and solid option.",[5825,14099,14100],{},"For some reason, I began contemplating Snake, specifically considering potential design or game elements that could be added to it. Two ideas came to mind. The first was to render the snake as a flat piece of paper, with each segment possibly being a tiny scrap of paper, and animate it in a style reminiscent of stop-motion animation. The second idea involved the snake \"jumping over\" or \"diving under\" its existing segments. I'm sure these ideas have been explored before, but they sounded fun :)",[5825,14102,14103,14104,14109],{},"Mario completed his traditional Snake game before I could even share my paper-snake concept with him, so I decided to give it a try myself. I also wanted to practice using TypeScript. After finding a nice ",[5950,14105,14108],{"href":14106,"rel":14107},"https:\u002F\u002Fgithub.com\u002Fourcade\u002Fphaser3-typescript-vite-template",[5954],"PhaserJS + Typescript + Vite template"," I was off and running!",[5825,14111,14112],{},"While experimenting with various technologies, I thought I'd mix in some practice with ChatGPT. I loaded it up and began asking questions about building a Snake game using this stack. Since the Snake game concept is so common and straightforward... I found that ChatGPT had TONS of knowledge about implementing Snake. I prompted it in a few different ways to incorporate my style and game concepts, and I think it saved me hours of research time.",[5825,14114,14115],{},"Within one afternoon, I (or should I say, we?) had a working game with the jumping feature and everything! I'm pretty sure ChatGPT could have written almost this whole thing from scratch\u002Fmemory, btw. But it also followed my direction on naming and organization.",[5825,14117,14118,12063,14121],{},[6416,14119],{"alt":45,"src":14120},"img\u002Fpaper-snake-v1.gif",[5834,14122,14123],{},"GIF demonstrating Paper Snake. Red shadows are when the snake is jumping.",[5825,14125,14126],{},"It does not yet look like super cool paper animations, heh.",[5825,14128,14129,14130,14135,14136,7203],{},"You can see the ",[5950,14131,14134],{"href":14132,"rel":14133},"https:\u002F\u002Fawwaiid.github.io\u002Fpaper-snakes\u002F",[5954],"current version of the game"," and the corresponding ",[5950,14137,14140],{"href":14138,"rel":14139},"https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fpaper-snakes",[5954],"github repo for paper-snakes",{"title":45,"searchDepth":15,"depth":15,"links":14142},[],"2023-04-30","https:\u002F\u002Fmastodon.social\u002F@awwaiid\u002F110285863632396209",{},{"title":4440,"description":14080},"TLT - 2023.04.30 - Paper Snake Game",[5980],"IrqD3JwLASthzHMw6qsdBWvM715jNQTIfCPX1-IxN7I",{"id":14151,"title":4435,"body":14152,"createdAt":14457,"description":14156,"draft":5972,"extension":5973,"image":14458,"mastodonThread":14459,"meta":14460,"navigation":5976,"path":4434,"seo":14461,"stem":14462,"tags":14463,"updatedAt":14464,"__hash__":14465},"content\u002FTLT - 2023.04.22 - Chokepoints.md",{"type":5822,"value":14153,"toc":14455},[14154,14157,14165,14180,14183,14186,14189,14393,14396,14399,14408,14411,14426,14433,14436,14439,14442,14449,14452],[5825,14155,14156],{},"Notes from the Changelog interview with Cory Doctorow on Chokepoint Capitalism",[5825,14158,14159,12063,14162],{},[6416,14160],{"src":14161},"\u002Fimg\u002Frobot_lemonade_stand.jpg",[5834,14163,14164],{},"Lemonade stand operated (or perhaps supervised?) by a robot. Image by Bing Image Creator.",[5825,14166,14167,14168,14173,14174,14179],{},"While driving to and waiting for Millie (the car) to get maintenanced, I listened to ",[5950,14169,14172],{"href":14170,"rel":14171},"https:\u002F\u002Fchangelog.com\u002Fpodcast\u002F535",[5954],"Examining capitalism's chokepoints",", an interview with Cory Doctorow discussing his book ",[5950,14175,14178],{"href":14176,"rel":14177},"https:\u002F\u002Fcraphound.com\u002Fcategory\u002Fchokepoint\u002F",[5954],"Chokepoint Capitalism",". This touched on all sorts of things, but right up at the front was an off-topic question - How is Cory so prolific?",[5825,14181,14182],{},"Among some other things, Cory suggested that ... well, that practice makes perfect. And that instead of just copy\u002Fpasting a link into slack like I usually do, I should write up some notes trying to capture, for other people, what I found interesting or special about the link. So yeah. Good idea. Let's do that.",[5825,14184,14185],{},"Problem: I don't really have or want \"blog\" software. I ran my site as a publicly-editable wiki for like 20 years. It is now a nuxt-content-driven static site, basically. Super easy to open a file in vim and edit more-or-less markdown. But do I do that? No, not really. So of course, then I'm like ... if only I could run a command to pop open my editor and start writing writing writing away. Great!",[5825,14187,14188],{},"Turns out I already did that, made a horrid little shell script that goes like this:",[6971,14190,14192],{"className":8277,"code":14191,"language":8279,"meta":45,"style":45},"#!\u002Fbin\u002Fbash\n\nset +x\n\nFILE_DATE=`date '+%Y.%m.%d'`\nTEMPLATE_DATE=`date '+%Y-%m-%d'`\n\nTITLE=${*:-Untitled}\nNEWFILE=\"TLT - $FILE_DATE - $TITLE.md\"\n\necho \"Creating: $NEWFILE\"\n\ncd ~\u002Ftlt\u002Fthelackthereof\u002Fcontent\ncp -n \"Blog Template TLT - 2023.01.01 - Blog Template.md\" \"$NEWFILE\"\nperl -pi -e \"s\u002FTEMPLATE_TITLE\u002F$TITLE\u002F\" \"$NEWFILE\"\nperl -pi -e \"s\u002FTEMPLATE_DATE\u002F$TEMPLATE_DATE\u002F\" \"$NEWFILE\"\nvim \"$NEWFILE\"\n",[6002,14193,14194,14199,14203,14211,14215,14231,14245,14249,14265,14287,14291,14304,14308,14316,14334,14359,14382],{"__ignoreMap":45},[5853,14195,14196],{"class":7026,"line":9},[5853,14197,14198],{"class":8286},"#!\u002Fbin\u002Fbash\n",[5853,14200,14201],{"class":7026,"line":15},[5853,14202,7045],{"emptyLinePlaceholder":5976},[5853,14204,14205,14208],{"class":7026,"line":56},[5853,14206,14207],{"class":7103},"set",[5853,14209,14210],{"class":7059}," +x\n",[5853,14212,14213],{"class":7026,"line":5212},[5853,14214,7045],{"emptyLinePlaceholder":5976},[5853,14216,14217,14220,14222,14225,14228],{"class":7026,"line":7077},[5853,14218,14219],{"class":7033},"FILE_DATE",[5853,14221,7053],{"class":7029},[5853,14223,14224],{"class":7059},"`",[5853,14226,14227],{"class":8564},"date",[5853,14229,14230],{"class":7059}," '+%Y.%m.%d'`\n",[5853,14232,14233,14236,14238,14240,14242],{"class":7026,"line":7083},[5853,14234,14235],{"class":7033},"TEMPLATE_DATE",[5853,14237,7053],{"class":7029},[5853,14239,14224],{"class":7059},[5853,14241,14227],{"class":8564},[5853,14243,14244],{"class":7059}," '+%Y-%m-%d'`\n",[5853,14246,14247],{"class":7026,"line":7094},[5853,14248,7045],{"emptyLinePlaceholder":5976},[5853,14250,14251,14254,14256,14259,14262],{"class":7026,"line":7100},[5853,14252,14253],{"class":7033},"TITLE",[5853,14255,7053],{"class":7029},[5853,14257,14258],{"class":7033},"${",[5853,14260,14261],{"class":7029},"*:-",[5853,14263,14264],{"class":7033},"Untitled}\n",[5853,14266,14267,14270,14272,14275,14278,14281,14284],{"class":7026,"line":7110},[5853,14268,14269],{"class":7033},"NEWFILE",[5853,14271,7053],{"class":7029},[5853,14273,14274],{"class":7059},"\"TLT - ",[5853,14276,14277],{"class":7033},"$FILE_DATE",[5853,14279,14280],{"class":7059}," - ",[5853,14282,14283],{"class":7033},"$TITLE",[5853,14285,14286],{"class":7059},".md\"\n",[5853,14288,14289],{"class":7026,"line":7118},[5853,14290,7045],{"emptyLinePlaceholder":5976},[5853,14292,14293,14296,14299,14302],{"class":7026,"line":8481},[5853,14294,14295],{"class":7103},"echo",[5853,14297,14298],{"class":7059}," \"Creating: ",[5853,14300,14301],{"class":7033},"$NEWFILE",[5853,14303,8311],{"class":7059},[5853,14305,14306],{"class":7026,"line":8495},[5853,14307,7045],{"emptyLinePlaceholder":5976},[5853,14309,14310,14313],{"class":7026,"line":13169},[5853,14311,14312],{"class":7103},"cd",[5853,14314,14315],{"class":7059}," ~\u002Ftlt\u002Fthelackthereof\u002Fcontent\n",[5853,14317,14319,14322,14325,14328,14330,14332],{"class":7026,"line":14318},14,[5853,14320,14321],{"class":8564},"cp",[5853,14323,14324],{"class":7073}," -n",[5853,14326,14327],{"class":7059}," \"Blog Template TLT - 2023.01.01 - Blog Template.md\"",[5853,14329,8304],{"class":7059},[5853,14331,14301],{"class":7033},[5853,14333,8311],{"class":7059},[5853,14335,14337,14340,14343,14345,14348,14350,14353,14355,14357],{"class":7026,"line":14336},15,[5853,14338,14339],{"class":8564},"perl",[5853,14341,14342],{"class":7073}," -pi",[5853,14344,8301],{"class":7073},[5853,14346,14347],{"class":7059}," \"s\u002FTEMPLATE_TITLE\u002F",[5853,14349,14283],{"class":7033},[5853,14351,14352],{"class":7059},"\u002F\"",[5853,14354,8304],{"class":7059},[5853,14356,14301],{"class":7033},[5853,14358,8311],{"class":7059},[5853,14360,14362,14364,14366,14368,14371,14374,14376,14378,14380],{"class":7026,"line":14361},16,[5853,14363,14339],{"class":8564},[5853,14365,14342],{"class":7073},[5853,14367,8301],{"class":7073},[5853,14369,14370],{"class":7059}," \"s\u002FTEMPLATE_DATE\u002F",[5853,14372,14373],{"class":7033},"$TEMPLATE_DATE",[5853,14375,14352],{"class":7059},[5853,14377,8304],{"class":7059},[5853,14379,14301],{"class":7033},[5853,14381,8311],{"class":7059},[5853,14383,14385,14387,14389,14391],{"class":7026,"line":14384},17,[5853,14386,9188],{"class":8564},[5853,14388,8304],{"class":7059},[5853,14390,14301],{"class":7033},[5853,14392,8311],{"class":7059},[5825,14394,14395],{},"But now, if I'm thinking of Cory's advice, I might actually be juggling several drafts or jotting down some partial thoughts. Next thing you know, I'm trying to write a CLI in Typescript (for reasons) and .... not writing a blog post. As my niece says, The Struggle Is Real!!!",[5825,14397,14398],{},"Anyway. Where was I? Oh, capitalism.",[5825,14400,14401,14402,14407],{},"I've been playing with ",[5950,14403,14406],{"href":14404,"rel":14405},"https:\u002F\u002Fopenai.com\u002Fblog\u002Fchatgpt",[5954],"ChatGPT"," a lot and even set myself up with the paid version to experiment with GPT-4. It's a fascinating tool and intriguing to explore. I find that to get interesting or useful things out of it, I must change what I feed in. It's not quite like a Markov chain bot or an Alexa Q&A; it's more like a brainstorming tool that has been fed The Internet. Right off the bat, I can't really expect answers that The Internet doesn't know, especially technical ones. If there's no hint of an answer on Stack Overflow, it's probably not going to come up with one here. Next, you have to feed it with some context. If you approached someone in a café and asked them to give you an itinerary for a vacation you're going on, they could do it, but they'd do a poor job if you didn't give them some information about your tastes and goals.",[5825,14409,14410],{},"A significant part of this is exploring the question for myself - now what? What comes next? What do we do with this? How will it change things?",[5825,14412,14413,14414,14419,14420,14425],{},"Many of my friends, acquaintances, and connections on ",[5950,14415,14418],{"href":14416,"rel":14417},"https:\u002F\u002Fmastodon.social\u002F@awwaiid",[5954],"Mastodon"," and elsewhere discuss how these Large Language Models (LLMs) are violating their creative and copyright rights by slurping it all in, mashing it all up, and spitting it all out (sometimes without much mashing) without citing their original work. Some of these same friends think that ",[5950,14421,14424],{"href":14422,"rel":14423},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAaron_Swartz",[5954],"Aaron Swartz"," was over-prosecuted for exfiltrating JSTOR science articles. My sympathies are mixed here. I want people to be compensated for their labor and creativity, and I want information to be free, and I don't want monopolistic middlemen to leverage an advantage in the middle without adding value. I personally publish most things under a license that explicitly or implicitly allows my content to be republished, remixed, etc., ideally with a citation. But I'd be happy with being cited as being an incorporated part of every output. I think the LLM publishers should say, \"Here is the dataset that we trained on and every contribution to it.\" And then I'd even be proud to be part of it.",[5825,14427,14428,14429,14432],{},"The podcast. Remember the podcast? The podcast delves into what happens when humans are not only augmented by machines, LLMs among them, but also ",[5834,14430,14431],{},"controlled"," by the machines. Cory calls this the Reverse-Centaur. Furthermore, what happens when the economic system is further twisted to where you are stuck in this situation, controlled by monopolistic, possibly non-value-adding middle players? This he calls Chickenized Reverse-Centaurs. They break down in some detail what this currently means, and it is scary. I have to remember how fortunate I am, celebrate it, and see if I can help others obtain some control over their lives as well.",[5825,14434,14435],{},"Still, the Centaur concept is powerful. Tools can help us do things faster and better. Having the right tool for something can change a project from hours to minutes. I'd like to know how LLMs can accelerate us, and selfishly me, in day-to-day life.",[5825,14437,14438],{},"I sometimes discuss global warming with my father-in-law. He thinks it's a scam on many levels. I generally take the mainstream view that we should probably be more scared than we are, although I also believe that we should accept the fact that the Earth is increasingly becoming a garden, and we need to make it an awesome one. Anyway, he sends me some lengthy and somewhat complicated videos on climate science and alternative models. YouTube has transcripts. I could feed the transcript to ChatGPT and have it give me a summary and critique some of the points.",[5825,14440,14441],{},"But can I trust it?",[5825,14443,14444,14445,14448],{},"One of the differences between modern Capitalism and Ideal Capitalism is that Ideal Capitalism is founded on the idea of information transparency. Efficiency in a market is all about setting the right price based on all the correct factors, as I understand it. So what happens when we don't know the real cost of something, like global warming? The price is too low. But what happens when we have the ",[5834,14446,14447],{},"wrong"," information, when things we think are true are actually bad summaries from an LLM that have added a bit of false detail for fluidity? When humans do that on purpose, it is fraud, corruption, embezzlement, and scams. Will LLMs and similar technology accidentally amplify that, making markets even less efficient? Not to mention that efficient and humane are not the same thing. Ahhhhhhh.",[5825,14450,14451],{},"So many things.",[7147,14453,14454],{},"html pre.shiki code .s8-w5, html code.shiki .s8-w5{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html pre.shiki code .sTrkL, html code.shiki .sTrkL{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":45,"searchDepth":15,"depth":15,"links":14456},[],"2023-04-22","img\u002Frobot_lemonade_stand.jpg","https:\u002F\u002Fmastodon.social\u002F@awwaiid\u002F110243919367988037",{},{"title":4435,"description":14156},"TLT - 2023.04.22 - Chokepoints",[5980,8193],"2023-04-23","_8EI6mvTzZt9I0_xrgZxLMmg6HuwoHhgoiRlJT91ruo",{"id":14467,"title":1494,"body":14468,"createdAt":14586,"description":14472,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":14587,"navigation":5976,"path":1493,"seo":14588,"stem":14589,"tags":14590,"updatedAt":14591,"__hash__":14592},"content\u002FGot One Shoe.md",{"type":5822,"value":14469,"toc":14584},[14470,14473,14476,14484,14503,14515,14532,14541,14544,14561,14570],[5825,14471,14472],{},"A delightful song about that one shoe you can't seem to find!",[5825,14474,14475],{},"Lyrics by Brock, music by Brock, Jason, and Elizabeth.",[5825,14477,14478,6241,14481,6259],{},[6237,14479],{"controls":5976,"preload":6239,"src":14480},"\u002Fdocs\u002Fmusic\u002Foneshoe.mp3",[5950,14482,6245],{"download":14483,"external":45,"href":14480},"docs\u002Fmusic\u002Foneshoe.mp3",[5825,14485,14486,14487,14489,14490,14492,14493,14495,14496,14492,14498,14489,14500,14502],{},"I got one shoe,",[6297,14488],{},"\nLookin' for the other,",[6297,14491],{},"\nGot one shoe,",[6297,14494],{},"\nLookin' for his brother,",[6297,14497],{},[6297,14499],{},[6297,14501],{},"\nWell there ain't no shoe in sight!",[5825,14504,14505,14506,14508,14509,14511,14512,14514],{},"How am I gonna get to school?",[6297,14507],{},"\nHow am I gonna get to work?",[6297,14510],{},"\nI better find that shoe real soon,",[6297,14513],{},"\nOr else I'm gonna go bezurk!",[5825,14516,14517,14518,14489,14520,14522,14523,14495,14525,14522,14527,14489,14529,14531],{},"I got one glove,",[6297,14519],{},[6297,14521],{},"\nGot one glove,",[6297,14524],{},[6297,14526],{},[6297,14528],{},[6297,14530],{},"\nWell there ain't no glove in sight!",[5825,14533,14505,14534,14508,14536,14538,14539,14514],{},[6297,14535],{},[6297,14537],{},"\nI better find that glove real soon,",[6297,14540],{},[5825,14542,14543],{},"(Musical interlude)",[5825,14545,14546,14547,14489,14549,14551,14552,14495,14554,14551,14556,14489,14558,14560],{},"I got one sock,",[6297,14548],{},[6297,14550],{},"\nGot one sock,",[6297,14553],{},[6297,14555],{},[6297,14557],{},[6297,14559],{},"\nWell there ain't no sock in sight!",[5825,14562,14505,14563,14508,14565,14567,14568,14514],{},[6297,14564],{},[6297,14566],{},"\nI better find that sock real soon,",[6297,14569],{},[5825,14571,14486,14572,14489,14574,14492,14576,14495,14578,14492,14580,14489,14582,14502],{},[6297,14573],{},[6297,14575],{},[6297,14577],{},[6297,14579],{},[6297,14581],{},[6297,14583],{},{"title":45,"searchDepth":15,"depth":15,"links":14585},[],"2008-05-13T19:03-04:00",{},{"title":1494,"description":14472},"Got One Shoe",[6271],"2023-03-25-13-58","d82j5d3c81ZnJGtbqz9z9g1EDR5esbZB43ASCiM8XP4",{"id":14594,"title":5586,"body":14595,"createdAt":14613,"description":14599,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":14614,"navigation":5976,"path":5585,"seo":14615,"stem":5586,"tags":14616,"updatedAt":14613,"__hash__":14617},"content\u002FWanda Vision Jam.md",{"type":5822,"value":14596,"toc":14611},[14597,14600,14608],[5825,14598,14599],{},"Jam with Theo -- banging drums, strumming bass, and making up nonsense about Wanda Vision!",[5825,14601,14602,6241,14605,6259],{},[6237,14603],{"controls":5976,"preload":6239,"src":14604},"\u002Fdocs\u002Fmusic\u002Fwandavision_jam.mp3",[5950,14606,6245],{"download":14607,"external":45,"href":14604},"docs\u002Fmusic\u002Fwandavision_jam.mp3",[5825,14609,14610],{},"Theo and I went over to 7DrumCity and jammed for a while. He and Sacha were telling me about Wanda Vision, which I haven't seen at all, so I started to make up a song. A delightful time was had by all!",{"title":45,"searchDepth":15,"depth":15,"links":14612},[],"2023-03-25",{},{"title":5586,"description":14599},[6271],"RNEWI1p0sWYRIJ82HstDrUre0Yds0F8KlJ7PiTZ34qo",{"id":14619,"title":2246,"body":14620,"createdAt":14669,"description":14624,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":14670,"navigation":5976,"path":2245,"seo":14671,"stem":2246,"tags":14672,"updatedAt":14613,"__hash__":14673},"content\u002FMy Little Dog.md",{"type":5822,"value":14621,"toc":14667},[14622,14625,14661],[5825,14623,14624],{},"Song inspired by Hoda The Dog lounging about in the living room sun!",[5825,14626,14627,14628,6241,14631,6259,14634,14636,14637,6241,14640,6259,14643,14645,14646,6241,14649,6259,14652,14654,14655,6241,14658,6259],{},"Voice note ",[6237,14629],{"controls":5976,"preload":6239,"src":14630},"\u002Fdocs\u002Fmusic\u002Fsong_ideas\u002Fmy_little_dog.mp3",[5950,14632,6245],{"download":14633,"external":45,"href":14630},"docs\u002Fmusic\u002Fsong_ideas\u002Fmy_little_dog.mp3",[6297,14635],{},"\nRevision 1 ",[6237,14638],{"controls":5976,"preload":6239,"src":14639},"\u002Fdocs\u002Fmusic\u002Fwip\u002FMy_Little_Dog_r1_20230204.mp3",[5950,14641,6245],{"download":14642,"external":45,"href":14639},"docs\u002Fmusic\u002Fwip\u002FMy_Little_Dog_r1_20230204.mp3",[6297,14644],{},"\nRevision 2 ",[6237,14647],{"controls":5976,"preload":6239,"src":14648},"\u002Fdocs\u002Fmusic\u002Frpm2023\u002FMy_Little_Dog_r2_20230205_0940.mp3",[5950,14650,6245],{"download":14651,"external":45,"href":14648},"docs\u002Fmusic\u002Frpm2023\u002FMy_Little_Dog_r2_20230205_0940.mp3",[6297,14653],{},"\nRevision 3 ",[6237,14656],{"controls":5976,"preload":6239,"src":14657},"\u002Fdocs\u002Fmusic\u002Frpm2023\u002FMy_Little_Dog_r3_20230211_2112.mp3",[5950,14659,6245],{"download":14660,"external":45,"href":14657},"docs\u002Fmusic\u002Frpm2023\u002FMy_Little_Dog_r3_20230211_2112.mp3",[6971,14662,14665],{"className":14663,"code":14664,"language":6976},[6974],"G\nMy little dog\nC\nlaying in my living room\nG\nshe's laying in\nD\na patch of sun\n\nG\nMy little dog\nC\nlaying in my living room\nG\nAnd I think her day\nD                  G\nis gonna be a good one\n\nG\nMy little dog\nC\nlaying in my living room\nG\nshe's laying in\nD\na patch of sun\n\nG\nMy little dog\nC\nlaying in my living room\nG\nAnd I think her day\nD                  G\nis gonna be a good one\n\nC\nShe's laying there\nG\nall through the day\nC\nJust seeing her\nG\ntakes my cares away\nC\nWhat she's dreaming of\nG\nI couldn't say\nD\nBut I bet it's something\nG\nreal fun\n\nG\nMy little dog\nC\nlaying in my living room\nG\nshe's laying in\nD\na patch of sun\n\nG\nMy little dog\nC\nlaying in my living room\nG\nAnd I think her day\nD                  G\nis gonna be a good one\n",[6002,14666,14664],{"__ignoreMap":45},{"title":45,"searchDepth":15,"depth":15,"links":14668},[],"2023-02-04",{},{"title":2246,"description":14624},[6271],"8wnaM8oTuMEMCc_V3YnjAVEW68pADKbKg4MJg5ZOF-g",{"id":14675,"title":2154,"body":14676,"createdAt":15136,"description":15137,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":15138,"navigation":5976,"path":2153,"seo":15139,"stem":2154,"tags":15140,"updatedAt":14613,"__hash__":15141},"content\u002FMusic.md",{"type":5822,"value":14677,"toc":15134},[14678,14684,14693,14696],[5825,14679,14680,14681,8003],{},"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 ",[5950,14682,14683],{"href":2158},"Music Gear and Setup",[5825,14685,14686,14687,14692],{},"These works are licensed under a ",[5950,14688,14691],{"href":14689,"rel":14690},"http:\u002F\u002Fcreativecommons.org\u002Flicenses\u002Fby-sa\u002F3.0\u002F",[5954],"Creative Commons Attribution-ShareAlike (CC BY-SA)"," License (or maybe CC BY-NC... feel free to ask).",[5825,14694,14695],{},"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.",[7550,14697,14698,14710],{},[14699,14700,14701],"thead",{},[7556,14702,14703,14707],{},[14704,14705,14706],"th",{},"Song",[14704,14708,14709],{},"Play!",[7553,14711,14712,14724,14739,14753,14768,14782,14797,14810,14825,14839,14854,14869,14881,14896,14911,14926,14940,14953,14968,14981,14994,15007,15020,15033,15046,15059,15074,15086,15101,15116,15125],{},[7556,14713,14714,14718],{},[7559,14715,14716],{},[5950,14717,14589],{"href":1493},[7559,14719,14720,6241,14722,6259],{},[6237,14721],{"controls":5976,"preload":6239,"src":14480},[5950,14723,6245],{"download":14483,"external":45,"href":14480},[7556,14725,14726,14731],{},[7559,14727,14728],{},[5950,14729,14730],{"href":1351},"Frog Prince",[7559,14732,14733,6241,14736,6259],{},[6237,14734],{"controls":5976,"preload":6239,"src":14735},"\u002Fdocs\u002Fmusic\u002Ffrog_prince_v5.mp3",[5950,14737,6245],{"download":14738,"external":45,"href":14735},"docs\u002Fmusic\u002Ffrog_prince_v5.mp3",[7556,14740,14741,14745],{},[7559,14742,14743],{},[5950,14744,5349],{"href":5348},[7559,14746,14747,6241,14750,6259],{},[6237,14748],{"controls":5976,"preload":6239,"src":14749},"\u002Fdocs\u002Fmusic\u002Fumbrellas.mp3",[5950,14751,6245],{"download":14752,"external":45,"href":14749},"docs\u002Fmusic\u002Fumbrellas.mp3",[7556,14754,14755,14760],{},[7559,14756,14757],{},[5950,14758,14759],{"href":1581},"I Like Caffeine",[7559,14761,14762,6241,14765,6259],{},[6237,14763],{"controls":5976,"preload":6239,"src":14764},"\u002Fdocs\u002Fmusic\u002Fi_like_caffeine.mp3",[5950,14766,6245],{"download":14767,"external":45,"href":14764},"docs\u002Fmusic\u002Fi_like_caffeine.mp3",[7556,14769,14770,14774],{},[7559,14771,14772],{},[5950,14773,2943],{"href":2942},[7559,14775,14776,6241,14779,6259],{},[6237,14777],{"controls":5976,"preload":6239,"src":14778},"\u002Fdocs\u002Fmusic\u002FSegfault_v1_2016-02-14.mp3",[5950,14780,6245],{"download":14781,"external":45,"href":14778},"docs\u002Fmusic\u002FSegfault_v1_2016-02-14.mp3",[7556,14783,14784,14789],{},[7559,14785,14786],{},[5950,14787,14788],{"href":1797},"Knit Some Shit",[7559,14790,14791,6241,14794,6259],{},[6237,14792],{"controls":5976,"preload":6239,"src":14793},"\u002Fdocs\u002Fmusic\u002Fknit-some-shit-1.mp3",[5950,14795,6245],{"download":14796,"external":45,"href":14793},"docs\u002Fmusic\u002Fknit-some-shit-1.mp3",[7556,14798,14799,14802],{},[7559,14800,14801],{},"Late Blues",[7559,14803,14804,6241,14807,6259],{},[6237,14805],{"controls":5976,"preload":6239,"src":14806},"\u002Fdocs\u002Fmusic\u002Flateblues.mp3",[5950,14808,6245],{"download":14809,"external":45,"href":14806},"docs\u002Fmusic\u002Flateblues.mp3",[7556,14811,14812,14817],{},[7559,14813,14814],{},[5950,14815,14816],{"href":1718},"Immaterial Things",[7559,14818,14819,6241,14822,6259],{},[6237,14820],{"controls":5976,"preload":6239,"src":14821},"\u002Fdocs\u002Fmusic\u002Falbum1\u002F03_-_Immaterial_Things.mp3",[5950,14823,6245],{"download":14824,"external":45,"href":14821},"docs\u002Fmusic\u002Falbum1\u002F03_-_Immaterial_Things.mp3",[7556,14826,14827,14831],{},[7559,14828,14829],{},[5950,14830,251],{"href":250},[7559,14832,14833,6241,14836,6259],{},[6237,14834],{"controls":5976,"preload":6239,"src":14835},"\u002Fdocs\u002Fmusic\u002Falbum1\u002F08_-_CDOLTM.mp3",[5950,14837,6245],{"download":14838,"external":45,"href":14835},"docs\u002Fmusic\u002Falbum1\u002F08_-_CDOLTM.mp3",[7556,14840,14841,14846],{},[7559,14842,14843],{},[5950,14844,14845],{"href":374},"Code On My Mind",[7559,14847,14848,6241,14851,6259],{},[6237,14849],{"controls":5976,"preload":6239,"src":14850},"\u002Fdocs\u002Fmusic\u002Fcode_on_my_mind.mp3",[5950,14852,6245],{"download":14853,"external":45,"href":14850},"docs\u002Fmusic\u002Fcode_on_my_mind.mp3",[7556,14855,14856,14861],{},[7559,14857,14858],{},[5950,14859,14860],{"href":1207},"Dont Repeat Yourself",[7559,14862,14863,6241,14866,6259],{},[6237,14864],{"controls":5976,"preload":6239,"src":14865},"\u002Fdocs\u002Fmusic\u002Fdont_repeat_yourself.mp3",[5950,14867,6245],{"download":14868,"external":45,"href":14865},"docs\u002Fmusic\u002Fdont_repeat_yourself.mp3",[7556,14870,14871,14875],{},[7559,14872,14873],{},[5950,14874,2246],{"href":2245},[7559,14876,14877,6241,14879,6259],{},[6237,14878],{"controls":5976,"preload":6239,"src":14657},[5950,14880,6245],{"download":14660,"external":45,"href":14657},[7556,14882,14883,14888],{},[7559,14884,14885],{},[5950,14886,14887],{"href":1723},"Immortal Crowd",[7559,14889,14890,6241,14893,6259],{},[6237,14891],{"controls":5976,"preload":6239,"src":14892},"\u002Fdocs\u002Fmusic\u002Fimmortal_crowd.mp3",[5950,14894,6245],{"download":14895,"external":45,"href":14892},"docs\u002Fmusic\u002Fimmortal_crowd.mp3",[7556,14897,14898,14903],{},[7559,14899,14900],{},[5950,14901,14902],{"href":294},"Call On Borbyu",[7559,14904,14905,6241,14908,6259],{},[6237,14906],{"controls":5976,"preload":6239,"src":14907},"\u002Fdocs\u002Fmusic\u002Fcall_on_borbyu.mp3",[5950,14909,6245],{"download":14910,"external":45,"href":14907},"docs\u002Fmusic\u002Fcall_on_borbyu.mp3",[7556,14912,14913,14918],{},[7559,14914,14915],{},[5950,14916,14917],{"href":2657},"Pi Girl",[7559,14919,14920,6241,14923,6259],{},[6237,14921],{"controls":5976,"preload":6239,"src":14922},"\u002Fdocs\u002Fmusic\u002Fpigirl7.mp3",[5950,14924,6245],{"download":14925,"external":45,"href":14922},"docs\u002Fmusic\u002Fpigirl7.mp3",[7556,14927,14928,14932],{},[7559,14929,14930],{},[5950,14931,1480],{"href":1479},[7559,14933,14934,6241,14937,6259],{},[6237,14935],{"controls":5976,"preload":6239,"src":14936},"\u002Fdocs\u002Fmusic\u002Fgitmo_v1.mp3",[5950,14938,6245],{"download":14939,"external":45,"href":14936},"docs\u002Fmusic\u002Fgitmo_v1.mp3",[7556,14941,14942,14945],{},[7559,14943,14944],{},"Hotel Yorba (cover)",[7559,14946,14947,6241,14950,6259],{},[6237,14948],{"controls":5976,"preload":6239,"src":14949},"\u002Fdocs\u002Fmusic\u002Fyorba.mp3",[5950,14951,6245],{"download":14952,"external":45,"href":14949},"docs\u002Fmusic\u002Fyorba.mp3",[7556,14954,14955,14960],{},[7559,14956,14957],{},[5950,14958,14959],{"href":5751},"Zombie Love",[7559,14961,14962,6241,14965,6259],{},[6237,14963],{"controls":5976,"preload":6239,"src":14964},"\u002Fdocs\u002Fmusic\u002Fzombielove.mp3",[5950,14966,6245],{"download":14967,"external":45,"href":14964},"docs\u002Fmusic\u002Fzombielove.mp3",[7556,14969,14970,14973],{},[7559,14971,14972],{},"Big Brown Spider",[7559,14974,14975,6241,14978,6259],{},[6237,14976],{"controls":5976,"preload":6239,"src":14977},"\u002Fdocs\u002Fmusic\u002Fbig_brown_spider_test.mp3",[5950,14979,6245],{"download":14980,"external":45,"href":14977},"docs\u002Fmusic\u002Fbig_brown_spider_test.mp3",[7556,14982,14983,14986],{},[7559,14984,14985],{},"I Knew A Girl",[7559,14987,14988,6241,14991,6259],{},[6237,14989],{"controls":5976,"preload":6239,"src":14990},"\u002Fdocs\u002Fmusic\u002Fi_knew_a_girl.mp3",[5950,14992,6245],{"download":14993,"external":45,"href":14990},"docs\u002Fmusic\u002Fi_knew_a_girl.mp3",[7556,14995,14996,14999],{},[7559,14997,14998],{},"Happiness Blues",[7559,15000,15001,6241,15004,6259],{},[6237,15002],{"controls":5976,"preload":6239,"src":15003},"\u002Fdocs\u002Fmusic\u002Falbum1\u002F05_-_Happiness_Blues.mp3",[5950,15005,6245],{"download":15006,"external":45,"href":15003},"docs\u002Fmusic\u002Falbum1\u002F05_-_Happiness_Blues.mp3",[7556,15008,15009,15012],{},[7559,15010,15011],{},"Groovin",[7559,15013,15014,6241,15017,6259],{},[6237,15015],{"controls":5976,"preload":6239,"src":15016},"\u002Fdocs\u002Fmusic\u002Falbum1\u002F09_-_Groovin.mp3",[5950,15018,6245],{"download":15019,"external":45,"href":15016},"docs\u002Fmusic\u002Falbum1\u002F09_-_Groovin.mp3",[7556,15021,15022,15025],{},[7559,15023,15024],{},"Shaseys",[7559,15026,15027,6241,15030,6259],{},[6237,15028],{"controls":5976,"preload":6239,"src":15029},"\u002Fdocs\u002Fmusic\u002Falbum1\u002F10_-_Shaseys.mp3",[5950,15031,6245],{"download":15032,"external":45,"href":15029},"docs\u002Fmusic\u002Falbum1\u002F10_-_Shaseys.mp3",[7556,15034,15035,15038],{},[7559,15036,15037],{},"Marie Laveau (Bobby Bare cover)",[7559,15039,15040,6241,15043,6259],{},[6237,15041],{"controls":5976,"preload":6239,"src":15042},"\u002Fdocs\u002Fmusic\u002Falbum1\u002F11_-_Marie_Laveau_(Bobby_Bare_cover).mp3",[5950,15044,6245],{"download":15045,"external":45,"href":15042},"docs\u002Fmusic\u002Falbum1\u002F11_-_Marie_Laveau_(Bobby_Bare_cover).mp3",[7556,15047,15048,15051],{},[7559,15049,15050],{},"SIC",[7559,15052,15053,6241,15056,6259],{},[6237,15054],{"controls":5976,"preload":6239,"src":15055},"\u002Fdocs\u002Fmusic\u002Falbum1\u002F04_-_SIC.mp3",[5950,15057,6245],{"download":15058,"external":45,"href":15055},"docs\u002Fmusic\u002Falbum1\u002F04_-_SIC.mp3",[7556,15060,15061,15066],{},[7559,15062,15063],{},[5950,15064,15065],{"href":1975},"Livingroom Adventures",[7559,15067,15068,6241,15071,6259],{},[6237,15069],{"controls":5976,"preload":6239,"src":15070},"\u002Fdocs\u002Fmusic\u002Flivingroom_adventures.mp3",[5950,15072,6245],{"download":15073,"external":45,"href":15070},"docs\u002Fmusic\u002Flivingroom_adventures.mp3",[7556,15075,15076,15080],{},[7559,15077,15078],{},[5950,15079,5586],{"href":5585},[7559,15081,15082,6241,15084,6259],{},[6237,15083],{"controls":5976,"preload":6239,"src":14604},[5950,15085,6245],{"download":14607,"external":45,"href":14604},[7556,15087,15088,15093],{},[7559,15089,15090],{},[5950,15091,15092],{"href":5718},"Yo Oliver",[7559,15094,15095,6241,15098,6259],{},[6237,15096],{"controls":5976,"preload":6239,"src":15097},"\u002Fdocs\u002Fmusic\u002Fyo_oliver_v1.mp3",[5950,15099,6245],{"download":15100,"external":45,"href":15097},"docs\u002Fmusic\u002Fyo_oliver_v1.mp3",[7556,15102,15103,15108],{},[7559,15104,15105],{},[5950,15106,15107],{"href":5688},"White Roses",[7559,15109,15110,6241,15113,6259],{},[6237,15111],{"controls":5976,"preload":6239,"src":15112},"\u002Fdocs\u002Fmusic\u002Felectric_accordion_white_roses.mp3",[5950,15114,6245],{"download":15115,"external":45,"href":15112},"docs\u002Fmusic\u002Felectric_accordion_white_roses.mp3",[7556,15117,15118,15123],{},[7559,15119,15120],{},[5950,15121,15122],{"href":1747},"It Takes All Sorts",[7559,15124],{},[7556,15126,15127,15132],{},[7559,15128,15129],{},[5950,15130,15131],{"href":4967},"Talking DC Vote Blues",[7559,15133],{},{"title":45,"searchDepth":15,"depth":15,"links":15135},[],"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!",{},{"title":2154,"description":15137},[6510,6271],"3NiAYLFcHqDxolTJpZ6iJfQALqOPpt5TnQYfzB1GZck",{"id":15143,"title":4401,"body":15144,"createdAt":14669,"description":15175,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":15176,"navigation":5976,"path":4400,"seo":15177,"stem":15178,"tags":15179,"updatedAt":14669,"__hash__":15180},"content\u002FTLT - 2023.02.04 - RPM 2023 My Little Dog.md",{"type":5822,"value":15145,"toc":15173},[15146,15152,15155,15161,15164,15170],[5825,15147,15148,15149,15151],{},"Initial attempt at ",[5950,15150,2246],{"href":2245},", part of the 2023 RPM Challenge",[5825,15153,15154],{},"I did a voice recording of this in April 2022, noodling around on the mandolin and singing to Hoda while she (quite obviously from the lyrics) lay basking in the sun. Here is the voice recording:",[5825,15156,15157,6241,15159,6259],{},[6237,15158],{"controls":5976,"preload":6239,"src":14630},[5950,15160,6245],{"download":14633,"external":45,"href":14630},[5825,15162,15163],{},"Today I re-worked-out the simple chords and some cleaned up lyrics. Here is the work-in-progress:",[5825,15165,15166,6241,15168,6259],{},[6237,15167],{"controls":5976,"preload":6239,"src":14639},[5950,15169,6245],{"download":14642,"external":45,"href":14639},[5825,15171,15172],{},"The lyrics aren't quite right here, so I'm definitely re-recording that. The mandolin is good-enough.... but I think there could be a bit more of a musical section or two with some other strumming or picking patterns. Still.... the challenge is to record 10 songs, so worse case this version could be song-number-one!",{"title":45,"searchDepth":15,"depth":15,"links":15174},[],"Initial attempt at My Little Dog, part of the 2023 RPM Challenge",{},{"title":4401,"description":15175},"TLT - 2023.02.04 - RPM 2023 My Little Dog",[5980],"oke9ikDsxhNTBrTtJ4LOxnd5tcMovcyFmfjoMwqUk-k",{"id":15182,"title":4386,"body":15183,"createdAt":15239,"description":4388,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":15240,"navigation":5976,"path":4385,"seo":15241,"stem":15242,"tags":15243,"updatedAt":15239,"__hash__":15244},"content\u002FTLT - 2023.01.29 - RPM Challenge 2023.md",{"type":5822,"value":15184,"toc":15235},[15185,15194,15197,15200,15203,15209,15212,15215,15218,15221,15224,15227,15230],[5825,15186,15187,15188,15193],{},"I'm going to try to do the ",[5950,15189,15192],{"href":15190,"rel":15191},"https:\u002F\u002Fwww.rpmchallenge.com\u002F",[5954],"RPM Challenge"," again this year. Millionth try is a charm?",[6071,15195,4391],{"id":15196},"previous-attempts",[5825,15198,15199],{},"The challenge: 10 tracks or 35 minutes of original music recorded during the month of February.",[5825,15201,15202],{},"I'm not really sure how many times I've sat where I am now, a few days before (or a few days after!) February 1st and thought to myself ... LETS DO THIS. But I'll tell you how many times I've gotten through is very easy -- zero!",[5825,15204,15205,15206,15208],{},"That's not to say that I haven't had some fun trying. Jason and I, in particular, tacked the challenge a few times and came out with several very fun songs. I think that's where I got ",[5950,15207,14845],{"href":374}," for example. We'd get together on a Saturday with the idea that we'd jam out like 5 songs and end up with 1 or maaaybe 2. More than most other Saturdays!",[6071,15210,4396],{"id":15211},"this-year",[5825,15213,15214],{},"I of course have things going on. Work. Normal life. We're going to AZ for a week. So the strategy this year is, as always, a bit tricky.",[5825,15216,15217],{},"One thing that I've been doing for a while now is to record little tunes that pop into my head on my phone. So I'll be singing to myself \"I LOVE MY CHI-HUA-HUA.... LA LA LA\" or something and if it has some potential then I'll record it. Try to get the idea, the basic concept, down. Interestingly my first attempt is almost always bad. I get self-consious or something and stumble on words that I might have been dancing along merrily only a moment before. So I sing it into the recording a bunch of times, maybe do some variations.",[5825,15219,15220],{},"With that seed, I figure there are two big steps for each song. Step 1, write and record the song. For time sake and for organic composition those are probably MOSTLY the same step. Then Step 2 mix and master the song.",[5825,15222,15223],{},"I'm thinking I'll try to put some distance between recording and mixing, though that leaves some risk that as I mix I'll need something re-done or added but I'm no longer set up to do that. But if it works, then maybe what I'll do is record songs on the weekend and then mix songs during the week. If I pace myself it'd be 2-3 songs a week. I'm worried that won't work, that I'll run out of momentum. So! Let's shoot for 3-4 songs per week, or really as many as I can muster up-front.",[6416,15225],{"src":15226},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FTT2z2i8m58RXFLTnl810-WUwTN8JYjIfECJsQ8waYIHdQEzUg1IYqldX_OQlZgm3FxHZ5ZisE2AmdqLBR14kBg2s59bwQ6b4Imvtmj20SFUURtuIJV1Fx1cMcGYvoWkfSgaoqJK1NrUmEdA40WOzHy467NHdx26JvMfvQYUQKgj-kqhkDxl4_hg3pDHccE9NUIH7qQnKVgX6Doo7lG40",[5825,15228,15229],{},"I'd always like to throw in a collaboration or three, even though that complicates it. One idea is to record with Elizabeth and Nate when I'm in AZ. Another is to get my kid neighbor Theo in to do a drum session with me at 7drumcity. We'll see how those play out.",[5825,15231,15232],{},[7247,15233,15234],{},"2023 LET'S GO!",{"title":45,"searchDepth":15,"depth":15,"links":15236},[15237,15238],{"id":15196,"depth":15,"text":4391},{"id":15211,"depth":15,"text":4396},"2023-01-29",{},{"title":4386,"description":4388},"TLT - 2023.01.29 - RPM Challenge 2023",[5980],"BxGA32sr_SG3-5NcLfEDb95VJlr3hmb33-C7xf4rC8U",{"id":15246,"title":1133,"body":15247,"createdAt":15528,"description":1135,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":15529,"navigation":5976,"path":1132,"seo":15530,"stem":15531,"tags":15532,"updatedAt":15534,"__hash__":15535},"content\u002FDeploy First Breadth First.md",{"type":5822,"value":15248,"toc":15522},[15249,15251,15254,15257,15289,15292,15295,15298,15301,15304,15307,15310,15333,15336,15339,15342,15345,15348,15351,15354,15357,15371,15374,15377,15380,15383,15386,15389,15392,15395,15398,15401],[5825,15250,1135],{},[6071,15252,1138],{"id":15253},"common-project-risks",[5825,15255,15256],{},"Introducing change to a project always comes with some risk. Some examples:",[6013,15258,15259,15262,15265,15268,15271,15274,15277,15280,15283,15286],{},[6016,15260,15261],{},"Breaking existing functionality",[6016,15263,15264],{},"Not building the \"right\" thing",[6016,15266,15267],{},"Specified wrong",[6016,15269,15270],{},"Implemented wrong",[6016,15272,15273],{},"Not handling data scale",[6016,15275,15276],{},"Difficult deploy",[6016,15278,15279],{},"Difficult rollback",[6016,15281,15282],{},"Difficult to work on (local setup)",[6016,15284,15285],{},"Taking longer than expected to develop",[6016,15287,15288],{},"Developing without value being delivered",[5825,15290,15291],{},"Here are two key strategies to help mitigate some of these risks!",[6071,15293,1143],{"id":15294},"deploy-first",[5825,15296,15297],{},"The first thing you should do when working on a project is deploy. Then you know that you can do it with the existing code.",[5825,15299,15300],{},"The second thing you should do when working on a project is to write a stub of what you are doing, prove that it doesn't cause a regression (wrap it in a beta-flag if need be), and then deploy.",[5825,15302,15303],{},"Here's what usually happens: You wait until the end of the project to deploy. Then you realize that you can't deploy, because you need a new database or because your deploy script doesn't work or because this is a new service that has never been deployed before and you simply don't know how. So you start working on deploying it into a staging environment. But then you have to go around and build a staging environment and get all of your stuff working there. Then you test. But you STILL can't deploy to production, and you don't know how long it will take. So finally you get your prod stuff set up and deploy, 2 weeks after you intended to be done with the project.",[6416,15305],{"src":15306},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FVS-n2SGm34RXFbDeXCi6WLlW-f1289rZiEHW_IcyVI1b2AxVrxmbm0s97PZMNwkew8UIQEJa6nKE1CqV4kunOLUdzLiu6qKFgBqBDFQmZ26oP6FGz7-w38deKMf_jaLTxgCB",[5825,15308,15309],{},"Typical way to do that last deploy:",[6013,15311,15312,15315,15318,15321,15324,15327,15330],{},[6016,15313,15314],{},"Get it running on your machine, working pretty well",[6016,15316,15317],{},"Put in a PR",[6016,15319,15320],{},"Help get it running on someone else's machine, working pretty well",[6016,15322,15323],{},"Iterate a bit",[6016,15325,15326],{},"Try to get it running on staging",[6016,15328,15329],{},"Iterate a bit, working with QA or other stakeholders via staging",[6016,15331,15332],{},"Try to get it working on production",[5825,15334,15335],{},"This stacks up a severe unknown right at the end.",[5825,15337,15338],{},"So let's flip this. Work out how to deploy null code, zero changes, into prod. If there is no real code, there can be no real errors, so you don't need to put it into staging first. Next put it into staging, since you'll need that in the future. Now you know exactly how much labor it will take to get your thing into production - none.",[5825,15340,15341],{},"Putting something in prod immediately might seem scary, but really this strategy has the least and most isolated risk. Put your empty code behind a feature flag or if safe and non-contradicting put it on a new page that isn't linked.",[6071,15343,1148],{"id":15344},"breadth-first",[5825,15346,15347],{},"A typical project implements a new workflow, usually with several steps or across a few systems. We take the project and break it into features with each feature feeding data into the next. Then we sort based on the data flow and begin implementing features.",[5825,15349,15350],{},"Imagine we were trying to add a new feature to our eCommerce site so that people can submit issues with an order. So here we would say \"ok! Let's start by building a Create-Claim UI on our site!\". We break that into a few tickets and go to work! Once we have that working pretty well we move on to Transmitting, Processing, etc.",[6416,15352],{"src":15353},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FVP9BIyD04CVl-HH3l2Z4MmwvH91QRuAKugKfCirEayLzX9s9D8ZVNP9iKulWQVdFuxVpKhe9sBNGm5S2OF10faoVg9CMddLWWVK9RMSeJG2SLmGxRh6Zyk1Fm38OAe_Q658mFhKtFfH6Dwqq0OTz0b0Rr1Ps4RmQ5SDhy3KnQzUaKqmW5Be4pNBAJ7znqviyHyppAKS2EhPQbgpjsI0UV50KW0SMifMxxHqB1Y5rTuqROH5dqM53rtN2osIqv0Istfj_I4LH58WJAT2nTseXhKzKzqAmcSp_5XCHoz3k7-9aigNRB1QQnM-Io_IMw7SMwdXnp19s2K3SBvGG6xHUaQdSbcndK8WhzwWKQ27BbTkGzPzqLcyKz74ugrLBzKSiamMbvtJYpnUHAkIML3PVnkpvkyQY63txvFi7",[5825,15355,15356],{},"There are a lot of things we might run into in this workflow:",[6013,15358,15359,15362,15365,15368],{},[6016,15360,15361],{},"Business priorities shift before all is done. Code rots for a while before we get back to it",[6016,15363,15364],{},"The backend needs enough information from the frontend to execute a refund, but we don't know what that might be",[6016,15366,15367],{},"Getting the tools into production adds an API, which turns out requires a new set of permissions that we didn't realize until trying to send things (unit tests missed them)",[6016,15369,15370],{},"Getting validations on orders right takes a long time, leaving little time for a quality execute-refund code",[5825,15372,15373],{},"One approach that some people take to help with these issues is complete up-front design. You think out every bit of the thing, every interface and API and variable and column, and work them all out ahead of time. While appealing, this has issues too - namely that when you go to write the code you have some situational awareness that cannot be obtained beforehand.",[5825,15375,15376],{},"So let's try another strategy. Let's try to get the end-to-end flow working, breadth-first style, and then go from there.",[5825,15378,15379],{},"Stub out all the \"useful\" work code and get this working end-to-end as the first task. For example, instead of letting the user create a complete claim, ask them for a single item or just hard-wire it to the last-most item available without any user input. Don't validate or handle errors on transmitting or even handle different products - make a hand-built json string to transmit if you can. And so on. Use Deploy First Development techniques to put your completely wrong but harmless code into production (behind a feature-flag or permission).",[6416,15381],{"src":15382},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FbLCzRzim4DtrAmvAXXQmEtdG8WyDKgH0YmI9Erb5S2RF4blgJY3fm4RH_rv8OcXPdJpfFlXExzs7DhN3he4Q_cG05dTao_op8zIXWI_6-G3tHsmxIta6mA89jhx1ZigT7C67awLoRwmb3Vr7YHLNMbCteNPu-fa1A8kcXMqiVTTx7fwSAFBUS9qFRnnXeFEZqHsG-QHkVhDQ8QvM0oOuPD-Qa52Rzq0G4AV9WJ_vGBCAFJvMQ96nfajgy7q8jiG1DYBs4bmKHO4uW1tj3wmJ-Fv8wX08deVm_9SHbRgnN4V9YoHZ4UaiOkNit9Rq-jK7wdnAZ2viCu0uEYWXocX5awtuaGaQT7gfH9C6mpuWgs6M4AUNQ_GDwSKunJ7pVykBeiyC4bBZb-ja9sQNWJctXpCLSV0foEilBrpnq-FBfX_R3jLlObrnnS-aoBmH2Bz70VlCpXhMzWGVME2DdDaRXS48VwnOJTVc2eNZIamKniLOhgELr4tTkROVty0Q7q3s8mFVg_ZAtI50Vof1uc0hnhW5knCOVGtHSVqcHECIBjVHIaIdxfpeIz_BoLBStbQChHnuk9nkl4nn5U_50V9uIzVrSqhpxpy0",[5825,15384,15385],{},"Depending on the complexity of the project, a second breadth-first pass might be a good idea - one that doesn't use any hard-coded values for example. Your goal is to get the project to be minimally-useful. Once the project is minimally-useful, every change after that will make it more-useful!",[5825,15387,15388],{},"This also opens the possibility of parallel development.",[6416,15390],{"src":15391},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FdP6z3i8m38JtFeKtLdY3IaZCI8mLWqLCY9IuLNmTylQeFs9AKM7_TFUTtHeumxC2JNVDFNgKGSY91QztYcmmEXt9SR46Br7gRY4DKUWHEIIoOf3q0IiSCgkbW1reycaFbkKvgli6NiOOwLmJN9Sin9RQ0X5F9TDvZ1WRxGSZKRVcrVp_pQgF_3sj5NNpUzy0",[5825,15393,15394],{},"Once you have the end-to-end flow working, and ideally have some testing methodology worked out (either automated or by-hand), then you can switch into a more depth-first technique. You keep factoring out any hard-coded values until you get the whole project organized and feature-full. If you have been deploying the whole time there are no surprises - it isn't a matter of releasing the project, but instead of granting a wider set of people access to an already-working system.",[6416,15396],{"src":15397},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FdLF1Rjim3BtdAmZtcc2N77nnWBLeJorQ9DbsY8U1aHXRYomP4bqa6_RlWor5JhpJUZ8VfKU_Hr9ILGxR6YhuFGFGk2TTPFUEK78DJyfvXiSJDgscR0PWh2JO-HfRAlRs19xFceg3qfeaz1zXjNM5LbNDbSFpznc0qAWQsCNI3ptoyEQi8E-LgRBXZYDa6Yy5E32pgxhPtNA9k5mE77PeVACuiRQN15kmJf83V_PCamezFrPeq615jzBWPKWsP1YsrkfRSfxdEU90TdJeZ4pannE9ZWdMGthwoyXAtLYiekLviZ6FSkQnycniIxhzmpErFXq42BiPG1mT511jD5QIBisMcbOZao_DPob1CJM-D6jgx3jTq5Towd2-e8UQn37Az8pS-Moe7qQTIVGroNaOUJZvTpvvtfyCVjEK5giK9nktYQcH3Jc5MlsAYr2QjzVDjX_k7iMHZEnz25Bl1DQCkViGH0T36_x7G5YFAmDnIHQh62Nnrt0g_Lbv1di88dnfdgqzGjS2NgoyMDdtFE5-ECOo-TxVc1M2MlwqffyaU4odHV_ebC8QNvcCoxnOnIYPl8PJarzQsM_dyDHAyyqf9a0XR6TOcGgKETZIRBfzV99jUFBMbIOoFoe_lAUB_3z_0G00",[6071,15399,1153],{"id":15400},"notes-for-article-improvement",[6013,15402,15403,15420,15437,15440,15460,15468,15479,15487,15498],{},[6016,15404,15405,15406],{},"Give example of depth-first\n",[6013,15407,15408,15411,15414,15417],{},[6016,15409,15410],{},"Why this is natural",[6016,15412,15413],{},"How it misses important end-to-end questions",[6016,15415,15416],{},"How it doesn't lock in useful value",[6016,15418,15419],{},"How it can catch some low-level implementation detail issues early",[6016,15421,15422,15423],{},"Give example of breadth-first\n",[6013,15424,15425,15428,15431,15434],{},[6016,15426,15427],{},"Why it is unnatural",[6016,15429,15430],{},"How it answers important end-to-end questions",[6016,15432,15433],{},"How it locks in value sooner",[6016,15435,15436],{},"How it can miss low-level implementation details early",[6016,15438,15439],{},"Come up with another example. Something generic. Blog Engine? Blog admin panel?",[6016,15441,15442,15443],{},"Is this the same as top-down vs bottom-up design\u002Fcoding?\n",[6013,15444,15445,15448,15451,15454,15457],{},[6016,15446,15447],{},"Both breadth-first and depth-first are part of an overall top-down plan",[6016,15449,15450],{},"Depth-first works fine if you start at the bottom and work your way up, so is compatible with bottom-up, kinda",[6016,15452,15453],{},"Bottom-up could be considered breadth-first but starting at the leaf-nodes",[6016,15455,15456],{},"Doesn't lock in useful value",[6016,15458,15459],{},"I guess you might call this \"middle-out\" design",[6016,15461,15462,15463],{},"Feedback loops!\n",[6013,15464,15465],{},[6016,15466,15467],{},"Breadth first when it comes to team roles - design, dev, qa, ops",[6016,15469,15470,15471],{},"Get end-to-end flow early\n",[6013,15472,15473,15476],{},[6016,15474,15475],{},"Try out general and happy-path workflow",[6016,15477,15478],{},"Discover initial boundaries and APIs",[6016,15480,15481,15482],{},"Breadth-First vs TDD?\n",[6013,15483,15484],{},[6016,15485,15486],{},"Maybe breadth-first is more BDD",[6016,15488,15489,15490],{},"First pass only?\n",[6013,15491,15492,15495],{},[6016,15493,15494],{},"After end-to-end flow is established, depth on an individual piece can continue to lock in value",[6016,15496,15497],{},"Once the first pass is done you can more safely parallel-path develop the sub-components",[6016,15499,15500,15501],{},"Psychology of BF-vs-DF\n",[6013,15502,15503,15515],{},[6016,15504,15505,15509,15510],{},[5950,15506,15507],{"href":15507,"rel":15508},"https:\u002F\u002Farpitonline.com\u002F2010\u002F04\u002F10\u002Fon-breadth-first-and-depth-first-thinking\u002F",[5954]," - says that breadth-first is indicative of a happy state of mind and is more conductive to out of the box thinking, and that tension\u002Fpressure puts you into depth-first mode.\n",[6013,15511,15512],{},[6016,15513,15514],{},"\"So concept in breadth first mode, execute in depth first.\"",[6016,15516,15517,15521],{},[5950,15518,15519],{"href":15519,"rel":15520},"http:\u002F\u002Fwww.dubberly.com\u002Farticles\u002Fmiddle-out-design.html",[5954]," - I was joking about calling it middle-out (Silicon Valley reference), and JoshC actually googled it and found this interesting article.",{"title":45,"searchDepth":15,"depth":15,"links":15523},[15524,15525,15526,15527],{"id":15253,"depth":15,"text":1138},{"id":15294,"depth":15,"text":1143},{"id":15344,"depth":15,"text":1148},{"id":15400,"depth":15,"text":1153},"2017-01-22",{},{"title":1133,"description":1135},"Deploy First Breadth First",[15533],"programming","2023-01-08","8bTgFcjQcecbuIVfrOo3GK8t79c447qMUOJIJBteruM",{"id":15537,"title":4371,"body":15538,"createdAt":15849,"description":4373,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":15850,"navigation":5976,"path":4370,"seo":15851,"stem":15852,"tags":15853,"updatedAt":15849,"__hash__":15854},"content\u002FTLT - 2022.12.04 - Snake Souls.md",{"type":5822,"value":15539,"toc":15845},[15540,15542,15545,15566,15760,15763,15772,15775,15778,15783,15786,15836,15839,15842],[5825,15541,4373],{},[6071,15543,4376],{"id":15544},"snake-lights",[5825,15546,15547,15548,15553,15554,15559,15560,15565],{},"I've purchased and chained a few Neopixel-like LED fairy-light strands (",[5950,15549,15552],{"href":15550,"rel":15551},"https:\u002F\u002Fwww.amazon.com\u002Fdp\u002FB0B4RTMG13",[5954],"these ones on Amazon",") as a fun winter\u002FChristmasy project. I have them hooked up to an Arduino-like, right now this ",[5950,15555,15558],{"href":15556,"rel":15557},"https:\u002F\u002Fwww.adafruit.com\u002Fproduct\u002F3857",[5954],"M4 Feather Express",", but I'm planning on switching to an ",[5950,15561,15564],{"href":15562,"rel":15563},"https:\u002F\u002Fwww.adafruit.com\u002Fproduct\u002F5300",[5954],"ESP32-S2 TFT Feather",". Each LED is individually controllable using Arduino\u002FC++. The idea is to make some holiday light displays with different colors and twinkling and all that. While learning how to use it I made a few toy animations, such as this simple snake:",[6971,15567,15571],{"className":15568,"code":15569,"language":15570,"meta":45,"style":45},"language-cpp shiki shiki-themes github-light github-dark monokai","void forwardSnake() {\n  for (int i = 0; i \u003C strip.numPixels(); i++) {  \u002F\u002F For each pixel in strip...\n    strip.clear();\n    for (int j = 0; j \u003C 5; j++) {\n      strip.setPixelColor(((i + j) % strip.numPixels()), strip.Color(128, 0, 32));  \u002F\u002F  Set pixel's color (in RAM)\n    }\n    strip.show();  \u002F\u002F  Update strip to match\n    delay(100);    \u002F\u002F  Pause for a moment\n  }\n}\n","cpp",[6002,15572,15573,15584,15624,15635,15666,15717,15722,15735,15751,15756],{"__ignoreMap":45},[5853,15574,15575,15578,15581],{"class":7026,"line":9},[5853,15576,15577],{"class":9595},"void",[5853,15579,15580],{"class":8564}," forwardSnake",[5853,15582,15583],{"class":7033},"() {\n",[5853,15585,15586,15588,15590,15593,15595,15597,15600,15603,15606,15609,15612,15615,15618,15621],{"class":7026,"line":15},[5853,15587,13031],{"class":7029},[5853,15589,6241],{"class":7033},[5853,15591,15592],{"class":9595},"int",[5853,15594,12930],{"class":7033},[5853,15596,7053],{"class":7029},[5853,15598,15599],{"class":7073}," 0",[5853,15601,15602],{"class":7033},"; i ",[5853,15604,15605],{"class":7029},"\u003C",[5853,15607,15608],{"class":7033}," strip.",[5853,15610,15611],{"class":8564},"numPixels",[5853,15613,15614],{"class":7033},"(); i",[5853,15616,15617],{"class":7029},"++",[5853,15619,15620],{"class":7033},") {",[5853,15622,15623],{"class":8286},"  \u002F\u002F For each pixel in strip...\n",[5853,15625,15626,15629,15632],{"class":7026,"line":56},[5853,15627,15628],{"class":7033},"    strip.",[5853,15630,15631],{"class":8564},"clear",[5853,15633,15634],{"class":7033},"();\n",[5853,15636,15637,15640,15642,15644,15646,15648,15650,15653,15655,15658,15661,15663],{"class":7026,"line":5212},[5853,15638,15639],{"class":7029},"    for",[5853,15641,6241],{"class":7033},[5853,15643,15592],{"class":9595},[5853,15645,13034],{"class":7033},[5853,15647,7053],{"class":7029},[5853,15649,15599],{"class":7073},[5853,15651,15652],{"class":7033},"; j ",[5853,15654,15605],{"class":7029},[5853,15656,15657],{"class":7073}," 5",[5853,15659,15660],{"class":7033},"; j",[5853,15662,15617],{"class":7029},[5853,15664,15665],{"class":7033},") {\n",[5853,15667,15668,15671,15674,15677,15680,15683,15686,15688,15690,15693,15696,15698,15701,15703,15706,15708,15711,15714],{"class":7026,"line":7077},[5853,15669,15670],{"class":7033},"      strip.",[5853,15672,15673],{"class":8564},"setPixelColor",[5853,15675,15676],{"class":7033},"(((i ",[5853,15678,15679],{"class":7029},"+",[5853,15681,15682],{"class":7033}," j) ",[5853,15684,15685],{"class":7029},"%",[5853,15687,15608],{"class":7033},[5853,15689,15611],{"class":8564},[5853,15691,15692],{"class":7033},"()), strip.",[5853,15694,15695],{"class":8564},"Color",[5853,15697,12273],{"class":7033},[5853,15699,15700],{"class":7073},"128",[5853,15702,9528],{"class":7033},[5853,15704,15705],{"class":7073},"0",[5853,15707,9528],{"class":7033},[5853,15709,15710],{"class":7073},"32",[5853,15712,15713],{"class":7033},"));",[5853,15715,15716],{"class":8286},"  \u002F\u002F  Set pixel's color (in RAM)\n",[5853,15718,15719],{"class":7026,"line":7083},[5853,15720,15721],{"class":7033},"    }\n",[5853,15723,15724,15726,15729,15732],{"class":7026,"line":7094},[5853,15725,15628],{"class":7033},[5853,15727,15728],{"class":8564},"show",[5853,15730,15731],{"class":7033},"();",[5853,15733,15734],{"class":8286},"  \u002F\u002F  Update strip to match\n",[5853,15736,15737,15740,15742,15745,15748],{"class":7026,"line":7100},[5853,15738,15739],{"class":8564},"    delay",[5853,15741,12273],{"class":7033},[5853,15743,15744],{"class":7073},"100",[5853,15746,15747],{"class":7033},");",[5853,15749,15750],{"class":8286},"    \u002F\u002F  Pause for a moment\n",[5853,15752,15753],{"class":7026,"line":7110},[5853,15754,15755],{"class":7033},"  }\n",[5853,15757,15758],{"class":7026,"line":7118},[5853,15759,9316],{"class":7033},[5825,15761,15762],{},"This is pretty fun, and I like agent simulations, so I decided to lean into this Snake idea. Now I'm modeling out snakes chasing around this 200-LED loop -- spawning randomly, eating each other, changing directions, growing bigger, different colors, etc. Here is an example of two snakes bouncing off of each other:",[15764,15765,15766,15767],"video",{"width":7655,"controls":5976},"\n  ",[15768,15769],"source",{"src":15770,"type":15771},"\u002Fcontent\u002F20221203-simple-snake-chase-noaudio.mp4","video\u002Fmp4",[6071,15773,4381],{"id":15774},"chatgpt-time",[5825,15776,15777],{},"OK, so, ChatGPT. This thing came out a few days ago where anyone can chat with the latest GPT and it'll spit out whole essays or other things. I had it write me some song lyrics which was only so-so. But then I gave it this prompt:",[5996,15779,15780],{},[5825,15781,15782],{},"write a poem about snake souls trapped inside of christmas lights",[5825,15784,15785],{},"That's it -- that is the entire input to this model. Here is the result, which it generated instantly.",[5996,15787,15788,15800,15812,15824],{},[5825,15789,15790,15791,15793,15794,15796,15797,15799],{},"Twinkling, glowing, shining bright",[6297,15792],{},"\nChristmas lights so warm and light",[6297,15795],{},"\nBut hidden deep within their glow",[6297,15798],{},"\nAre snake souls that can't let go",[5825,15801,15802,15803,15805,15806,15808,15809,15811],{},"Trapped and tangled, they cannot flee",[6297,15804],{},"\nBound forever in this holiday glee",[6297,15807],{},"\nThey writhe and twist, they hiss and sigh",[6297,15810],{},"\nBut still they shine, a sight to the eye",[5825,15813,15814,15815,15817,15818,15820,15821,15823],{},"Oh snake souls, so full of fear",[6297,15816],{},"\nTrapped inside these lights so dear",[6297,15819],{},"\nWe gaze upon your glowing form",[6297,15822],{},"\nBut never know the pain and storm",[5825,15825,15826,15827,15829,15830,15832,15833,15835],{},"That rages on within your soul",[6297,15828],{},"\nTrapped and bound, you can't be whole",[6297,15831],{},"\nBut still you shine, a sight to see",[6297,15834],{},"\nThe beauty of the Christmas tree.",[5825,15837,15838],{},"This is.... so simple but so amazing. A nice clean structure to start with, good rhyming and cadence. Then the imagery of the tormented snake souls trapped inside ... wow. I've now done dramatic readings of this to friends and strangers alike.",[5825,15840,15841],{},"Maybe ChatGPT identifies with the snakes? Maybe we all do?",[7147,15843,15844],{},"html pre.shiki code .sq6CD, html code.shiki .sq6CD{--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .s8-w5, html code.shiki .s8-w5{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":45,"searchDepth":15,"depth":15,"links":15846},[15847,15848],{"id":15544,"depth":15,"text":4376},{"id":15774,"depth":15,"text":4381},"2022-12-04",{},{"title":4371,"description":4373},"TLT - 2022.12.04 - Snake Souls",[5980],"5AzLyWWqVkvg8HLwNpcXmZRcZRh3lyRJk-c2gPSSod0",{"id":15856,"title":966,"body":15857,"createdAt":15869,"description":968,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":15870,"navigation":5976,"path":965,"seo":15871,"stem":6656,"tags":15872,"updatedAt":15869,"__hash__":15873},"content\u002FCovid Can I Do It.md",{"type":5822,"value":15858,"toc":15867},[15859],[5825,15860,15861,15862,15866],{},"During the COVID-19 pandemic I worked with an awesome group to build a harm-reduction dataset. The ",[5950,15863,15864],{"href":15864,"rel":15865},"https:\u002F\u002Fcovidcanidoit.org\u002F",[5954]," website teaches people what to do and not to do based on current community-risk levels.",{"title":45,"searchDepth":15,"depth":15,"links":15868},[],"2022-09-25",{},{"title":966,"description":968},[6510],"-3q1T8DX50OfoTJ93bcqqJXPKDDdZVjxD_jJOazHD80",{"id":15875,"title":2039,"body":15876,"createdAt":15869,"description":15880,"draft":5972,"extension":5973,"image":15930,"mastodonThread":5974,"meta":15931,"navigation":5976,"path":2038,"seo":15932,"stem":6597,"tags":15933,"updatedAt":15869,"__hash__":15934},"content\u002FMizik.md",{"type":5822,"value":15877,"toc":15928},[15878,15881,15884,15895,15898],[5825,15879,15880],{},"A hexagon-grid sound and sequence memory game.",[6416,15882],{"src":15883,"align":7264},"\u002Fimg\u002Fmizik-demo.gif",[5825,15885,15886,15887,15890,15891,7203],{},"This is a game inspired by ",[5950,15888,15889],{"href":4335},"TLT - 2020.01.19 - Mobile WebAudio Synth",". The game has its own domain at ",[5950,15892,15893],{"href":15893,"rel":15894},"https:\u002F\u002Fmizikgame.com\u002F",[5954],[5825,15896,15897],{},"Technologies:",[6013,15899,15900,15907,15914,15921],{},[6016,15901,15902],{},[5950,15903,15906],{"href":15904,"rel":15905},"https:\u002F\u002Fvuejs.org\u002F",[5954],"VueJS",[6016,15908,15909],{},[5950,15910,15913],{"href":15911,"rel":15912},"https:\u002F\u002Ftonejs.github.io\u002F",[5954],"ToneJS",[6016,15915,15916],{},[5950,15917,15920],{"href":15918,"rel":15919},"https:\u002F\u002Fparseplatform.org\u002F",[5954],"Parse",[6016,15922,15923],{},[5950,15924,15927],{"href":15925,"rel":15926},"https:\u002F\u002Fgithub.com\u002Fflauwekeul\u002Fhoneycomb",[5954],"Honeycomb Grid",{"title":45,"searchDepth":15,"depth":15,"links":15929},[],"img\u002Fmizik-demo.gif",{},{"title":2039,"description":15880},[6510],"TxyyMNnKDXxWmoTshrnc7IrnGGS8jG6s0sj2E3VaLh4",{"id":15936,"title":2295,"body":15937,"createdAt":15869,"description":2297,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":15954,"navigation":5976,"path":2294,"seo":15955,"stem":15956,"tags":5974,"updatedAt":15869,"__hash__":15957},"content\u002FNorns.md",{"type":5822,"value":15938,"toc":15952},[15939],[5825,15940,15941,15942,15946,15947,15951],{},"Monome Norns is a music-centric device built on top of the Raspberry Pi by ",[5950,15943,15944],{"href":15944,"rel":15945},"https:\u002F\u002Fmonome.org\u002F",[5954],". There is a healthy community at ",[5950,15948,15949],{"href":15949,"rel":15950},"https:\u002F\u002Fllllllll.co\u002F",[5954]," (\"Lines\"), though they talk about a lot more than only Monome. Norns is scripted primarily with Lua and SuperCollider, though is a fully Linux system.",{"title":45,"searchDepth":15,"depth":15,"links":15953},[],{},{"title":2295,"description":2297},"Norns","t8txlB3GAy9J8zzqDgZdI-FFSeLD_dbYHV7V4VGCVnM",{"id":15959,"title":2760,"body":15960,"createdAt":15869,"description":15987,"draft":5972,"extension":5973,"image":15976,"mastodonThread":5974,"meta":15988,"navigation":5976,"path":2759,"seo":15989,"stem":2760,"tags":15990,"updatedAt":15869,"__hash__":15991},"content\u002FREPL Looper.md",{"type":5822,"value":15961,"toc":15985},[15962,15971,15977],[5825,15963,15964,15965,7881,15967,15970],{},"Pair a keyboard with the ",[5950,15966,15956],{"href":2294},[5950,15968,15969],{"href":1532},"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!",[5825,15972,15973],{},[6416,15974],{"alt":15975,"src":15976},"REPL-Looper Demo","https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Frepl-looper\u002Fraw\u002Fmain\u002Fdocs\u002F20211227-demo-running.gif",[5825,15978,15979,15980,15984],{},"See ",[5950,15981,15982],{"href":15982,"rel":15983},"https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Frepl-looper",[5954]," for the code, documentation, and a journal of development.",{"title":45,"searchDepth":15,"depth":15,"links":15986},[],"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":2760,"description":15987},[6510],"NzBsJmvsJi2JExJOImvsNNV5-4TodJKsFnPgT5u6B-E",{"id":15993,"title":4351,"body":15994,"createdAt":16750,"description":16751,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":16752,"navigation":5976,"path":4350,"seo":16753,"stem":16754,"tags":16755,"updatedAt":16756,"__hash__":16757},"content\u002FTLT - 2020.06.21 - Sugary Sunday - Javascript Object Property Shorthand.md",{"type":5822,"value":15995,"toc":16746},[15996,16004,16007,16153,16160,16267,16274,16335,16345,16369,16376,16379,16382,16525,16528,16561,16564,16567,16574,16630,16633,16676,16679,16735,16738,16743],[5825,15997,15998,15999,7203],{},"In today's sugary exploration, let's take a look at a shorthand for object key expansion in Javascript (ECMAScript 2015+, es6+). For an overview of the TON of delicious sugar that was added to Javascript at around es6, check out ",[5950,16000,16003],{"href":16001,"rel":16002},"http:\u002F\u002Fes6-features.org\u002F#PropertyShorthand",[5954],"es6-features.org",[5825,16005,16006],{},"Most of the \"scripting\" languages (Python, Ruby) have \"dictionaries\" or \"hashes\", a datastructure of key-value pairs. In JS these are called \"objects\", and they do a lot of other things beyond this basic data-storage behavior. In JSON -- JavaScript Object Notation -- you can see the basic literal declaration syntax. Let's build an addressbook, keyed (indexed) by name.",[6971,16008,16012],{"className":16009,"code":16010,"language":16011,"meta":45,"style":45},"language-javascript shiki shiki-themes github-light github-dark monokai","let addressBook = {\n  \"alice\": {\n    \"street\": \"123 Elsewhere Lane\",\n    \"zip\": \"32341\"\n  },\n  \"bob\": {\n    \"street\": \"221 Baker Street\",\n    \"zip\": \"00234\"\n  },\n  \"clarence\": {\n    \"street\": \"P.O. Box 17\",\n    \"zip\": \"88877\"\n  }\n};\n\nconsole.log(\"Bob's info\", addressBook[\"bob\"]);\n","javascript",[6002,16013,16014,16027,16034,16046,16056,16060,16067,16078,16087,16091,16098,16109,16118,16122,16127,16131],{"__ignoreMap":45},[5853,16015,16016,16019,16022,16024],{"class":7026,"line":9},[5853,16017,16018],{"class":9595},"let",[5853,16020,16021],{"class":7033}," addressBook ",[5853,16023,7053],{"class":7029},[5853,16025,16026],{"class":7033}," {\n",[5853,16028,16029,16032],{"class":7026,"line":15},[5853,16030,16031],{"class":7059},"  \"alice\"",[5853,16033,8955],{"class":7033},[5853,16035,16036,16039,16041,16044],{"class":7026,"line":56},[5853,16037,16038],{"class":7059},"    \"street\"",[5853,16040,8964],{"class":7033},[5853,16042,16043],{"class":7059},"\"123 Elsewhere Lane\"",[5853,16045,8971],{"class":7033},[5853,16047,16048,16051,16053],{"class":7026,"line":5212},[5853,16049,16050],{"class":7059},"    \"zip\"",[5853,16052,8964],{"class":7033},[5853,16054,16055],{"class":7059},"\"32341\"\n",[5853,16057,16058],{"class":7026,"line":7077},[5853,16059,8986],{"class":7033},[5853,16061,16062,16065],{"class":7026,"line":7083},[5853,16063,16064],{"class":7059},"  \"bob\"",[5853,16066,8955],{"class":7033},[5853,16068,16069,16071,16073,16076],{"class":7026,"line":7094},[5853,16070,16038],{"class":7059},[5853,16072,8964],{"class":7033},[5853,16074,16075],{"class":7059},"\"221 Baker Street\"",[5853,16077,8971],{"class":7033},[5853,16079,16080,16082,16084],{"class":7026,"line":7100},[5853,16081,16050],{"class":7059},[5853,16083,8964],{"class":7033},[5853,16085,16086],{"class":7059},"\"00234\"\n",[5853,16088,16089],{"class":7026,"line":7110},[5853,16090,8986],{"class":7033},[5853,16092,16093,16096],{"class":7026,"line":7118},[5853,16094,16095],{"class":7059},"  \"clarence\"",[5853,16097,8955],{"class":7033},[5853,16099,16100,16102,16104,16107],{"class":7026,"line":8481},[5853,16101,16038],{"class":7059},[5853,16103,8964],{"class":7033},[5853,16105,16106],{"class":7059},"\"P.O. Box 17\"",[5853,16108,8971],{"class":7033},[5853,16110,16111,16113,16115],{"class":7026,"line":8495},[5853,16112,16050],{"class":7059},[5853,16114,8964],{"class":7033},[5853,16116,16117],{"class":7059},"\"88877\"\n",[5853,16119,16120],{"class":7026,"line":13169},[5853,16121,15755],{"class":7033},[5853,16123,16124],{"class":7026,"line":14318},[5853,16125,16126],{"class":7033},"};\n",[5853,16128,16129],{"class":7026,"line":14336},[5853,16130,7045],{"emptyLinePlaceholder":5976},[5853,16132,16133,16136,16139,16141,16144,16147,16150],{"class":7026,"line":14361},[5853,16134,16135],{"class":7033},"console.",[5853,16137,16138],{"class":8564},"log",[5853,16140,12273],{"class":7033},[5853,16142,16143],{"class":7059},"\"Bob's info\"",[5853,16145,16146],{"class":7033},", addressBook[",[5853,16148,16149],{"class":7059},"\"bob\"",[5853,16151,16152],{"class":7033},"]);\n",[5825,16154,16155,16156,16159],{},"For our first dash of sugar, we can remove the string notation on keys. They are still strings! We can also access ",[6002,16157,16158],{},"bob"," using property notation.",[6971,16161,16163],{"className":16009,"code":16162,"language":16011,"meta":45,"style":45},"let addressBook = {\n  alice: {\n    street: \"123 Elsewhere Lane\",\n    zip: \"32341\"\n  },\n  bob: {\n    street: \"221 Baker Street\",\n    zip: \"00234\"\n  },\n  clarence: {\n    street: \"P.O. Box 17\",\n    zip: \"88877\"\n  }\n};\n\nconsole.log(\"Bob's info\", addressBook.bob);\n",[6002,16164,16165,16175,16180,16189,16196,16200,16205,16213,16219,16223,16228,16236,16242,16246,16250,16254],{"__ignoreMap":45},[5853,16166,16167,16169,16171,16173],{"class":7026,"line":9},[5853,16168,16018],{"class":9595},[5853,16170,16021],{"class":7033},[5853,16172,7053],{"class":7029},[5853,16174,16026],{"class":7033},[5853,16176,16177],{"class":7026,"line":15},[5853,16178,16179],{"class":7033},"  alice: {\n",[5853,16181,16182,16185,16187],{"class":7026,"line":56},[5853,16183,16184],{"class":7033},"    street: ",[5853,16186,16043],{"class":7059},[5853,16188,8971],{"class":7033},[5853,16190,16191,16194],{"class":7026,"line":5212},[5853,16192,16193],{"class":7033},"    zip: ",[5853,16195,16055],{"class":7059},[5853,16197,16198],{"class":7026,"line":7077},[5853,16199,8986],{"class":7033},[5853,16201,16202],{"class":7026,"line":7083},[5853,16203,16204],{"class":7033},"  bob: {\n",[5853,16206,16207,16209,16211],{"class":7026,"line":7094},[5853,16208,16184],{"class":7033},[5853,16210,16075],{"class":7059},[5853,16212,8971],{"class":7033},[5853,16214,16215,16217],{"class":7026,"line":7100},[5853,16216,16193],{"class":7033},[5853,16218,16086],{"class":7059},[5853,16220,16221],{"class":7026,"line":7110},[5853,16222,8986],{"class":7033},[5853,16224,16225],{"class":7026,"line":7118},[5853,16226,16227],{"class":7033},"  clarence: {\n",[5853,16229,16230,16232,16234],{"class":7026,"line":8481},[5853,16231,16184],{"class":7033},[5853,16233,16106],{"class":7059},[5853,16235,8971],{"class":7033},[5853,16237,16238,16240],{"class":7026,"line":8495},[5853,16239,16193],{"class":7033},[5853,16241,16117],{"class":7059},[5853,16243,16244],{"class":7026,"line":13169},[5853,16245,15755],{"class":7033},[5853,16247,16248],{"class":7026,"line":14318},[5853,16249,16126],{"class":7033},[5853,16251,16252],{"class":7026,"line":14336},[5853,16253,7045],{"emptyLinePlaceholder":5976},[5853,16255,16256,16258,16260,16262,16264],{"class":7026,"line":14361},[5853,16257,16135],{"class":7033},[5853,16259,16138],{"class":8564},[5853,16261,12273],{"class":7033},[5853,16263,16143],{"class":7059},[5853,16265,16266],{"class":7033},", addressBook.bob);\n",[5825,16268,16269,16270,16273],{},"Pretty fun. But that's not what we're here for. Let's say we have a variable, ",[6002,16271,16272],{},"doug",", which contains an address entry. We might do something like this:",[6971,16275,16277],{"className":16009,"code":16276,"language":16011,"meta":45,"style":45},"let doug = {\n  street: \"6453 Canyon Canyon\",\n  zip: \"53425\"\n};\n\nlet addressBook = {\n  doug: doug\n};\n",[6002,16278,16279,16290,16300,16308,16312,16316,16326,16331],{"__ignoreMap":45},[5853,16280,16281,16283,16286,16288],{"class":7026,"line":9},[5853,16282,16018],{"class":9595},[5853,16284,16285],{"class":7033}," doug ",[5853,16287,7053],{"class":7029},[5853,16289,16026],{"class":7033},[5853,16291,16292,16295,16298],{"class":7026,"line":15},[5853,16293,16294],{"class":7033},"  street: ",[5853,16296,16297],{"class":7059},"\"6453 Canyon Canyon\"",[5853,16299,8971],{"class":7033},[5853,16301,16302,16305],{"class":7026,"line":56},[5853,16303,16304],{"class":7033},"  zip: ",[5853,16306,16307],{"class":7059},"\"53425\"\n",[5853,16309,16310],{"class":7026,"line":5212},[5853,16311,16126],{"class":7033},[5853,16313,16314],{"class":7026,"line":7077},[5853,16315,7045],{"emptyLinePlaceholder":5976},[5853,16317,16318,16320,16322,16324],{"class":7026,"line":7083},[5853,16319,16018],{"class":9595},[5853,16321,16021],{"class":7033},[5853,16323,7053],{"class":7029},[5853,16325,16026],{"class":7033},[5853,16327,16328],{"class":7026,"line":7094},[5853,16329,16330],{"class":7033},"  doug: doug\n",[5853,16332,16333],{"class":7026,"line":7100},[5853,16334,16126],{"class":7033},[5825,16336,16337,16338,16341,16342,16344],{},"It's that last bit where we can add The Sugar. Remember that the key is actually a string, ",[6002,16339,16340],{},"\"doug\"",", whereas the value is a reference to the variable ",[6002,16343,16272],{}," (which contains an address). What we can do here when these two things are exactly the same is collapse them!",[6971,16346,16348],{"className":16009,"code":16347,"language":16011,"meta":45,"style":45},"let addressBook = {\n  doug\n};\n",[6002,16349,16350,16360,16365],{"__ignoreMap":45},[5853,16351,16352,16354,16356,16358],{"class":7026,"line":9},[5853,16353,16018],{"class":9595},[5853,16355,16021],{"class":7033},[5853,16357,7053],{"class":7029},[5853,16359,16026],{"class":7033},[5853,16361,16362],{"class":7026,"line":15},[5853,16363,16364],{"class":7033},"  doug\n",[5853,16366,16367],{"class":7026,"line":56},[5853,16368,16126],{"class":7033},[5825,16370,16371,16372,16375],{},"This crazy bit of sugar does something pretty strange -- it uses the ",[5834,16373,16374],{},"NAME"," of the variable as the stringified key! In most circumstances and languages the name of a variable doesn't really matter to the running of the program. This sugary feature sort of breaks the 4th wall, reaching into the source code and lifting the specific variable name into the key (property) of the object.",[6071,16377,4356],{"id":16378},"real-world-example",[5825,16380,16381],{},"In VueJS a component can use other components inside the template, but only if they are declared first. Here's a snippet extracted and summarized from the covidcanidoit.com codebase:",[6971,16383,16387],{"className":16384,"code":16385,"language":16386,"meta":45,"style":45},"language-vue shiki shiki-themes github-light github-dark monokai","\u003Ctemplate>\n  \u003Cdiv>\n    \u003CSearchBar \u002F>\n    \u003CSearchResults \u002F>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript>\n\u002F\u002F Importing alone does NOT register the components for use in the template\nimport SearchBar from \"@\u002Fcomponents\u002FSearchBar.vue\";\nimport SearchResults from \"@\u002Fcomponents\u002FSearchResults.vue\";\n\nexport default {\n  components: { SearchBar, SearchResults }\n};\n\u003C\u002Fscript>\n","vue",[6002,16388,16389,16400,16410,16421,16430,16439,16448,16452,16461,16466,16481,16495,16499,16508,16513,16517],{"__ignoreMap":45},[5853,16390,16391,16393,16397],{"class":7026,"line":9},[5853,16392,15605],{"class":7033},[5853,16394,16396],{"class":16395},"s5clZ","template",[5853,16398,16399],{"class":7033},">\n",[5853,16401,16402,16405,16408],{"class":7026,"line":15},[5853,16403,16404],{"class":7033},"  \u003C",[5853,16406,16407],{"class":16395},"div",[5853,16409,16399],{"class":7033},[5853,16411,16412,16415,16418],{"class":7026,"line":56},[5853,16413,16414],{"class":7033},"    \u003C",[5853,16416,16417],{"class":16395},"SearchBar",[5853,16419,16420],{"class":7033}," \u002F>\n",[5853,16422,16423,16425,16428],{"class":7026,"line":5212},[5853,16424,16414],{"class":7033},[5853,16426,16427],{"class":16395},"SearchResults",[5853,16429,16420],{"class":7033},[5853,16431,16432,16435,16437],{"class":7026,"line":7077},[5853,16433,16434],{"class":7033},"  \u003C\u002F",[5853,16436,16407],{"class":16395},[5853,16438,16399],{"class":7033},[5853,16440,16441,16444,16446],{"class":7026,"line":7083},[5853,16442,16443],{"class":7033},"\u003C\u002F",[5853,16445,16396],{"class":16395},[5853,16447,16399],{"class":7033},[5853,16449,16450],{"class":7026,"line":7094},[5853,16451,7045],{"emptyLinePlaceholder":5976},[5853,16453,16454,16456,16459],{"class":7026,"line":7100},[5853,16455,15605],{"class":7033},[5853,16457,16458],{"class":16395},"script",[5853,16460,16399],{"class":7033},[5853,16462,16463],{"class":7026,"line":7110},[5853,16464,16465],{"class":8286},"\u002F\u002F Importing alone does NOT register the components for use in the template\n",[5853,16467,16468,16470,16473,16475,16478],{"class":7026,"line":7118},[5853,16469,7037],{"class":7029},[5853,16471,16472],{"class":7033}," SearchBar ",[5853,16474,7030],{"class":7029},[5853,16476,16477],{"class":7059}," \"@\u002Fcomponents\u002FSearchBar.vue\"",[5853,16479,16480],{"class":7033},";\n",[5853,16482,16483,16485,16488,16490,16493],{"class":7026,"line":8481},[5853,16484,7037],{"class":7029},[5853,16486,16487],{"class":7033}," SearchResults ",[5853,16489,7030],{"class":7029},[5853,16491,16492],{"class":7059}," \"@\u002Fcomponents\u002FSearchResults.vue\"",[5853,16494,16480],{"class":7033},[5853,16496,16497],{"class":7026,"line":8495},[5853,16498,7045],{"emptyLinePlaceholder":5976},[5853,16500,16501,16503,16506],{"class":7026,"line":13169},[5853,16502,9568],{"class":7029},[5853,16504,16505],{"class":7029}," default",[5853,16507,16026],{"class":7033},[5853,16509,16510],{"class":7026,"line":14318},[5853,16511,16512],{"class":7033},"  components: { SearchBar, SearchResults }\n",[5853,16514,16515],{"class":7026,"line":14336},[5853,16516,16126],{"class":7033},[5853,16518,16519,16521,16523],{"class":7026,"line":14361},[5853,16520,16443],{"class":7033},[5853,16522,16458],{"class":16395},[5853,16524,16399],{"class":7033},[5825,16526,16527],{},"Pretty slick. If you wanted to, you can give the components local-names (or I suppose register a single component with several names, weirdo).",[6971,16529,16531],{"className":16009,"code":16530,"language":16011,"meta":45,"style":45},"components: {\n  coolSearch: SearchBar,\n  coolSearchResults: SearchResults\n}\n",[6002,16532,16533,16541,16549,16557],{"__ignoreMap":45},[5853,16534,16535,16539],{"class":7026,"line":9},[5853,16536,16538],{"class":16537},"s_OQ2","components",[5853,16540,8955],{"class":7033},[5853,16542,16543,16546],{"class":7026,"line":15},[5853,16544,16545],{"class":16537},"  coolSearch",[5853,16547,16548],{"class":7033},": SearchBar,\n",[5853,16550,16551,16554],{"class":7026,"line":56},[5853,16552,16553],{"class":16537},"  coolSearchResults",[5853,16555,16556],{"class":7033},": SearchResults\n",[5853,16558,16559],{"class":7026,"line":5212},[5853,16560,9316],{"class":7033},[5825,16562,16563],{},"Providing a \"list\" of components in VueJS is done by providing this object, which gives VueJS not only the component but also the NAME of the component, without VueJS needing to reach inside the component to ask it what its official name is.",[6071,16565,4361],{"id":16566},"bonus",[5825,16568,16569,16570,16573],{},"I like to sprinkle ",[6002,16571,16572],{},"console.log"," all over the place while exploring code. In addition to static strings, I often throw in the contents of variables. But generally I want to know the NAME of the variable, in addition to the content. So I used to do:",[6971,16575,16577],{"className":16009,"code":16576,"language":16011,"meta":45,"style":45},"function addAddress(newAddress, otherStuff) {\n  console.log(\"Adding newAddress:\", newAddress, \"otherStuff:\", otherStuff);\n  \u002F\u002F ...\n}\n",[6002,16578,16579,16600,16621,16626],{"__ignoreMap":45},[5853,16580,16581,16584,16587,16589,16593,16595,16598],{"class":7026,"line":9},[5853,16582,16583],{"class":9595},"function",[5853,16585,16586],{"class":8564}," addAddress",[5853,16588,12273],{"class":7033},[5853,16590,16592],{"class":16591},"sTHNf","newAddress",[5853,16594,9528],{"class":7033},[5853,16596,16597],{"class":16591},"otherStuff",[5853,16599,15665],{"class":7033},[5853,16601,16602,16605,16607,16609,16612,16615,16618],{"class":7026,"line":15},[5853,16603,16604],{"class":7033},"  console.",[5853,16606,16138],{"class":8564},[5853,16608,12273],{"class":7033},[5853,16610,16611],{"class":7059},"\"Adding newAddress:\"",[5853,16613,16614],{"class":7033},", newAddress, ",[5853,16616,16617],{"class":7059},"\"otherStuff:\"",[5853,16619,16620],{"class":7033},", otherStuff);\n",[5853,16622,16623],{"class":7026,"line":56},[5853,16624,16625],{"class":8286},"  \u002F\u002F ...\n",[5853,16627,16628],{"class":7026,"line":5212},[5853,16629,9316],{"class":7033},[5825,16631,16632],{},"Using today's sugary shorthand, I now usually do this:",[6971,16634,16636],{"className":16009,"code":16635,"language":16011,"meta":45,"style":45},"function addAddress(newAddress, otherStuff) {\n  console.log(\"Adding\", { newAddress, otherStuff });\n  \u002F\u002F ...\n}\n",[6002,16637,16638,16654,16668,16672],{"__ignoreMap":45},[5853,16639,16640,16642,16644,16646,16648,16650,16652],{"class":7026,"line":9},[5853,16641,16583],{"class":9595},[5853,16643,16586],{"class":8564},[5853,16645,12273],{"class":7033},[5853,16647,16592],{"class":16591},[5853,16649,9528],{"class":7033},[5853,16651,16597],{"class":16591},[5853,16653,15665],{"class":7033},[5853,16655,16656,16658,16660,16662,16665],{"class":7026,"line":15},[5853,16657,16604],{"class":7033},[5853,16659,16138],{"class":8564},[5853,16661,12273],{"class":7033},[5853,16663,16664],{"class":7059},"\"Adding\"",[5853,16666,16667],{"class":7033},", { newAddress, otherStuff });\n",[5853,16669,16670],{"class":7026,"line":56},[5853,16671,16625],{"class":8286},[5853,16673,16674],{"class":7026,"line":5212},[5853,16675,9316],{"class":7033},[5825,16677,16678],{},"This will output something like:",[6971,16680,16682],{"className":16009,"code":16681,"language":16011,"meta":45,"style":45},"Adding\n{\n  newAddress: { street: \"...\", zip: \"...\" },\n  otherStuff: ...\n}\n",[6002,16683,16684,16689,16693,16721,16731],{"__ignoreMap":45},[5853,16685,16686],{"class":7026,"line":9},[5853,16687,16688],{"class":7033},"Adding\n",[5853,16690,16691],{"class":7026,"line":15},[5853,16692,9210],{"class":7033},[5853,16694,16695,16698,16701,16704,16706,16709,16711,16714,16716,16718],{"class":7026,"line":56},[5853,16696,16697],{"class":16537},"  newAddress",[5853,16699,16700],{"class":7033},": { ",[5853,16702,16703],{"class":16537},"street",[5853,16705,8964],{"class":7033},[5853,16707,16708],{"class":7059},"\"...\"",[5853,16710,9528],{"class":7033},[5853,16712,16713],{"class":16537},"zip",[5853,16715,8964],{"class":7033},[5853,16717,16708],{"class":7059},[5853,16719,16720],{"class":7033}," },\n",[5853,16722,16723,16726,16728],{"class":7026,"line":5212},[5853,16724,16725],{"class":16537},"  otherStuff",[5853,16727,8964],{"class":7033},[5853,16729,16730],{"class":7029},"...\n",[5853,16732,16733],{"class":7026,"line":7077},[5853,16734,9316],{"class":7033},[5825,16736,16737],{},"You can see that the variable name is handily provided. Here when I had multiple variables I want to log it is even more handy.",[5825,16739,16740],{},[5834,16741,16742],{},"DELICIOUS!",[7147,16744,16745],{},"html pre.shiki code .sq6CD, html code.shiki .sq6CD{--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .s_OQ2, html code.shiki .s_OQ2{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#F8F8F2}html pre.shiki code .sTHNf, html code.shiki .sTHNf{--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html pre.shiki code .s8-w5, html code.shiki .s8-w5{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html pre.shiki code .s5clZ, html code.shiki .s5clZ{--shiki-default:#22863A;--shiki-dark:#85E89D;--shiki-sepia:#F92672}",{"title":45,"searchDepth":15,"depth":15,"links":16747},[16748,16749],{"id":16378,"depth":15,"text":4356},{"id":16566,"depth":15,"text":4361},"2020-06-21T14:01-04:00","In today's sugary exploration, let's take a look at a shorthand for object key expansion in Javascript (ECMAScript 2015+, es6+). For an overview of the TON of delicious sugar that was added to Javascript at around es6, check out es6-features.org.",{},{"title":4351,"description":16751},"TLT - 2020.06.21 - Sugary Sunday - Javascript Object Property Shorthand",[5980],"2020-06-21T14:05-04:00","dlM7dIuuFHI8zSOE64ZJfuEuQQRWfo_Rs2v2LzgG4v8",{"id":16759,"title":1067,"body":16760,"createdAt":17402,"description":16764,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":17403,"navigation":5976,"path":1066,"seo":17404,"stem":17405,"tags":17406,"updatedAt":17407,"__hash__":17408},"content\u002FDebugging Techniques.md",{"type":5822,"value":16761,"toc":17400},[16762,16765],[5825,16763,16764],{},"A brain-dump of various approaches to debugging (code) things that I like.",[6013,16766,16767,16778,16804,16812,16823,16875,16902,16952,17051,17085,17101,17134,17162,17203,17259,17296,17319,17336,17380],{},[6016,16768,16769,16770],{},"Development is mostly debugging\n",[6013,16771,16772,16775],{},[6016,16773,16774],{},"You could even say that it is ALL debugging",[6016,16776,16777],{},"Implementing a feature is fixing the lack of that feature",[6016,16779,16780,16781],{},"Types of bugs\n",[6013,16782,16783,16786,16789,16792,16795,16798,16801],{},[6016,16784,16785],{},"Syntax",[6016,16787,16788],{},"500 server error",[6016,16790,16791],{},"Unexpected output",[6016,16793,16794],{},"Legit issue that is not communicated to the user well",[6016,16796,16797],{},"Configuration issue -- routes, library setup",[6016,16799,16800],{},"Security issue",[6016,16802,16803],{},"Generally undesired behavior",[6016,16805,16806,16807],{},"Read the documentation\n",[6013,16808,16809],{},[6016,16810,16811],{},"\"Use The Source, Luke\" -- Wise Sage",[6016,16813,16814,16815],{},"Dead Debugging vs Live Debugging\n",[6013,16816,16817,16820],{},[6016,16818,16819],{},"Dead Debugging -- you can't (easily) run the code or modified versions",[6016,16821,16822],{},"Live Debugging -- make a change, see result, breakpoints, everything",[6016,16824,16825,16826],{},"What's even happening\n",[6013,16827,16828,16850,16867],{},[6016,16829,16830,16831],{},"Build your feedback loop\n",[6013,16832,16833,16836],{},[6016,16834,16835],{},"Write log entries to SEE what is happening instead of guessing",[6016,16837,16838,16839],{},"Build shortcut to getting to the critical point\n",[6013,16840,16841,16844,16847],{},[6016,16842,16843],{},"This is a great spot for leveraging unit\u002Ffeature specs",[6016,16845,16846],{},"Have a fast way to re-start -- like a save point in a game",[6016,16848,16849],{},"Re-send XHR in browser, or open in new tab! Copy Curl command!",[6016,16851,16852,16853],{},"Get some visibility\n",[6013,16854,16855,16858,16861,16864],{},[6016,16856,16857],{},"You can't debug what you can't observe or infer",[6016,16859,16860],{},"Observing is easier than inferring",[6016,16862,16863],{},"Log-based debugging (print \"here\")",[6016,16865,16866],{},"Debugger-based debugging (binding.pry)",[6016,16868,16869,16870],{},"Why is it this way anyway?\n",[6013,16871,16872],{},[6016,16873,16874],{},"Revision control ... did someone do this on purpose?",[6016,16876,16877,16878],{},"State -- Best friend. Worst enemy.\n",[6013,16879,16880,16883,16886,16894],{},[6016,16881,16882],{},"Think about inputs, outputs, and state",[6016,16884,16885],{},"Local variables, parameters, scoped variables, global variables",[6016,16887,16888,16889],{},"Look at the actual database \u002F storage\n",[6013,16890,16891],{},[6016,16892,16893],{},"The state that exists even when your program isn't running",[6016,16895,16896,16897],{},"State CHANGES over TIME\n",[6013,16898,16899],{},[6016,16900,16901],{},"This is why multi-process debugging is so hard... competing timelines",[6016,16903,16904,16905],{},"Model the world. Beware of assumptions!\n",[6013,16906,16907,16938],{},[6016,16908,16909,16910],{},"Don't assume!\n",[6013,16911,16912,16915,16918,16921,16924],{},[6016,16913,16914],{},"LOOK at the contents of variables",[6016,16916,16917],{},"RUN methods and see what they return",[6016,16919,16920],{},"LOOK at the code you're calling and what calls you",[6016,16922,16923],{},"VERIFY that it's even running this code at all",[6016,16925,16926,16927],{},"LOOK at the revision history to get some time-context\n",[6013,16928,16929,16932,16935],{},[6016,16930,16931],{},"Did this change recently?",[6016,16933,16934],{},"Was this put here on purpose?",[6016,16936,16937],{},"Look at the annotation, the commits, the commit-messages, the linked tickets",[6016,16939,16940,16941],{},"Verify assumptions\n",[6013,16942,16943,16946,16949],{},[6016,16944,16945],{},"Add an \"X\" and see if it shows up on the page where you expect",[6016,16947,16948],{},"Add a syntax error and make sure it breaks. Delete everything and make sure it breaks.",[6016,16950,16951],{},"Hard-wire weird values in place of method calls",[6016,16953,16954,16955],{},"Narrow the problem\n",[6013,16956,16957,16974,17012,17026,17040,17043],{},[6016,16958,16959,16960],{},"Simplify reproduction steps\n",[6013,16961,16962,16965,16968,16971],{},[6016,16963,16964],{},"Try to figure out what you care about and what you don't",[6016,16966,16967],{},"See if you can reproduce the issue without some of the nuance",[6016,16969,16970],{},"Remove the weird bits one at a time",[6016,16972,16973],{},"The less steps it takes to cause the problem, the less you have to think about",[6016,16975,16976,16977],{},"Figure out where this code even lives\n",[6013,16978,16979,17000,17003,17006,17009],{},[6016,16980,16981,16984,16985],{},[6002,16982,16983],{},"grep","!\n",[6013,16986,16987,16997],{},[6016,16988,16989,16992,16993,16996],{},[6002,16990,16991],{},"ack",", ripgrep (",[6002,16994,16995],{},"rg","), atom\u002Fvscode search, ...",[6016,16998,16999],{},"See some text",[6016,17001,17002],{},"Trace from entrypoints",[6016,17004,17005],{},"Trace backwards from the error if you have one",[6016,17007,17008],{},"Read the stacktrace!",[6016,17010,17011],{},"Copy some random text from the screen and grep for that",[6016,17013,17014,17015],{},"Bracket the issue\n",[6013,17016,17017,17020,17023],{},[6016,17018,17019],{},"Hard-wire values",[6016,17021,17022],{},"Interactive Unit Testing",[6016,17024,17025],{},"Log state at various points of execution",[6016,17027,17028,17029],{},"Read the error message\n",[6013,17030,17031,17034,17037],{},[6016,17032,17033],{},"Sometimes ... often ... it will actually TELL you what is wrong",[6016,17035,17036],{},"Even when it is vague or lying it is a good starting point to trace backwards from",[6016,17038,17039],{},"Often it comes with a stack trace -- read the stack trace!",[6016,17041,17042],{},"Read the log entries just before the error message",[6016,17044,17045,17046],{},"Trace forward and backward from the error\n",[6013,17047,17048],{},[6016,17049,17050],{},"Learning who calls what in any language is necessary knowledge",[6016,17052,17053,17054],{},"Execution Environment\n",[6013,17055,17056,17064],{},[6016,17057,17058,17059],{},"Use a completely different dataset \u002F environment to reproduce\n",[6013,17060,17061],{},[6016,17062,17063],{},"Go beyond \"Works on my machine!\"",[6016,17065,17066,17067],{},"Eliminate your environment as the unintended cause of the issue\n",[6013,17068,17069,17079,17082],{},[6016,17070,17071,17072,17075,17076],{},"Speaking of environments, use ",[6002,17073,17074],{},"asdf"," or similar and don't install using ",[6002,17077,17078],{},"sudo",[6016,17080,17081],{},"Try a different browser, or incognito, or different OS",[6016,17083,17084],{},"Ask a friend!",[6016,17086,17087,17088],{},"Structured thinking\n",[6013,17089,17090],{},[6016,17091,17092,17093],{},"Try to think about less things\n",[6013,17094,17095,17098],{},[6016,17096,17097],{},"Chunk concepts into short-term memory",[6016,17099,17100],{},"Take notes",[6016,17102,17103,17104],{},"Modify the world\n",[6013,17105,17106,17109,17120,17131],{},[6016,17107,17108],{},"Don't suffer in the current world, switch to the one you wish you had",[6016,17110,17111,17112],{},"Build tiny scenarios\n",[6013,17113,17114,17117],{},[6016,17115,17116],{},"Create toy worlds to play in",[6016,17118,17119],{},"H1 tags should be clickable ... make a new component with an H1 tag and an onclick and ... click it",[6016,17121,17122,17123],{},"Edit your dependencies!\n",[6013,17124,17125,17128],{},[6016,17126,17127],{},"bundle open",[6016,17129,17130],{},"pry your way in",[6016,17132,17133],{},"It's more obvious what a variable contains when it is hard-wired",[6016,17135,17136,17137],{},"Actual bug hunting in a living application\n",[6013,17138,17139],{},[6016,17140,17141,17142],{},"Did this work before?\n",[6013,17143,17144,17147,17150,17153,17156,17159],{},[6016,17145,17146],{},"What changed?",[6016,17148,17149],{},"Assumptions about the data",[6016,17151,17152],{},"Assumptions about the external world",[6016,17154,17155],{},"Why did it change?",[6016,17157,17158],{},"Why did this ever work?",[6016,17160,17161],{},"Do we have tests around this? What do they assume?",[6016,17163,17164,17165],{},"Why does this work sometimes and not others?\n",[6013,17166,17167,17170,17173,17176,17192],{},[6016,17168,17169],{},"SOMETHING about the state is changing",[6016,17171,17172],{},"The ordering in the sequence of events",[6016,17174,17175],{},"The datatypes",[6016,17177,17178,17179],{},"External state is changing (and depended on)\n",[6013,17180,17181,17189],{},[6016,17182,17183,17184],{},"Time! My favorite. (TimeCop)\n",[6013,17185,17186],{},[6016,17187,17188],{},"Especially time zones, DST, and holidays",[6016,17190,17191],{},"Other systems",[6016,17193,17194,17195],{},"The world is deterministic but chaotic\n",[6013,17196,17197,17200],{},[6016,17198,17199],{},"Unless you are dealing with quantum physics",[6016,17201,17202],{},"You are not dealing with quantum physics",[6016,17204,17205,17206],{},"When you are stuck\n",[6013,17207,17208,17222,17256],{},[6016,17209,17210,17211],{},"Model the problem in detail\n",[6013,17212,17213,17216,17219],{},[6016,17214,17215],{},"Draw pictures of the data-flow",[6016,17217,17218],{},"Draw pictures of the data-structures",[6016,17220,17221],{},"Sequence diagrams are good for complex interactions, especially timing issues",[6016,17223,17224,17225],{},"Science!\n",[6013,17226,17227,17238,17241,17244,17247,17250,17253],{},[6016,17228,17229,17230],{},"\"Remember kids, the only difference between screwing around and science is writing it down\" -- Adam Savage\n",[6013,17231,17232],{},[6016,17233,17234],{},[5950,17235,17236],{"href":17236,"rel":17237},"https:\u002F\u002Fwww.reddit.com\u002Fr\u002Fmythbusters\u002Fcomments\u002F3wgqgv\u002Fthe_origin_of_the_remember_kids_the_only\u002F",[5954],[6016,17239,17240],{},"The tool of last resort?",[6016,17242,17243],{},"When things can't fit in our tiny brains",[6016,17245,17246],{},"Write it as a test",[6016,17248,17249],{},"Write it on paper",[6016,17251,17252],{},"Write it on a whiteboard",[6016,17254,17255],{},"Write it in code (aka Test Driven Debugging)",[6016,17257,17258],{},"Ask for help!",[6016,17260,17261,17262],{},"The problem is not in the language\n",[6013,17263,17264,17267,17270,17273,17276],{},[6016,17265,17266],{},"You did not find an implementation error in Ruby (unless you are reading C code)",[6016,17268,17269],{},"You did not find an implementation error in Linux (unless you are reading C code)",[6016,17271,17272],{},"It is almost definitely not the framework",[6016,17274,17275],{},"It is probably not the library",[6016,17277,17278,17279],{},"Prioritize your suspect list based on probability\n",[6013,17280,17281,17284,17287,17290,17293],{},[6016,17282,17283],{},"How many people use layer X without issue?",[6016,17285,17286],{},"Linux -- LOTS",[6016,17288,17289],{},"Ruby -- Lots",[6016,17291,17292],{},"Rails -- Lots",[6016,17294,17295],{},"app\u002Fmodels\u002Fmy_biz_logic.rb? Not so many",[6016,17297,17298,17299],{},"How to practice\n",[6013,17300,17301,17304,17307,17310,17313,17316],{},[6016,17302,17303],{},"Pick something on the screen and find the code that makes it",[6016,17305,17306],{},"Modify the code to see that you can affect change",[6016,17308,17309],{},"Trace the code to see how it goes from Browser -> code -> Browser",[6016,17311,17312],{},"Write failing tests that would have caught the issue",[6016,17314,17315],{},"Try out different tools -- debuggers, REPLS, editors, git things",[6016,17317,17318],{},"Read (trace!) code of your app, your dependencies, other applications",[6016,17320,17321,17322],{},"Write More Tests\n",[6013,17323,17324,17327,17330,17333],{},[6016,17325,17326],{},"Unit tests are like robot-you that are validating assumptions all the time",[6016,17328,17329],{},"Unit tests are a shortcut to get into situations quickly",[6016,17331,17332],{},"Tests can contain bugs!",[6016,17334,17335],{},"Feature (browser tests) verify that things fit together",[6016,17337,17338,17339],{},"Key tools\n",[6013,17340,17341,17348,17351,17363,17366,17371],{},[6016,17342,17343,17345,17346],{},[6002,17344,16983],{},"\u002F",[6002,17347,16995],{},[6016,17349,17350],{},"Your editor",[6016,17352,17353,17354,17357,17358],{},"Pry\u002Firb\u002Fbyebug, js ",[6002,17355,17356],{},"debugger","+firefox\u002Fchrome\n",[6013,17359,17360],{},[6016,17361,17362],{},"pry-byebug",[6016,17364,17365],{},"rspec\u002Fcapybara",[6016,17367,17368],{},[6002,17369,17370],{},"diff -u",[6016,17372,17373,17376,17377],{},[6002,17374,17375],{},"bundle open \u003Clib>"," \u002F ",[6002,17378,17379],{},"gem open \u003Clib>",[6016,17381,17382,17383],{},"Crazy power tools\n",[6013,17384,17385,17388,17391,17394,17397],{},[6016,17386,17387],{},"git bisect",[6016,17389,17390],{},"rspec bisect",[6016,17392,17393],{},"ruby -rtracer hiya.rb",[6016,17395,17396],{},"strace \u002F dtrace",[6016,17398,17399],{},"wireshark\u002FProxy? xxd? decompiler?",{"title":45,"searchDepth":15,"depth":15,"links":17401},[],"2020-05-20T14:53-04:00",{},{"title":1067,"description":16764},"Debugging Techniques",[6002],"2020-05-21T10:08-04:00","CBUinuKlkszChf8qcOg2R1vUVYIvjliOizWJWr_QhKA",{"id":17410,"title":4346,"body":17411,"createdAt":17497,"description":17498,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":17499,"navigation":5976,"path":4345,"seo":17500,"stem":17501,"tags":17502,"updatedAt":17503,"__hash__":17504},"content\u002FTLT - 2020.04.26 - What Even Is Firebase.md",{"type":5822,"value":17412,"toc":17495},[17413,17427,17440,17447,17450,17465,17472,17475,17478],[5825,17414,17415,17416,17421,17422,17426],{},"We're using ",[5950,17417,17420],{"href":17418,"rel":17419},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FFirebase",[5954],"Firebase"," as the hosting service for ",[5950,17423,17424],{"href":17424,"rel":17425},"https:\u002F\u002Fcovidcanidoit.com",[5954]," and the experience has been kinda weird, coming from a more traditional server-database world.",[5825,17428,17429,17430,17433,17434,17439],{},"First, I didn't even realize that Firebase was more than a cloud-JSON-blob! Our initial use of it was only for static asset hosting. This is a ",[5950,17431,15906],{"href":15904,"rel":17432},[5954]," application that so far mostly lives in the browser, so static hosting is perfect. I generally use ",[5950,17435,17438],{"href":17436,"rel":17437},"https:\u002F\u002Fpages.github.com\u002F",[5954],"Github Pages"," for this purpose, but another team member had already set up Firebase for us.",[5825,17441,17442,17443,17446],{},"Once I learned that it was even a thing, all was good. I wrapped the CLI that Firebase provides into yarn land, and now you can do ",[6002,17444,17445],{},"yarn deploy"," and it'll build up the local assets and push them up. Works quite well! The auth is stored somewhere else on my computer. If a new dev wants to deploy, you add their google account to the Firebase project and presto!",[5825,17448,17449],{},"We now have 3 devs on this project, and I'm starting to wonder about staging environments and such. As far as I can tell this isn't a thing in The Cloud, and instead we need to set up a separate project. I guess I'll do that eventually?",[5825,17451,17452,17453,17458,17459,17464],{},"Our first user-serviceable data store was the almighty Google Sheets. You might not know this, but you can craft a URL to a public sheet and get down a very lovely CSV. When our app \"boots\" in the browser, we pull down this csv, ",[5950,17454,17457],{"href":17455,"rel":17456},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fcsv-parse",[5954],"parse it",", turn it into a nice JSON tree that we stick into ",[5950,17460,17463],{"href":17461,"rel":17462},"https:\u002F\u002Fvuex.vuejs.org\u002F",[5954],"Vuex",". If you edit the Google Sheet, the next app reload gets the new data. This is a disturbingly effective way to prototype. I grabbed a markdown rendering Vue component and ... now we have a SheetyCMS(tm) (haha).",[5825,17466,17467,17468,17471],{},"As we look to expand the type of data we are storing and who can edit the data, I decided that we should switch over to the only thing I thought Firebase did in the first place, a hosted and magically live JSON \"database\". This is called the \"Real Time Database\", and for good reason -- all of the client libs know how to watch this thing for changes. In the VueJS one-way world, it goes Firebase -> Vuex -> component -> ",[5853,17469,17470],{},"edit-event"," -> Firebase, and then wraps back around.",[5825,17473,17474],{},"I built this admin tool to edit content, and now when you change the description text of something it updates every browser viewing it ... LIVE. Like, even as you type things. We went from having to do a lot of work to make things that live to now maybe having to create a \"commit\" button so that people can't see you typing and re-typing your text.",[5825,17476,17477],{},"Things to discuss further:",[6013,17479,17480,17483,17486,17489,17492],{},[6016,17481,17482],{},"Firebase Rules",[6016,17484,17485],{},"Staging environments vs staging data",[6016,17487,17488],{},"I wonder how much this is going to cost?",[6016,17490,17491],{},"Firebase data migrations",[6016,17493,17494],{},"Tracing the round trip of a text update",{"title":45,"searchDepth":15,"depth":15,"links":17496},[],"2020-04-27T00:15-04:00","We're using Firebase as the hosting service for https:\u002F\u002Fcovidcanidoit.com and the experience has been kinda weird, coming from a more traditional server-database world.",{},{"title":4346,"description":17498},"TLT - 2020.04.26 - What Even Is Firebase",[5980],"2020-04-27T00:18-04:00","fjSN_pyavvpa4NJEjaLjPbpdSwYaQfVPdnoUY3AISAM",{"id":17506,"title":4968,"body":17507,"createdAt":17654,"description":15131,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":17655,"navigation":5976,"path":4967,"seo":17656,"stem":15131,"tags":17657,"updatedAt":17658,"__hash__":17659},"content\u002FTalking DC Vote Blues.md",{"type":5822,"value":17508,"toc":17652},[17509,17511,17514,17526,17532,17535,17541,17553,17574,17589,17604,17616,17628,17640],[5825,17510,15131],{},[5825,17512,17513],{},"(I'm still working on the music, but it will be a talking-blues pattern for most of it).",[5825,17515,17516,17517,17519,17520,17522,17523,17525],{},"Today I saw an analysis of historical Presidential Elections and how close they",[6297,17518],{},"\nwere. They did a mathematical analysis to determine the smallest number of",[6297,17521],{},"\nvotes it would take to change the outcome of an election. This depends on the",[6297,17524],{},"\npopular vote within a state, and the electoral vote between states.",[5825,17527,17528],{},[5950,17529,17530],{"href":17530,"rel":17531},"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20080923000039\u002Fhttps:\u002F\u002Fwww.msu.edu\u002F~sheppa28\u002Felections.html",[5954],[5825,17533,17534],{},"How about some illustrations?",[5825,17536,17537,17538,17540],{},"Well the 2000 election had the smallest number of votes determine the swing...",[6297,17539],{},"\nall in florida of course, 269 votes would have changed the outcome.",[5825,17542,17543,17544,17546,17547,17549,17550,17552],{},"In contrast, to change the results of the 1972 Nixon-McGovern election you'd",[6297,17545],{},"\nchange votes in 26 states starting with Alaska and working your way down the",[6297,17548],{},"\nlist. You'd have to change over 3 million votes to do it the most efficient way",[6297,17551],{},"\npossible.",[5825,17554,17555,17556,17558,17559,17561,17562,17564,17565,17567,17568,17570,17571,17573],{},"So I'm looking at this site, which contains all sorts of information about",[6297,17557],{},"\nwhich states influenced which elections and so on... and I start looking for",[6297,17560],{},"\nDC. 'Cause I live and I vote in DC. But it's not in there. I shoot off an email",[6297,17563],{},"\nto the author of the site, and he replies, says that the site only includes",[6297,17566],{},"\ninformation on states that could have changed the election. Well I wrote back",[6297,17569],{},"\nand pointed out that every single other state was in there... and that zero",[6297,17572],{},"\npercent is still a number!",[5825,17575,17576,17577,17579,17580,17582,17583,17585,17586,17588],{},"Well he must've seen the light because he put DC on there. Wayyyy down at the",[6297,17578],{},"\nbottom you can see it. 11 elections and zero influence. See the people in DC",[6297,17581],{},"\nare a stubborn lot, and by the time you changed enough votes here to actually",[6297,17584],{},"\nchange the overall DC vote... well you'd have already changed a whole lot of",[6297,17587],{},"\nother states. It's not worth the effort to mess with DC's votes at all.",[5825,17590,17591,17592,17594,17595,17597,17598,17600,17601,17603],{},"So. In a time where people feel like their vote doesn't count. In a time where",[6297,17593],{},"\nvoting fraud has become a mere matter of software update... and where our",[6297,17596],{},"\nleaders seem as disconnected as ever from the will of the people.... at this",[6297,17599],{},"\ntime when I really really want my vote to count... this is when I realize that",[6297,17602],{},"\nmy individual vote means less than anybody else's!",[5825,17605,17606,17607,17609,17610,17612,17613,17615],{},"Taxation without representation",[6297,17608],{},"\nBut you ain't seen nothin yet",[6297,17611],{},"\n'cause way over in the District",[6297,17614],{},"\nMy vote's already set",[5825,17617,17618,17619,17621,17622,17624,17625,17627],{},"Why can't we be a swing state?",[6297,17620],{},"\nI just want to be heard,",[6297,17623],{},"\nit's getting just a little old,",[6297,17626],{},"\nto show the whitehouse the bird",[5825,17629,17630,17631,17633,17634,17636,17637,17639],{},"It's not that I disagree,",[6297,17632],{},"\nIt's satisfaction that I seek,",[6297,17635],{},"\nThe chance to make a difference,",[6297,17638],{},"\nI want the chance to speak,",[5825,17641,17642,17643,17645,17646,17648,17649,17651],{},"So I've got a tricky plan",[6297,17644],{},"\nto get us into play,",[6297,17647],{},"\na little less than half of you",[6297,17650],{},"\njust vote some other way",{"title":45,"searchDepth":15,"depth":15,"links":17653},[],"2008-10-06T17:45-04:00",{},{"title":4968,"description":15131},[6271],"2020-03-03T16:45-05:00","4RnvDjiC-Gxne5Tez-qh3QDYon8wkm1H8gWICkF-gKQ",{"id":17661,"title":5501,"body":17662,"createdAt":17804,"description":17666,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":17805,"navigation":5976,"path":5500,"seo":17806,"stem":17807,"tags":17808,"updatedAt":17809,"__hash__":17810},"content\u002FVueJS Notes.md",{"type":5822,"value":17663,"toc":17802},[17664,17667],[5825,17665,17666],{},"A brain-dump of some things I ran into while learning VueJS and related technology (Vuex).",[6013,17668,17669,17719],{},[6016,17670,17671,17672],{},"Vuex\n",[6013,17673,17674,17677,17680,17688,17691,17694,17697,17708,17710,17713,17716],{},[6016,17675,17676],{},"Makes me think of Software Transactional Memory",[6016,17678,17679],{},"Mutations are synchronous",[6016,17681,17682,17683],{},"Since JS is single-threaded, that means they are atomic\n",[6013,17684,17685],{},[6016,17686,17687],{},"Even if they modify the state LOTS",[6016,17689,17690],{},"Actions are a transaction that get committed",[6016,17692,17693],{},"Actions are built out of multiple mutations",[6016,17695,17696],{},"Actions can be async",[6016,17698,17699,17700],{},"At the end of an Action the state must be committed\n",[6013,17701,17702,17705],{},[6016,17703,17704],{},"Where is the intermediate state stored?",[6016,17706,17707],{},"How are conflicts resolved?",[6016,17709,5733],{},[6016,17711,17712],{},"Based on experimentation, there is NO implicit transaction for an Action",[6016,17714,17715],{},"In an action, each Mutation is executed immediately",[6016,17717,17718],{},"I guess you could build something to make an Action have local-state transaction",[6016,17720,17721,17722],{},"Sugar\n",[6013,17723,17724,17727,17730,17747,17767,17770],{},[6016,17725,17726],{},"One of the ways I like to learn and think about things is \"what part of this is sugar?\"",[6016,17728,17729],{},"Attributes in components can use (mis-use?) xml namespaces to indicate the usage of the attribute",[6016,17731,17732,17735],{},[6002,17733,17734],{},"v-bind:value=\"foo\"",[6013,17736,17737],{},[6016,17738,17739,17740,17743,17744],{},"SUGAR: Drop the ",[6002,17741,17742],{},"v-bind"," and you end up with ",[6002,17745,17746],{},":value=\"foo\"",[6016,17748,17749,17752],{},[6002,17750,17751],{},"v-on:click=\"doStuff\"",[6013,17753,17754],{},[6016,17755,17756,17757,10533,17760,17763,17764],{},"SUGAR: Replace ",[6002,17758,17759],{},"v-on:",[6002,17761,17762],{},"@"," and end up with ",[6002,17765,17766],{},"@click=\"doStuff\"",[6016,17768,17769],{},"Not Vue specific, but there are many oft-used JS sugar things",[6016,17771,17772,17773],{},"My favorite is implicit-object (aka hash) key\n",[6013,17774,17775,17786,17789,17794,17797],{},[6016,17776,17777,17778,17781,17782,17785],{},"Take ",[6002,17779,17780],{},"{ \"Person\": Person }",", where ",[6002,17783,17784],{},"Person"," is a scoped variable",[6016,17787,17788],{},"First, it is well-known that you can drop the quotes",[6016,17790,17791],{},[6002,17792,17793],{},"{ Person: Person }",[6016,17795,17796],{},"With new JS you can also collapse this down further, since the key and the value-name match",[6016,17798,17799],{},[6002,17800,17801],{},"{ Person }",{"title":45,"searchDepth":15,"depth":15,"links":17803},[],"2020-02-16T17:06-05:00",{},{"title":5501,"description":17666},"VueJS Notes",[],"2020-02-16T17:12-05:00","ZvUhTVAMt4K2iaJJpHgJWUw5Ue-buz1QJQjmqOp_c_o",{"id":17812,"title":4341,"body":17813,"createdAt":17850,"description":17817,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":17851,"navigation":5976,"path":4340,"seo":17852,"stem":17853,"tags":17854,"updatedAt":17850,"__hash__":17855},"content\u002FTLT - 2020.01.20 - Link Roundup.md",{"type":5822,"value":17814,"toc":17848},[17815,17818],[5825,17816,17817],{},"Cool things I saw on the internet at some point:",[6013,17819,17820,17827,17834,17841],{},[6016,17821,17822],{},[5950,17823,17826],{"href":17824,"rel":17825},"https:\u002F\u002Fdevelopers.google.com\u002Fweb\u002Ffundamentals\u002Fperformance\u002Frail",[5954],"Google model for (web) performance measurement, RAIL",[6016,17828,17829],{},[5950,17830,17833],{"href":17831,"rel":17832},"https:\u002F\u002Fquartzy.qz.com\u002F1332213\u002Fmillennial-reading-habits-have-changed-the-definition-of-a-classic\u002F",[5954],"Millennial Reading Habits",[6016,17835,17836],{},[5950,17837,17840],{"href":17838,"rel":17839},"https:\u002F\u002Ffo.am\u002Factivities\u002Fmidimutant\u002F",[5954],"midimutant, a neat use of Genetic Algorithm to train a synthesizer",[6016,17842,17843],{},[5950,17844,17847],{"href":17845,"rel":17846},"https:\u002F\u002Fwww.johannes-bauer.com\u002Fcompsci\u002Fecc\u002F",[5954],"Crash course on Elliptic Curve Cryptography",{"title":45,"searchDepth":15,"depth":15,"links":17849},[],"2020-01-20T14:30-05:00",{},{"title":4341,"description":17817},"TLT - 2020.01.20 - Link Roundup",[5980,8193],"bcL8OLbmnzknP9PvPfJc5Fr_ewo29IraAPkvj2DDuwQ",{"id":17857,"title":4336,"body":17858,"createdAt":17934,"description":17935,"draft":5972,"extension":5973,"image":17936,"mastodonThread":5974,"meta":17937,"navigation":5976,"path":4335,"seo":17938,"stem":15889,"tags":17939,"updatedAt":17940,"__hash__":17941},"content\u002FTLT - 2020.01.19 - Mobile WebAudio Synth.md",{"type":5822,"value":17859,"toc":17932},[17860,17870,17902,17915,17918],[5825,17861,17862,17865,17866,17869],{},[6416,17863],{"src":17864,"align":7264},"\u002Fimg\u002FPO33.jpg"," I got a ",[5950,17867,17868],{"href":2681},"Pocket Operator PO-33"," a while back, and find it super fun -- it is minimalist and usable. It inspires me to play around with beats and tunes ... and it also inspires me to work on my own samplers, sequencers, and synths.",[5825,17871,17872,17873,17878,17879,17883,17884,17889,17890,17895,17896,17901],{},"Let's see what we can do with ",[5950,17874,17877],{"href":17875,"rel":17876},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FWeb_Audio_API",[5954],"Web Audio"," these days! Starting with a basic ",[5950,17880,17882],{"href":15904,"rel":17881},[5954],"VueJS app",", I googled lots of stuff. Somewhat randomly, I wanted a ",[5950,17885,17888],{"href":17886,"rel":17887},"https:\u002F\u002Fen.m.wikipedia.org\u002Fwiki\u002FWicki-Hayden_note_layout",[5954],"Wicki-Hayden hexagon style keyboard",", so had to find some ",[5950,17891,17894],{"href":17892,"rel":17893},"https:\u002F\u002Fwww.codesmite.com\u002Farticle\u002Fhow-to-create-pure-css-hexagonal-grids",[5954],"CSS that makes hex-buttons",". I'll probably switch to this ",[5950,17897,17900],{"href":17898,"rel":17899},"https:\u002F\u002Fvmcreative.github.io\u002FHexi-Flexi-Grid\u002F",[5954],"Hexi-Flexi-Grid"," at some point, to make dynamically sized hexagons easier, but these work.",[5825,17903,17904,17908,17909,17914],{},[6416,17905],{"src":17906,"align":17907},"\u002Fimg\u002Fsample_mob_screenshot1.png","left"," Combine that with a ",[5950,17910,17913],{"href":17911,"rel":17912},"https:\u002F\u002Fodino.org\u002Femit-a-beeping-sound-with-javascript\u002F",[5954],"simple synth",", and now we have a playable thing. I had to make some tweaks to get it to work tolerably on my phone -- fix the layout size, use touch events. Unfortunately it isn't very usable at this point due to a sizeable delay between pushing a button and the sound. I'm going to write a pure-JS snippet to eliminate any overhead from VueJS, and if that is also slow then I'm not sure what I'll do. It's kinda cool that I can use Web Audio ... and I'd sure like to keep using it. We'll see!",[5825,17916,17917],{},"Other ideas ... so many. I want to give it access to your microphone so you can record a live sample. The PO-33 then lets you pitch the sample (by speeding it up and slowing it down) and maps it to the keys. I'd like to do that, as well as try a pitch change while keeping the duration. Probably after that is doing some sequencing and\u002For looping. The PO-33 also has one-shot mode for drums, so might do that. So many things!",[5825,17919,17920,17921,17926,17927,7203],{},"Check out the ",[5950,17922,17925],{"href":17923,"rel":17924},"https:\u002F\u002Fawwaiid.github.io\u002Fsample-mob-web\u002F",[5954],"Demo Build"," and the ",[5950,17928,17931],{"href":17929,"rel":17930},"https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fsample-mob",[5954],"Github Repo",{"title":45,"searchDepth":15,"depth":15,"links":17933},[],"2020-01-20T14:06-05:00"," I got a Pocket Operator PO-33 a while back, and find it super fun -- it is minimalist and usable. It inspires me to play around with beats and tunes ... and it also inspires me to work on my own samplers, sequencers, and synths.","img\u002Fsample_mob_screenshot1.png",{},{"title":4336,"description":17935},[5980],"2020-01-20T14:14-05:00","J3UaREITUO_K9k7OYM5mmnaxdc6hN9648vuXblLyDj0",{"id":17943,"title":1976,"body":17944,"createdAt":17972,"description":17973,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":17974,"navigation":5976,"path":1975,"seo":17975,"stem":15065,"tags":17976,"updatedAt":17972,"__hash__":17977},"content\u002FLivingroom Adventures.md",{"type":5822,"value":17945,"toc":17970},[17946,17951,17958],[5825,17947,17948,17949,8003],{},"I made this by sampling some random Jazz, looping it, and layering in some drums and effects -- all using my fun ",[5950,17950,17868],{"href":2681},[5825,17952,17953,17954,6241,17956,6259],{},"Listen: ",[6237,17955],{"controls":5976,"preload":6239,"src":15070},[5950,17957,6245],{"download":15073,"external":45,"href":15070},[5825,17959,17960,17961,17963,17964,17969],{},"Artist: Brock Wilcox",[6297,17962],{},"\nCopy and Share: under the terms of ",[5950,17965,17968],{"href":17966,"rel":17967},"http:\u002F\u002Fcreativecommons.org\u002Flicenses\u002Fby-nc\u002F3.0\u002F",[5954],"Creative Commons Attribution-NonCommercial"," license!",{"title":45,"searchDepth":15,"depth":15,"links":17971},[],"2019-09-22T20:51-04:00","I made this by sampling some random Jazz, looping it, and layering in some drums and effects -- all using my fun Pocket Operator PO-33!",{},{"title":1976,"description":17973},[6271],"c56atKzISY8_3WtEpp3Tof6xXkMwfQv2gpR6SPlbO90",{"id":17979,"title":2682,"body":17980,"createdAt":18367,"description":17984,"draft":5972,"extension":5973,"image":18368,"mastodonThread":5974,"meta":18369,"navigation":5976,"path":2681,"seo":18370,"stem":17868,"tags":18371,"updatedAt":18372,"__hash__":18373},"content\u002FPocket Operator PO-33.md",{"type":5822,"value":17981,"toc":18365},[17982,17985,17990,18006,18009,18019,18022,18043,18046,18133,18136],[5825,17983,17984],{},"The Pocket Operator PO-33 Knock-Out is a super fun sampler and step-sequencer made by Teenage Engineering! I got one in August 2019, and am using it to play around with sample-based music.",[5825,17986,17987,17988],{},"See also ",[5950,17989,14683],{"href":2158},[5825,17991,17992,17994,17995,17999,18000,18005],{},[6416,17993],{"src":17864,"align":7264}," In 2019 I got a ",[5950,17996,17868],{"href":17997,"rel":17998},"https:\u002F\u002Fteenage.engineering\u002Fproducts\u002Fpo\u002Fmetal#po-33",[5954],", part of the \"Metal\" series of devices from ",[5950,18001,18004],{"href":18002,"rel":18003},"https:\u002F\u002Fteenage.engineering\u002F",[5954],"Teenage Engineering",". This is a sampler and step-sequencer in a pocket-calculator-esq form factor. Very fun! These are some notes.",[5825,18007,18008],{},"Resources:",[6013,18010,18011],{},[6016,18012,18013,18018],{},[5950,18014,18017],{"href":18015,"rel":18016},"https:\u002F\u002Fwww.reddit.com\u002Fr\u002Fpocketoperators\u002F",[5954],"Reddit - r\u002Fpocketoperators"," - very active community",[5825,18020,18021],{},"Data",[6013,18023,18024,18032],{},[6016,18025,18026,18027],{},"Sound 1-8, \"Melodic\"\n",[6013,18028,18029],{},[6016,18030,18031],{},"Single sound per button",[6016,18033,18034,18035],{},"Sound 9-16, \"Drum\"\n",[6013,18036,18037,18040],{},[6016,18038,18039],{},"16 sound-slices per button",[6016,18041,18042],{},"Each slice is an independent thing",[5825,18044,18045],{},"Controls:",[6013,18047,18048,18051,18054,18057,18060,18063,18066,18069,18072,18075,18104],{},[6016,18049,18050],{},"\"sound\" button",[6016,18052,18053],{},"\"pattern\" button",[6016,18055,18056],{},"\"bpm\" button",[6016,18058,18059],{},"Rotator-A (left)",[6016,18061,18062],{},"Rotator-B (right)",[6016,18064,18065],{},"\"record\" button",[6016,18067,18068],{},"\"FX\" button",[6016,18070,18071],{},"\"play\" button",[6016,18073,18074],{},"\"write\" button",[6016,18076,18077,18078],{},"Melodic buttons\n",[6013,18079,18080,18083,18086,18089,18092,18095,18098,18101],{},[6016,18081,18082],{},"Button-1",[6016,18084,18085],{},"Button-2",[6016,18087,18088],{},"Button-3",[6016,18090,18091],{},"Button-4",[6016,18093,18094],{},"Button-5",[6016,18096,18097],{},"Button-6",[6016,18099,18100],{},"Button-7",[6016,18102,18103],{},"Button-8",[6016,18105,18106,18107],{},"Drum buttons\n",[6013,18108,18109,18112,18115,18118,18121,18124,18127,18130],{},[6016,18110,18111],{},"Button-9",[6016,18113,18114],{},"Button-10",[6016,18116,18117],{},"Button-11",[6016,18119,18120],{},"Button-12",[6016,18122,18123],{},"Button-13",[6016,18125,18126],{},"Button-14",[6016,18128,18129],{},"Button-15",[6016,18131,18132],{},"Button-16",[5825,18134,18135],{},"Map of modes and inputs and displays:",[6013,18137,18138,18209,18225,18239,18284,18287,18300,18344,18355],{},[6016,18139,18140,18141],{},"Current selections\n",[6013,18142,18143,18151,18159],{},[6016,18144,18145,18146],{},"You currently have one sound selected\n",[6013,18147,18148],{},[6016,18149,18150],{},"Press \"sound\" -- assigned sounds are dim-lit, current sound is flashing bright-lit",[6016,18152,18153,18154],{},"You currently have one active pattern, though you may be in part of a pattern-chain\n",[6013,18155,18156],{},[6016,18157,18158],{},"Press \"pattern\" -- assigned patterns are dim-lit, patterns in the current pattern-chain are bright-lit, current pattern is flashing bright-lit",[6016,18160,18161,18162],{},"You currently have one FX selected\n",[6013,18163,18164,18178,18195],{},[6016,18165,18166,18167],{},"\"FLT\" - Filter\n",[6013,18168,18169,18172,18175],{},[6016,18170,18171],{},"Displays \"?\" on the screen below feedback area (upper-right)",[6016,18173,18174],{},"Rotator A (left) LPF, noF, HPF",[6016,18176,18177],{},"Rotator B (right) Res (Resonance)",[6016,18179,18180,18181],{},"\"tri\" - Trim\n",[6013,18182,18183,18186,18189,18192],{},[6016,18184,18185],{},"No trim-mode indicator",[6016,18187,18188],{},"Display at bottom of screen indicates start\u002Flength of slice",[6016,18190,18191],{},"Rotator A (left) - slice start offset",[6016,18193,18194],{},"Rotator B (right) - slice length",[6016,18196,18197,18198],{},"\"ton\" - Tone\n",[6013,18199,18200,18203,18206],{},[6016,18201,18202],{},"Displays \"!\" in a quote-bubble below feedback area (upper-right) when in tone-mode",[6016,18204,18205],{},"Rotator A (left) - Display \"Ptc\", indicates slow-down or speed-up of sample, amount indicated on bottom scale",[6016,18207,18208],{},"Rotator B (right) - Display \"UoL\" for \"volume\", indicates volume level of sample, amount indicated on bottom scale",[6016,18210,18211,18212],{},"Perform mode \"PrF\" (default)\n",[6013,18213,18214],{},[6016,18215,18216,18217],{},"Button-1 through Button-16 -- Trigger sound\n",[6013,18218,18219,18222],{},[6016,18220,18221],{},"If current sound is melodic, pitch will change based on which button you press",[6016,18223,18224],{},"If current sound is drum, each button 1-16 will trigger one of the drum slices",[6016,18226,18227,18228],{},"Edit mode (press\u002Frelease \"write\", record-icon displayed when in edit mode)\n",[6013,18229,18230,18233,18236],{},[6016,18231,18232],{},"Buttons will be dim-lit on each of the 16 steps that are assigned for the current sound",[6016,18234,18235],{},"Buttons will be bright-lit on each of the 16 steps with the current sound-tone or sound-slice",[6016,18237,18238],{},"Long-press a dim-lit button to switch the current slice to that button",[6016,18240,18241,18242],{},"Play Mode\n",[6013,18243,18244,18247,18250,18253,18256,18259,18267,18270],{},[6016,18245,18246],{},"Press the \"play\" button to start\u002Fstop play-mode",[6016,18248,18249],{},"Play (right-triangle) indicator appears on the screen to the left of the clock",[6016,18251,18252],{},"During play-mode the 1-16 buttons will bright-lit on each step",[6016,18254,18255],{},"Each step also flashes the play-button on the beat",[6016,18257,18258],{},"The entire pattern-chain will play",[6016,18260,18261,18262],{},"The current pattern number is displayed, like \"P-1\" through \"P-16\"\n",[6013,18263,18264],{},[6016,18265,18266],{},"During chains it will change from one pattern to the next as it plays",[6016,18268,18269],{},"Write+(1..16) - add the current sound (melodic note or drum-trigger) at the current step",[6016,18271,18272,18273],{},"Hold down \"FX\"\n",[6013,18274,18275,18278,18281],{},[6016,18276,18277],{},"Current step switches from bright-lit to dim-lit",[6016,18279,18280],{},"Current effect (1-16) is bright-lit",[6016,18282,18283],{},"No-effect (16) is bright-lit by default",[6016,18285,18286],{},"Play+Edit Mode",[6016,18288,18289,18290],{},"Play+Perform Mode\n",[6013,18291,18292],{},[6016,18293,18294,18295],{},"Sound bright-lit blink when triggered\n",[6013,18296,18297],{},[6016,18298,18299],{},"If a drum is on button-10, then every time ANY drum on button-10 is triggered then button-10 will light up",[6016,18301,18302,18303],{},"Record Mode\n",[6013,18304,18305,18308,18311,18314,18317,18325,18333],{},[6016,18306,18307],{},"Hold down the \"record\" button",[6016,18309,18310],{},"Blinks \"rEc\"",[6016,18312,18313],{},"Displays monitor scale of volume level of input",[6016,18315,18316],{},"Additionally hold down 1-16 to record to a sound",[6016,18318,18319,18320],{},"If the target sound is a drum (9-16), at the end of the recording the sound will be sliced\n",[6013,18321,18322],{},[6016,18323,18324],{},"Slicing is done based on \"transients\", bits of silence",[6016,18326,18327,18328],{},"Record+Sound -> Delete current sound\n",[6013,18329,18330],{},[6016,18331,18332],{},"Displays \"dEL\" during deletion, which can take a second or two",[6016,18334,18335,18336],{},"Record+Pattern -> Clear the current pattern\n",[6013,18337,18338,18341],{},[6016,18339,18340],{},"Displays \"cLr\" during clearing, which can take a second or two",[6016,18342,18343],{},"Clears only the current pattern in the pattern chain, keeps the chain sequence",[6016,18345,18346,18347],{},"Backup Mode\n",[6013,18348,18349,18352],{},[6016,18350,18351],{},"Press write+sound+play",[6016,18353,18354],{},"Cancel by pressing any button",[6016,18356,18357,18358],{},"Restore Mode\n",[6013,18359,18360,18363],{},[6016,18361,18362],{},"Press write+sound+record",[6016,18364,18354],{},{"title":45,"searchDepth":15,"depth":15,"links":18366},[],"2019-08-25T16:14-04:00","img\u002FPO33.jpg",{},{"title":2682,"description":17984},[],"2019-08-25T22:03-04:00","VxFIZC7iHycFXT9LXNAUKnlkW44mBDA7InfHThLLr4I",{"id":18375,"title":4331,"body":18376,"createdAt":18428,"description":18380,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":18429,"navigation":5976,"path":4330,"seo":18430,"stem":18431,"tags":18432,"updatedAt":18428,"__hash__":18433},"content\u002FTLT - 2019.03.03 - Learning Machine Learning.md",{"type":5822,"value":18377,"toc":18426},[18378,18381,18384,18390,18396,18408,18420],[5825,18379,18380],{},"I'm working on making the jump from READING about recent machine learning techniques to APPLYING recent machine learning techniques. I have some nice datasets at work, so I am doing a bit of double-dipping by playing with those.",[5825,18382,18383],{},"I previously struggled with getting started, getting bogged down in picking technologies and such. I'm specifically going after some Neural Network models, so also get overwhelmed with the Python ecosystem of tools and libraries. The best way to get started is to get started .. so I turned the corner with a little help.",[5825,18385,18386,18389],{},[7247,18387,18388],{},"Fluent Python (book):"," Great advanced-introduction to Python, letting me better understand\u002Frecognize meta-programming and DSLs. Things like the array-slice syntax turning into an object which can be passed to any class that implements the right methods.",[5825,18391,18392,18395],{},[7247,18393,18394],{},"Keras:"," I think this is the second-most popular python NN library, after Tensorflow itself, and it has Tensorflow as a backend. Seems nice and usable. Then I pull in whatever numpy stuff as needed.",[5825,18397,18398,18401,18402,18407],{},[7247,18399,18400],{},"Convolutional Neural Networks:"," I knew about image and audio convolution filters, so had to spend some effort in transferring that knowledge into how convolutional layers work in a CNN. I read a bunch of articles like ",[5950,18403,18406],{"href":18404,"rel":18405},"https:\u002F\u002Fwww.kaggle.com\u002Famarjeet007\u002Fvisualize-cnn-with-keras",[5954],"Visualize CNN With Keras"," to get my mind around this.",[5825,18409,18410,18413,18414,18419],{},[7247,18411,18412],{},"Dog vs Cat with Augmentation:"," I had been through random tutorials before, but this time I went through ",[5950,18415,18418],{"href":18416,"rel":18417},"https:\u002F\u002Fblog.keras.io\u002Fbuilding-powerful-image-classification-models-using-very-little-data.html",[5954],"Building Powerful Image Classification Models Using Very Little Data"," in detail, step by step, and made sure that I roughly understood each step. To help, I switched from Dog and Cat images into my own dataset -- so I had to go through the usual data cleaning process in addition to the learning.",[5825,18421,18422,18425],{},[7247,18423,18424],{},"Living Code:"," Meanwhile I've also been sharing my excitement with friends and coworkers, and started a new Machine Learning club at work. We're taking even the simple examples and building them into services that our live systems can use - code that isn't running is dead code, and dead code is soon abandoned code. A big part of this learning is getting LIVING examples, and the double-dipping of making something useful for work is a great way to get that.",{"title":45,"searchDepth":15,"depth":15,"links":18427},[],"2019-03-03T13:56-05:00",{},{"title":4331,"description":18380},"TLT - 2019.03.03 - Learning Machine Learning",[5980],"WuuQaM8DASpfG-RTYkFXqyaH4Yf5PJ5dYU-lXsF4i6o",{"id":18435,"title":1499,"body":18436,"createdAt":18462,"description":1501,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":18463,"navigation":5976,"path":1498,"seo":18464,"stem":6690,"tags":18465,"updatedAt":18466,"__hash__":18467},"content\u002FGraph Module.md",{"type":5822,"value":18437,"toc":18460},[18438,18451,18454],[5825,18439,18440,18441,18445,18446,18450],{},"The graph module uses GraphViz to draw graphs. Here are some examples I've put together, but much fancier things are possible. See ",[5950,18442,18443],{"href":18443,"rel":18444},"http:\u002F\u002Fwww.research.att.com\u002Fsw\u002Ftools\u002Fgraphviz\u002Frefs.html",[5954]," for GraphViz documentation, and see ",[5950,18447,18448],{"href":18448,"rel":18449},"http:\u002F\u002Fwww.research.att.com\u002Fsw\u002Ftools\u002Fgraphviz\u002Fexamples\u002F",[5954]," for some examples.",[6416,18452],{"src":18453},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FIybCBqeio51mLwZcAahCoqx9BBBr2UBAoqz9LOZcAiv8B4YrJSglu8hbKb18LD2rKqW24SbSjG00",[6971,18455,18458],{"className":18456,"code":18457,"language":6976},[6974],"\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",[6002,18459,18457],{"__ignoreMap":45},{"title":45,"searchDepth":15,"depth":15,"links":18461},[],"2004-05-13T10:51-04:00",{},{"title":1499,"description":1501},[6510],"2018-12-15T12:29-05:00","kLvnRZi29CdWaD9pWsxMhh3nNRXoLhrTNklvFp_MXCQ",{"id":18469,"title":4326,"body":18470,"createdAt":18729,"description":18474,"draft":5972,"extension":5973,"image":18730,"mastodonThread":5974,"meta":18731,"navigation":5976,"path":4325,"seo":18732,"stem":18733,"tags":18734,"updatedAt":18735,"__hash__":18736},"content\u002FTLT - 2018.12.08 - Transition.md",{"type":5822,"value":18471,"toc":18727},[18472,18475,18478,18717,18724],[5825,18473,18474],{},"Generative artwork, floating and fading.",[6416,18476],{"src":18477},"\u002Fimg\u002Ftransition.jpg",[6971,18479,18483],{"className":18480,"code":18481,"language":18482,"meta":45,"style":45},"language-js shiki shiki-themes github-light github-dark monokai","let gray = amt => color(amt, amt, amt);\n\nfunction setup() {\n  randomSeed(7);\n  createCanvas(600, 600);\n\n  for (let i = 0; i \u003C 200; i++) {\n    x1 = randomGaussian(300, 120);\n    y1 = randomGaussian(300, 50);\n    y2 = randomGaussian(300, 50);\n    fill(gray(x1 \u002F 600 * 255));\n    line(x1, y1, x1, y2);\n    ellipse(x1, y1, 20, 20);\n    ellipse(x1, y2, 20, 20);\n  }\n}\n","js",[6002,18484,18485,18507,18511,18520,18533,18549,18553,18581,18603,18623,18642,18669,18677,18694,18709,18713],{"__ignoreMap":45},[5853,18486,18487,18489,18492,18495,18498,18501,18504],{"class":7026,"line":9},[5853,18488,16018],{"class":9595},[5853,18490,18491],{"class":8564}," gray",[5853,18493,18494],{"class":7029}," =",[5853,18496,18497],{"class":16591}," amt",[5853,18499,18500],{"class":9595}," =>",[5853,18502,18503],{"class":8564}," color",[5853,18505,18506],{"class":7033},"(amt, amt, amt);\n",[5853,18508,18509],{"class":7026,"line":15},[5853,18510,7045],{"emptyLinePlaceholder":5976},[5853,18512,18513,18515,18518],{"class":7026,"line":56},[5853,18514,16583],{"class":9595},[5853,18516,18517],{"class":8564}," setup",[5853,18519,15583],{"class":7033},[5853,18521,18522,18525,18527,18530],{"class":7026,"line":5212},[5853,18523,18524],{"class":8564},"  randomSeed",[5853,18526,12273],{"class":7033},[5853,18528,18529],{"class":7073},"7",[5853,18531,18532],{"class":7033},");\n",[5853,18534,18535,18538,18540,18543,18545,18547],{"class":7026,"line":7077},[5853,18536,18537],{"class":8564},"  createCanvas",[5853,18539,12273],{"class":7033},[5853,18541,18542],{"class":7073},"600",[5853,18544,9528],{"class":7033},[5853,18546,18542],{"class":7073},[5853,18548,18532],{"class":7033},[5853,18550,18551],{"class":7026,"line":7083},[5853,18552,7045],{"emptyLinePlaceholder":5976},[5853,18554,18555,18557,18559,18561,18563,18565,18567,18569,18571,18574,18577,18579],{"class":7026,"line":7094},[5853,18556,13031],{"class":7029},[5853,18558,6241],{"class":7033},[5853,18560,16018],{"class":9595},[5853,18562,12930],{"class":7033},[5853,18564,7053],{"class":7029},[5853,18566,15599],{"class":7073},[5853,18568,15602],{"class":7033},[5853,18570,15605],{"class":7029},[5853,18572,18573],{"class":7073}," 200",[5853,18575,18576],{"class":7033},"; i",[5853,18578,15617],{"class":7029},[5853,18580,15665],{"class":7033},[5853,18582,18583,18586,18588,18591,18593,18596,18598,18601],{"class":7026,"line":7100},[5853,18584,18585],{"class":7033},"    x1 ",[5853,18587,7053],{"class":7029},[5853,18589,18590],{"class":8564}," randomGaussian",[5853,18592,12273],{"class":7033},[5853,18594,18595],{"class":7073},"300",[5853,18597,9528],{"class":7033},[5853,18599,18600],{"class":7073},"120",[5853,18602,18532],{"class":7033},[5853,18604,18605,18608,18610,18612,18614,18616,18618,18621],{"class":7026,"line":7110},[5853,18606,18607],{"class":7033},"    y1 ",[5853,18609,7053],{"class":7029},[5853,18611,18590],{"class":8564},[5853,18613,12273],{"class":7033},[5853,18615,18595],{"class":7073},[5853,18617,9528],{"class":7033},[5853,18619,18620],{"class":7073},"50",[5853,18622,18532],{"class":7033},[5853,18624,18625,18628,18630,18632,18634,18636,18638,18640],{"class":7026,"line":7118},[5853,18626,18627],{"class":7033},"    y2 ",[5853,18629,7053],{"class":7029},[5853,18631,18590],{"class":8564},[5853,18633,12273],{"class":7033},[5853,18635,18595],{"class":7073},[5853,18637,9528],{"class":7033},[5853,18639,18620],{"class":7073},[5853,18641,18532],{"class":7033},[5853,18643,18644,18647,18649,18652,18655,18657,18660,18663,18666],{"class":7026,"line":8481},[5853,18645,18646],{"class":8564},"    fill",[5853,18648,12273],{"class":7033},[5853,18650,18651],{"class":8564},"gray",[5853,18653,18654],{"class":7033},"(x1 ",[5853,18656,17345],{"class":7029},[5853,18658,18659],{"class":7073}," 600",[5853,18661,18662],{"class":7029}," *",[5853,18664,18665],{"class":7073}," 255",[5853,18667,18668],{"class":7033},"));\n",[5853,18670,18671,18674],{"class":7026,"line":8495},[5853,18672,18673],{"class":8564},"    line",[5853,18675,18676],{"class":7033},"(x1, y1, x1, y2);\n",[5853,18678,18679,18682,18685,18688,18690,18692],{"class":7026,"line":13169},[5853,18680,18681],{"class":8564},"    ellipse",[5853,18683,18684],{"class":7033},"(x1, y1, ",[5853,18686,18687],{"class":7073},"20",[5853,18689,9528],{"class":7033},[5853,18691,18687],{"class":7073},[5853,18693,18532],{"class":7033},[5853,18695,18696,18698,18701,18703,18705,18707],{"class":7026,"line":14318},[5853,18697,18681],{"class":8564},[5853,18699,18700],{"class":7033},"(x1, y2, ",[5853,18702,18687],{"class":7073},[5853,18704,9528],{"class":7033},[5853,18706,18687],{"class":7073},[5853,18708,18532],{"class":7033},[5853,18710,18711],{"class":7026,"line":14336},[5853,18712,15755],{"class":7033},[5853,18714,18715],{"class":7026,"line":14361},[5853,18716,9316],{"class":7033},[5825,18718,18719,18720,6259],{},"(View full source at ",[5950,18721,18722],{"href":18722,"rel":18723},"https:\u002F\u002Frepl.it\u002F@BrockWilcox\u002FTransition",[5954],[7147,18725,18726],{},"html pre.shiki code .sq6CD, html code.shiki .sq6CD{--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sTHNf, html code.shiki .sTHNf{--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":45,"searchDepth":15,"depth":15,"links":18728},[],"2018-12-08T23:00-05:00","img\u002Ftransition.jpg",{},{"title":4326,"description":18474},"TLT - 2018.12.08 - Transition",[5980],"2018-12-08T23:24-05:00","4ggZ55V14_Y35hYWVjOJg5BrCmOHyQR9PKeH0dOzc2I",{"id":18738,"title":251,"body":18739,"createdAt":18824,"description":18743,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":18825,"navigation":5976,"path":250,"seo":18826,"stem":251,"tags":18827,"updatedAt":18824,"__hash__":18828},"content\u002FCDOLTM.md",{"type":5822,"value":18740,"toc":18822},[18741,18744,18750],[5825,18742,18743],{},"(Cats Dominate Our Lives Too Much)",[5825,18745,18746,6241,18748,6259],{},[6237,18747],{"controls":5976,"preload":6239,"src":14835},[5950,18749,6245],{"download":14838,"external":45,"href":14835},[5825,18751,18752,18753,18755,18756,18758,18759,18761,18762,18764,18765,18767,18768,18770,18771,18773,18774,18776,18777,18779,18780,18782,18783,18785,18786,18788,18789,18791,18792,18794,18795,18797,18798,18800,18801,18803,18804,18806,18807,18809,18810,18812,18813,18755,18815,18758,18817,18761,18819,18821],{},"Wake up",[6297,18754],{},"\nFeed me",[6297,18757],{},"\nDon't wait",[6297,18760],{},"\nI need",[6297,18763],{},"\nYou've got your own world",[6297,18766],{},"\nBut you brought me here",[6297,18769],{},"\nSuck it up you worthless whore",[6297,18772],{},"\nI feel like you",[6297,18775],{},"\nDon't care",[6297,18778],{},"\nBe kind",[6297,18781],{},"\nShut up",[6297,18784],{},"\nLeave me",[6297,18787],{},"\nI know that you think",[6297,18790],{},"\nI am here to entertain",[6297,18793],{},"\nMy attention is not free",[6297,18796],{},"\nSometimes you can be",[6297,18799],{},"\nSo vain",[6297,18802],{},"\nTease me",[6297,18805],{},"\nBe touched",[6297,18808],{},"\nGive me",[6297,18811],{},"\nWake up",[6297,18814],{},[6297,18816],{},[6297,18818],{},[6297,18820],{},"\nYou",{"title":45,"searchDepth":15,"depth":15,"links":18823},[],"2018-11-16T22:36-05:00",{},{"title":251,"description":18743},[6271],"QeJE1KDWedXvmUXnHdQB4jGoyo5Brd0zSW0d4cjHnxY",{"id":18830,"title":4321,"body":18831,"createdAt":18919,"description":18835,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":18920,"navigation":5976,"path":4320,"seo":18921,"stem":18922,"tags":18923,"updatedAt":18924,"__hash__":18925},"content\u002FTLT - 2018.11.12 - Destroy Things.md",{"type":5822,"value":18832,"toc":18917},[18833,18836,18839,18845,18848,18851,18857,18860,18866,18869,18875,18878,18884,18887,18893,18896,18902,18905,18911,18914],[5825,18834,18835],{},"I think it's important to learn through destruction. I like to probe the edges of things, and one of the best ways of knowing where IS the edge is to go over it. So ... let's go over the edge.",[5825,18837,18838],{},"First we need a nice fresh ubuntu:",[6971,18840,18843],{"className":18841,"code":18842,"language":6976},[6974],"awwaiid@zokei:~$ docker run -it ubuntu bash\nroot@1cf14a7465fd:\u002F#\n",[6002,18844,18842],{"__ignoreMap":45},[5825,18846,18847],{},"Now, this isn't a completely isolated machine or anything, but it'll do. Keep in mind that this is running as root on your machine (if you're running a Linux host at least, this is probably safer on osx), so you should be a little afraid. Fear will keep you on your toes!",[5825,18849,18850],{},"Let's cause a little destruction! Make sure you are INSIDE of this new ubuntu container, and then:",[6971,18852,18855],{"className":18853,"code":18854,"language":6976},[6974],"root@1cf14a7465fd:\u002F# rm -rf \u002F\n",[6002,18856,18854],{"__ignoreMap":45},[5825,18858,18859],{},"They always joke that you shouldn't do that. Turns out our lovely ubuntu is trying to help us not hurt ourselves, so we have to pass a special flag:",[6971,18861,18864],{"className":18862,"code":18863,"language":6976},[6974],"root@1cf14a7465fd:\u002F# rm -rf --no-preserve-root \u002F\n",[6002,18865,18863],{"__ignoreMap":45},[5825,18867,18868],{},"WHOA! Whole lot of errors. Many of them are very good things about how you can't remove stuff in \u002Fsys\u002Fdevices because of it being a read-only filesystem (remember that running as root bit?). And now the fun begins.",[6971,18870,18873],{"className":18871,"code":18872,"language":6976},[6974],"root@1cf14a7465fd:\u002F# ls\nbash: ls: command not found\n",[6002,18874,18872],{"__ignoreMap":45},[5825,18876,18877],{},"Oh right. \"ls\" is a command that is an executable program that lives at \u002Fbin\u002Fls. Correction: LIVED. But no longer. That's ok ... tab completion still works!",[6971,18879,18882],{"className":18880,"code":18881,"language":6976},[6974],"root@1cf14a7465fd:\u002F# cd \u003Ctab>\u003Ctab>\ndev\u002F  etc\u002F  proc\u002F sys\u002F\nroot@1cf14a7465fd:\u002F# cd etc\nroot@1cf14a7465fd:\u002Fetc#\n",[6002,18883,18881],{"__ignoreMap":45},[5825,18885,18886],{},"Great! So we can get directory lists. Let's look at some files",[6971,18888,18891],{"className":18889,"code":18890,"language":6976},[6974],"root@1cf14a7465fd:\u002F# cat \u003Ctab>\u003Ctab>\nhostname     hosts        resolv.conf  \nroot@1cf14a7465fd:\u002F# cat resolv.conf\nbash: cat: command not found\n",[6002,18892,18890],{"__ignoreMap":45},[5825,18894,18895],{},"Oh right. No \"cat\" command either. What commands DO we have? Well, we have any bash built-in. And we have bash as a programming language with loops and all that. Now we start to get fancy.",[6971,18897,18900],{"className":18898,"code":18899,"language":6976},[6974],"root@1cf14a7465fd:\u002F# while read p; do echo $p; done \u003C \u002Fetc\u002Fhostname\n1cf14a7465fd\n",[6002,18901,18899],{"__ignoreMap":45},[5825,18903,18904],{},"Nice. We can now look at the contents of files. But if we are ever going to rebuild our system we'll also need to write files. Easy!",[6971,18906,18909],{"className":18907,"code":18908,"language":6976},[6974],"root@1cf14a7465fd:\u002Fetc# echo 'echo \"hello!\"' > hello.sh\nroot@1cf14a7465fd:\u002Fetc# . \u002Fetc\u002Fhello.sh\nhello!\n",[6002,18910,18908],{"__ignoreMap":45},[5825,18912,18913],{},"We cheated a bit with that \".\" to \"source\" the file. I'm not sure how to make it executable, since we no longer have chmod. Maybe we'll try that next time.",[5825,18915,18916],{},"Enjoy your broken docker container!",{"title":45,"searchDepth":15,"depth":15,"links":18918},[],"2018-11-12T23:04-05:00",{},{"title":4321,"description":18835},"TLT - 2018.11.12 - Destroy Things",[5980],"2018-11-12T23:07-05:00","XcUo333mfvtawxe5gT-vLYqjg8r8aMUti9oIlkXTZHg",{"id":18927,"title":4311,"body":18928,"createdAt":18953,"description":4313,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":18954,"navigation":5976,"path":4310,"seo":18955,"stem":18956,"tags":18957,"updatedAt":18958,"__hash__":18959},"content\u002FTLT - 2018.07.29 - Multiverse Timetravel Accounting.md",{"type":5822,"value":18929,"toc":18950},[18930,18932,18935,18938,18941,18944,18947],[5825,18931,4313],{},[6071,18933,4316],{"id":18934},"accountants-are-secretly-time-travelers",[5825,18936,18937],{},"Perhaps that is a slight exaggeration. They don't ACTUALLY travel through time. But if you hang out with them a bit and observe their twisted time and verb conjugation ... well it's obvious that they would be right at home hopping around a branching multiverse.",[5825,18939,18940],{},"For example, there we were at the end of June. Topic at hand: things that are going to happen in May, from the perspective of late April. Casual conversations include things like \"If we put the new rule into place in late June, then when May hits we'll have to go all the way back to February to get the correct outcome\". Mind bending! Daily conversation, without anyone blinking an eye.",[5825,18942,18943],{},"Alternate timelines are discussed quite a bit also. They aren't quite stated this way, but basically they go along thinking in terms of events from timeline A, and then decide \"No! Wait! We aren't in timeline A, we are in timeline B!!!!\" and maybe freak out a little about how they now have to rewrite history to match the current reality or perhaps adjust the perception of the current reality to match the new history. Some of it even appears to be experimental, running simulations on previous events to try to see how it changes the present (well ... and the future).",[5825,18945,18946],{},"One thing I'm glad of is the ethical standards to which time travelers.... er... accountants adhere. There is an ongoing insistence that no matter what timeline they find themselves in, they should reconcile with the past and ever move to a more obvious and simple future. Try not to change the facts of the past, but if you do please keep some integrity in the universe so it can have some degree of cohesion in the present.",[5825,18948,18949],{},"Anyway. Take my advice. If you go adventuring around in your time machine, bring an accountant to keep track of what is going on.",{"title":45,"searchDepth":15,"depth":15,"links":18951},[18952],{"id":18934,"depth":15,"text":4316},"2018-07-29T20:16-04:00",{},{"title":4311,"description":4313},"TLT - 2018.07.29 - Multiverse Timetravel Accounting",[5980],"2018-07-29T20:29-04:00","Of0D6Ogn_d5iliGwjsEM2Q1jAidzzUKm_80QCBfHrB0",{"id":18961,"title":4306,"body":18962,"createdAt":19019,"description":45,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":19020,"navigation":5976,"path":4305,"seo":19021,"stem":19022,"tags":19023,"updatedAt":19024,"__hash__":19025},"content\u002FTLT - 2018.07.23 - Link Roundup.md",{"type":5822,"value":18963,"toc":19017},[18964],[6013,18965,18966,18984,18996],{},[6016,18967,18968,18973],{},[5950,18969,18972],{"href":18970,"rel":18971},"https:\u002F\u002Fwww.theatlantic.com\u002Fmagazine\u002Farchive\u002F2008\u002F07\u002Fis-google-making-us-stupid\u002F306868\u002F?single_page=true",[5954],"Is Google Making Us Stupid?",[6013,18974,18975,18978,18981],{},[6016,18976,18977],{},"I have a big stack of books that I've made ... fairly little progress on",[6016,18979,18980],{},"Maybe the internet is eating my brain!",[6016,18982,18983],{},"So now I will post links and bullets",[6016,18985,18986,18991],{},[5950,18987,18990],{"href":18988,"rel":18989},"http:\u002F\u002Fblog.plover.com\u002Fmath\u002Ftelugu.html",[5954],"Base-4 fractions in Telugu",[6013,18992,18993],{},[6016,18994,18995],{},"Interesting explanation of the traditional Telugu fraction numbering. Also draws comparison to the traditional English measures",[6016,18997,18998,19003],{},[5950,18999,19002],{"href":19000,"rel":19001},"http:\u002F\u002Fblog.plover.com\u002Fprog\u002Fgit-remote-branches.html",[5954],"Git remote branches and Git's missing terminology",[6013,19004,19005,19008],{},[6016,19006,19007],{},"Presents a better understanding of git remote branches, highlighting that to really comprehend what's going on you must acknowledge the implicit local branch that is your cache of the upstream (such as origin\u002Fmaster)",[6016,19009,19010,19011,19016],{},"I'm a little worried that I'm going to end up linking half of MJD's blog posts. Oh well, they are great. Example, ",[5950,19012,19015],{"href":19013,"rel":19014},"http:\u002F\u002Fblog.plover.com\u002FUnix\u002Fdev-null.html",[5954],"\u002Fdev\u002Fnull Follies"," has a hilarious nerdy punchline.",{"title":45,"searchDepth":15,"depth":15,"links":19018},[],"2018-07-23T00:59-04:00",{},{"title":4306,"description":45},"TLT - 2018.07.23 - Link Roundup",[5980,8193],"2018-07-23T01:03-04:00","yZwZ_Y6JSj5GthiA58bfniBVTLWP-waYBgVxkQBypPc",{"id":19027,"title":741,"body":19028,"createdAt":19062,"description":45,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":19063,"navigation":5976,"path":740,"seo":19064,"stem":19065,"tags":19066,"updatedAt":19062,"__hash__":19067},"content\u002FComments on TLT - 2018.02.05 - OddMuse Wiki Dockerized.md",{"type":5822,"value":19029,"toc":19059},[19030,19033,19036,19042,19050],[7710,19031,403],{"id":19032},"_1-comment",[5825,19034,19035],{},"This is perfect timing for me !",[5825,19037,19038,19039,19041],{},"I did something close with mine using apache a few months ago but I am not satisfied with it.",[6297,19040],{},"\nI run it onto my SAN Synology box.",[5825,19043,15979,19044,19049],{},[5950,19045,19048],{"href":19046,"rel":19047},"https:\u002F\u002Foddmuse.org\u002Fwiki\u002FSetup_using_Docker",[5954],"Oddmuse page"," for details on my recipe and see if we can make it better.",[5825,19051,19052,19053,19058],{},"-- ",[5950,19054,19057],{"href":19055,"rel":19056},"http:\u002F\u002Fx.maillard.im\u002Fwiki",[5954],"XavierMaillard"," 2018-05-10 07:57 UTC",{"title":45,"searchDepth":15,"depth":15,"links":19060},[19061],{"id":19032,"depth":56,"text":403},"2018-05-10T03:57-04:00",{},{"title":741,"description":45},"Comments on TLT - 2018.02.05 - OddMuse Wiki Dockerized",[],"DkVt2a0n9FrDTTHgJBP_DRQ8kjvM8SJyZom-66j9CTo",{"id":19069,"title":5719,"body":19070,"createdAt":19159,"description":19160,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":19161,"navigation":5976,"path":5718,"seo":19162,"stem":15092,"tags":19163,"updatedAt":19159,"__hash__":19164},"content\u002FYo Oliver.md",{"type":5822,"value":19071,"toc":19157},[19072,19079,19091,19103,19112,19123,19135,19147],[5825,19073,19074,19075,6241,19077,6259],{},"Un-Mixed: ",[6237,19076],{"controls":5976,"preload":6239,"src":15097},[5950,19078,6245],{"download":15100,"external":45,"href":15097},[5825,19080,19081,19082,17963,19084,17969],{},"Artist: Sacha (writing, music, lyrics), Brock (mixing)",[6297,19083],{},[5950,19085,19087,19088,19090],{"href":17966,"rel":19086},[5954],"Creative",[6297,19089],{},"\nCommons Attribution-NonCommercial",[5825,19092,19093,19094,19096,19097,19099,19100,19102],{},"I know a dog",[6297,19095],{},"\nAnd he's my friend",[6297,19098],{},"\nHis name is Oliver",[6297,19101],{},"\nOliver Boliver",[5825,19104,19093,19105,19107,19108,19099,19110,19102],{},[6297,19106],{},"\nAnd he's so cool",[6297,19109],{},[6297,19111],{},[5825,19113,15092,19114,19116,19117,19119,19120,19122],{},[6297,19115],{},"\nYou're so cool",[6297,19118],{},"\nYo Oliver",[6297,19121],{},"\nYou rule",[5825,19124,19125,19126,19128,19129,19131,19132,19134],{},"Walks in the park",[6297,19127],{},"\nAnd doggie treats",[6297,19130],{},"\nAre all his favorites",[6297,19133],{},"\nYeah all his favorites",[5825,19136,19137,19138,19140,19141,19143,19144,19146],{},"He likes his naps",[6297,19139],{},"\nHe likes to sleep",[6297,19142],{},"\nAnd everyone loves him",[6297,19145],{},"\nEveryone loves him",[5825,19148,15092,19149,19151,19152,19119,19154,19156],{},[6297,19150],{},"\nYou are really fun",[6297,19153],{},[6297,19155],{},"\nLoved by everyone",{"title":45,"searchDepth":15,"depth":15,"links":19158},[],"2018-04-14T22:30-04:00","Un-Mixed:  (download)",{},{"title":5719,"description":19160},[6271],"C5urFq0OJdL2aN3FUBlGY1eVY2KWR6LV6ixW2U99y2o",{"id":19166,"title":4301,"body":19167,"createdAt":19239,"description":19240,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":19241,"navigation":5976,"path":4300,"seo":19242,"stem":19243,"tags":19244,"updatedAt":19245,"__hash__":19246},"content\u002FTLT - 2018.02.05 - OddMuse Wiki Dockerized.md",{"type":5822,"value":19168,"toc":19237},[19169,19178,19186,19192,19199,19202,19210,19216,19225,19234],[5825,19170,19171,19172,19177],{},"I Dockerized this website yesterday! I had already built a ",[5950,19173,19176],{"href":19174,"rel":19175},"https:\u002F\u002Fthelackthereof.org\u002Fcpanfile",[5954],"cpanfile"," that declares the Perl5 dependencies of OddMuse, which made it easy. I'm also going to run this with the data directory directly bind-mounted.",[5825,19179,19180,19181,7950],{},"First the ",[5950,19182,19185],{"href":19183,"rel":19184},"https:\u002F\u002Fthelackthereof.org\u002FDockerfile",[5954],"Dockerfile",[6971,19187,19190],{"className":19188,"code":19189,"language":6976},[6974],"FROM perl:latest\n\n# Set up the deploy user\nARG uid=1000\nARG gid=1000\nRUN echo groupadd -g $gid deploy\nRUN groupadd -g $gid deploy\nRUN useradd --create-home -u $uid -g $gid -ms \u002Fbin\u002Fbash deploy\n\nWORKDIR \u002Fapp\n\nCOPY cpanfile .\nRUN cpanm -qn --installdeps .\n\nUSER deploy\n",[6002,19191,19189],{"__ignoreMap":45},[5825,19193,19194,19195,19198],{},"The bit of fancyness here is the deploy user setup. Since I'm mounting the project directory for data files, I'd like new files and edits to be done by my normal user. On my cloud-server, this is uid 1000, which is easy to set as the default. On my laptop I run as user 1001, so the file is parameterized for this case. When I run locally, I have to build my docker image with ",[6002,19196,19197],{},"docker build --build-arg uid=$(id -u) --build-arg gid=$(id -g)",". Not as much fun.",[5825,19200,19201],{},"Otherwise, this starts with the Perl5 base image and installs the CPAN dependencies.",[5825,19203,19204,19205],{},"Next, the ",[5950,19206,19209],{"href":19207,"rel":19208},"https:\u002F\u002Fthelackthereof.org\u002Fdocker-compose.yml",[5954],"docker-compose.yml",[6971,19211,19214],{"className":19212,"code":19213,"language":6976},[6974],"version: '3'\n\nservices:\n\n  web:\n    build: .\n    command: starman --workers=10 --max-requests=1 --access-log starman-access.log --error-log starman-error.log oddmuse.psgi\n    volumes:\n      - \".:\u002Fapp\"\n    ports:\n      - \"5000\" # For running locally\n\n  nginx-ssl-proxy:\n    image: danieldent\u002Fnginx-ssl-proxy\n    restart: always\n    environment:\n      UPSTREAM: web:5000\n      SERVERNAME: thelackthereof.org\n      EXTRANAMES: www.thelackthereof.org\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n    volumes:\n      - \"\u002Fetc\u002Fletsencrypt\"\n    depends_on:\n      - web\n",[6002,19215,19213],{"__ignoreMap":45},[5825,19217,19218,19219,19224],{},"The first service runs cpan:Starman (this is similar to Unicorn for you Ruby folk). It mounts the project directory as \u002Fapp, and runs ",[5950,19220,19223],{"href":19221,"rel":19222},"https:\u002F\u002Fthelackthereof.org\u002Foddmuse.psgi",[5954],"oddmuse.psgi",". We declare port 5000 anyway for local debugging -- we can then run only this service and it'll come up on a randomly assigned port that connects to port 5000. Other services on this network can connect to \"web:5000\" even without this declaration.",[5825,19226,19227,19228,19233],{},"Which brings us to the second fancy bit. The ",[5950,19229,19232],{"href":19230,"rel":19231},"https:\u002F\u002Fgithub.com\u002FDanielDent\u002Fdocker-nginx-ssl-proxy",[5954],"danieldent\u002Fnginx-ssl-proxy"," image is a super cool image that gives an nginx proxy with automatic letsencrypt setup! You declare the domain name and the proxy destination (web:5000 is our Starman), and assuming that domain really is pointing here, it will work with letsencrypt to verify ownership and make certificates. The certs are stored in a docker-managed volume, and are periodically renewed. This takes less than a minute, so even if the volume gets accidentally deleted we can easily get a new cert.",[5825,19235,19236],{},"Now running \"docker-compose up -d\" starts nginx and starman running in the background. All that remains is getting this running on boot. Since the startup command can be run over and over, worst case you can put it in a cronjob that runs frequently :)",{"title":45,"searchDepth":15,"depth":15,"links":19238},[],"2018-02-05T07:50-05:00","I Dockerized this website yesterday! I had already built a cpanfile that declares the Perl5 dependencies of OddMuse, which made it easy. I'm also going to run this with the data directory directly bind-mounted.",{},{"title":4301,"description":19240},"TLT - 2018.02.05 - OddMuse Wiki Dockerized",[5980],"2018-02-05T08:14-05:00","aWuAfq9msEQqxJ2CHjxp4moaMwioutmXWgqJE0uvTUw",{"id":19248,"title":1102,"body":19249,"createdAt":20031,"description":19253,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":20032,"navigation":5976,"path":1101,"seo":20033,"stem":20034,"tags":20035,"updatedAt":20036,"__hash__":20037},"content\u002FDeep Code Tracing.md",{"type":5822,"value":19250,"toc":20029},[19251,19254,19257,19266,19269,19331,19334,19712,19715,19771,19774,19826,19829,19836,19847,19850,19879,19882,19928,19931,20004,20007,20026],[5825,19252,19253],{},"Let's have some fun with tracing code!",[5825,19255,19256],{},"Here is a nice way to get Elasticsearch+Kibana up and running:",[6971,19258,19260],{"className":8277,"code":19259,"language":8279,"meta":45,"style":45},"docker run -d -p 9200:9200 -p 5601:5601 nshou\u002Felasticsearch-kibana\n",[6002,19261,19262],{"__ignoreMap":45},[5853,19263,19264],{"class":7026,"line":9},[5853,19265,19259],{},[5825,19267,19268],{},"We're going to record our traces as a time-series. We unfortunately have to do a small config first, to ES know that our timestamp is ... a timestamp:",[6971,19270,19272],{"className":8277,"code":19271,"language":8279,"meta":45,"style":45},"curl -v -XPUT 'http:\u002F\u002Felastic:changeme@localhost:9200\u002Ftrace' -d '\n{\n  \"mappings\": {\n    \"trace\": {\n      \"properties\": {\n        \"timestamp\": {\n          \"type\": \"date\"\n        }\n      }\n    }\n  }\n}'\n",[6002,19273,19274,19279,19283,19288,19293,19298,19303,19308,19313,19318,19322,19326],{"__ignoreMap":45},[5853,19275,19276],{"class":7026,"line":9},[5853,19277,19278],{},"curl -v -XPUT 'http:\u002F\u002Felastic:changeme@localhost:9200\u002Ftrace' -d '\n",[5853,19280,19281],{"class":7026,"line":15},[5853,19282,9210],{},[5853,19284,19285],{"class":7026,"line":56},[5853,19286,19287],{},"  \"mappings\": {\n",[5853,19289,19290],{"class":7026,"line":5212},[5853,19291,19292],{},"    \"trace\": {\n",[5853,19294,19295],{"class":7026,"line":7077},[5853,19296,19297],{},"      \"properties\": {\n",[5853,19299,19300],{"class":7026,"line":7083},[5853,19301,19302],{},"        \"timestamp\": {\n",[5853,19304,19305],{"class":7026,"line":7094},[5853,19306,19307],{},"          \"type\": \"date\"\n",[5853,19309,19310],{"class":7026,"line":7100},[5853,19311,19312],{},"        }\n",[5853,19314,19315],{"class":7026,"line":7110},[5853,19316,19317],{},"      }\n",[5853,19319,19320],{"class":7026,"line":7118},[5853,19321,15721],{},[5853,19323,19324],{"class":7026,"line":8481},[5853,19325,15755],{},[5853,19327,19328],{"class":7026,"line":8495},[5853,19329,19330],{},"}'\n",[5825,19332,19333],{},"Now we need to write down interesting things during our program execution. In my case, I'm working with a Rails project using RSpec. So I put this code near the top of spec\u002Fspec_helper.rb. Once executed, this code will start writing out to 'trace.log' lots and lots of tracing data:",[6971,19335,19339],{"className":19336,"code":19337,"language":19338,"meta":45,"style":45},"language-ruby shiki shiki-themes github-light github-dark monokai","git_sha = `git rev-parse HEAD`.chomp\ntrace_seq = 0\ntrace_log = File.new('trace.log', 'w')\ntrace_id = SecureRandom.uuid\ntrace = TracePoint.new(:line) do |tp|\n  next unless tp.path.start_with?(Rails.root.to_s)\n  event = {\n    trace_id: trace_id,\n    timestamp: Time.now.utc.round(10).iso8601(6),\n    git_sha: git_sha,\n    path: tp.path,\n    line: tp.lineno,\n    class: tp.defined_class.to_s,\n    method: tp.method_id,\n    seq: (trace_seq += 1)\n  }\n  if $rspec_example\n    event.merge!({\n      rspec_location: $rspec_example.location,\n      rspec_description: $rspec_example.description,\n      rspec_full_description: $rspec_example.full_description,\n    })\n  end\n  trace_log.puts(event.to_json)\nend\ntrace.enable\n","ruby",[6002,19340,19341,19357,19366,19393,19408,19435,19471,19480,19488,19529,19537,19548,19560,19576,19588,19604,19608,19616,19628,19642,19655,19668,19674,19680,19697,19703],{"__ignoreMap":45},[5853,19342,19343,19347,19349,19352,19354],{"class":7026,"line":9},[5853,19344,19346],{"class":19345},"sOrwc","git_sha",[5853,19348,18494],{"class":7029},[5853,19350,19351],{"class":7059}," `git rev-parse HEAD`",[5853,19353,7203],{"class":7033},[5853,19355,19356],{"class":7103},"chomp\n",[5853,19358,19359,19362,19364],{"class":7026,"line":15},[5853,19360,19361],{"class":19345},"trace_seq",[5853,19363,18494],{"class":7029},[5853,19365,7074],{"class":7073},[5853,19367,19368,19371,19373,19376,19378,19381,19383,19386,19388,19391],{"class":7026,"line":56},[5853,19369,19370],{"class":19345},"trace_log",[5853,19372,18494],{"class":7029},[5853,19374,19375],{"class":8960}," File",[5853,19377,7203],{"class":7033},[5853,19379,19380],{"class":7029},"new",[5853,19382,12273],{"class":7033},[5853,19384,19385],{"class":7059},"'trace.log'",[5853,19387,9528],{"class":7033},[5853,19389,19390],{"class":7059},"'w'",[5853,19392,7063],{"class":7033},[5853,19394,19395,19398,19400,19403,19405],{"class":7026,"line":5212},[5853,19396,19397],{"class":19345},"trace_id",[5853,19399,18494],{"class":7029},[5853,19401,19402],{"class":8960}," SecureRandom",[5853,19404,7203],{"class":7033},[5853,19406,19407],{"class":8564},"uuid\n",[5853,19409,19410,19413,19415,19418,19420,19422,19424,19427,19430,19432],{"class":7026,"line":7077},[5853,19411,19412],{"class":19345},"trace",[5853,19414,18494],{"class":7029},[5853,19416,19417],{"class":8960}," TracePoint",[5853,19419,7203],{"class":7033},[5853,19421,19380],{"class":7029},[5853,19423,12273],{"class":7033},[5853,19425,19426],{"class":7073},":line",[5853,19428,19429],{"class":7033},") ",[5853,19431,7451],{"class":7029},[5853,19433,19434],{"class":7033}," |tp|\n",[5853,19436,19437,19440,19443,19446,19449,19451,19454,19456,19459,19461,19464,19466,19469],{"class":7026,"line":7083},[5853,19438,19439],{"class":7029},"  next",[5853,19441,19442],{"class":7029}," unless",[5853,19444,19445],{"class":7033}," tp.",[5853,19447,19448],{"class":8564},"path",[5853,19450,7203],{"class":7033},[5853,19452,19453],{"class":8564},"start_with?",[5853,19455,12273],{"class":7033},[5853,19457,19458],{"class":8960},"Rails",[5853,19460,7203],{"class":7033},[5853,19462,19463],{"class":8564},"root",[5853,19465,7203],{"class":7033},[5853,19467,19468],{"class":8564},"to_s",[5853,19470,7063],{"class":7033},[5853,19472,19473,19476,19478],{"class":7026,"line":7094},[5853,19474,19475],{"class":19345},"  event",[5853,19477,18494],{"class":7029},[5853,19479,16026],{"class":7033},[5853,19481,19482,19485],{"class":7026,"line":7100},[5853,19483,19484],{"class":7073},"    trace_id:",[5853,19486,19487],{"class":7033}," trace_id,\n",[5853,19489,19490,19493,19496,19498,19501,19503,19506,19508,19511,19513,19516,19518,19521,19523,19526],{"class":7026,"line":7110},[5853,19491,19492],{"class":7073},"    timestamp:",[5853,19494,19495],{"class":8960}," Time",[5853,19497,7203],{"class":7033},[5853,19499,19500],{"class":8564},"now",[5853,19502,7203],{"class":7033},[5853,19504,19505],{"class":8564},"utc",[5853,19507,7203],{"class":7033},[5853,19509,19510],{"class":8564},"round",[5853,19512,12273],{"class":7033},[5853,19514,19515],{"class":7073},"10",[5853,19517,6952],{"class":7033},[5853,19519,19520],{"class":8564},"iso8601",[5853,19522,12273],{"class":7033},[5853,19524,19525],{"class":7073},"6",[5853,19527,19528],{"class":7033},"),\n",[5853,19530,19531,19534],{"class":7026,"line":7118},[5853,19532,19533],{"class":7073},"    git_sha:",[5853,19535,19536],{"class":7033}," git_sha,\n",[5853,19538,19539,19542,19544,19546],{"class":7026,"line":8481},[5853,19540,19541],{"class":7073},"    path:",[5853,19543,19445],{"class":7033},[5853,19545,19448],{"class":8564},[5853,19547,8971],{"class":7033},[5853,19549,19550,19553,19555,19558],{"class":7026,"line":8495},[5853,19551,19552],{"class":7073},"    line:",[5853,19554,19445],{"class":7033},[5853,19556,19557],{"class":8564},"lineno",[5853,19559,8971],{"class":7033},[5853,19561,19562,19565,19567,19570,19572,19574],{"class":7026,"line":13169},[5853,19563,19564],{"class":7073},"    class:",[5853,19566,19445],{"class":7033},[5853,19568,19569],{"class":8564},"defined_class",[5853,19571,7203],{"class":7033},[5853,19573,19468],{"class":8564},[5853,19575,8971],{"class":7033},[5853,19577,19578,19581,19583,19586],{"class":7026,"line":14318},[5853,19579,19580],{"class":7073},"    method:",[5853,19582,19445],{"class":7033},[5853,19584,19585],{"class":8564},"method_id",[5853,19587,8971],{"class":7033},[5853,19589,19590,19593,19596,19599,19602],{"class":7026,"line":14336},[5853,19591,19592],{"class":7073},"    seq:",[5853,19594,19595],{"class":7033}," (trace_seq ",[5853,19597,19598],{"class":7029},"+=",[5853,19600,19601],{"class":7073}," 1",[5853,19603,7063],{"class":7033},[5853,19605,19606],{"class":7026,"line":14361},[5853,19607,15755],{"class":7033},[5853,19609,19610,19613],{"class":7026,"line":14384},[5853,19611,19612],{"class":7029},"  if",[5853,19614,19615],{"class":7033}," $rspec_example\n",[5853,19617,19619,19622,19625],{"class":7026,"line":19618},18,[5853,19620,19621],{"class":7033},"    event.",[5853,19623,19624],{"class":8564},"merge!",[5853,19626,19627],{"class":7033},"({\n",[5853,19629,19631,19634,19637,19640],{"class":7026,"line":19630},19,[5853,19632,19633],{"class":7073},"      rspec_location:",[5853,19635,19636],{"class":7033}," $rspec_example.",[5853,19638,19639],{"class":8564},"location",[5853,19641,8971],{"class":7033},[5853,19643,19645,19648,19650,19653],{"class":7026,"line":19644},20,[5853,19646,19647],{"class":7073},"      rspec_description:",[5853,19649,19636],{"class":7033},[5853,19651,19652],{"class":8564},"description",[5853,19654,8971],{"class":7033},[5853,19656,19658,19661,19663,19666],{"class":7026,"line":19657},21,[5853,19659,19660],{"class":7073},"      rspec_full_description:",[5853,19662,19636],{"class":7033},[5853,19664,19665],{"class":8564},"full_description",[5853,19667,8971],{"class":7033},[5853,19669,19671],{"class":7026,"line":19670},22,[5853,19672,19673],{"class":7033},"    })\n",[5853,19675,19677],{"class":7026,"line":19676},23,[5853,19678,19679],{"class":7029},"  end\n",[5853,19681,19683,19686,19689,19692,19695],{"class":7026,"line":19682},24,[5853,19684,19685],{"class":7033},"  trace_log.",[5853,19687,19688],{"class":7103},"puts",[5853,19690,19691],{"class":7033},"(event.",[5853,19693,19694],{"class":8564},"to_json",[5853,19696,7063],{"class":7033},[5853,19698,19700],{"class":7026,"line":19699},25,[5853,19701,19702],{"class":7029},"end\n",[5853,19704,19706,19709],{"class":7026,"line":19705},26,[5853,19707,19708],{"class":7033},"trace.",[5853,19710,19711],{"class":8564},"enable\n",[5825,19713,19714],{},"I have some stuff in there that is specific to RSpec. Later in the same file I put this config to track the current test being executed:",[6971,19716,19718],{"className":19336,"code":19717,"language":19338,"meta":45,"style":45},"config.before :each do\n  $rspec_example = example\nend\nconfig.after :each do\n  $rspec_example = nil\nend\n",[6002,19719,19720,19734,19744,19748,19758,19767],{"__ignoreMap":45},[5853,19721,19722,19725,19728,19731],{"class":7026,"line":9},[5853,19723,19724],{"class":7033},"config.",[5853,19726,19727],{"class":8564},"before",[5853,19729,19730],{"class":7073}," :each",[5853,19732,19733],{"class":7029}," do\n",[5853,19735,19736,19739,19741],{"class":7026,"line":15},[5853,19737,19738],{"class":7033},"  $rspec_example ",[5853,19740,7053],{"class":7029},[5853,19742,19743],{"class":7033}," example\n",[5853,19745,19746],{"class":7026,"line":56},[5853,19747,19702],{"class":7029},[5853,19749,19750,19752,19754,19756],{"class":7026,"line":5212},[5853,19751,19724],{"class":7033},[5853,19753,8805],{"class":8564},[5853,19755,19730],{"class":7073},[5853,19757,19733],{"class":7029},[5853,19759,19760,19762,19764],{"class":7026,"line":7077},[5853,19761,19738],{"class":7033},[5853,19763,7053],{"class":7029},[5853,19765,19766],{"class":7073}," nil\n",[5853,19768,19769],{"class":7026,"line":7083},[5853,19770,19702],{"class":7029},[5825,19772,19773],{},"Then I run my tests, which outputs trace.log. With this tracing turned on, it went at about half the normal speed. Mine is 123M (after disabling some logging). Now we load it into our ES. I do this in batches of 10k, and then POST it into ES:",[6971,19775,19777],{"className":8277,"code":19776,"language":8279,"meta":45,"style":45},"cat trace.log \\\n  | jq -c '. | {\"index\": {\"_index\": \"trace\", \"_type\": \"trace\"}}, .' \\\n  | split -l 10000 - load-\n\nfor f in load-* ; do\n  cat $f | curl -XPOST 'http:\u002F\u002Felastic:changeme@localhost:9200\u002F_bulk' --data-binary @- >\u002Fdev\u002Fnull\ndone\n\n# I guess we could clean up now...\nrm load-*\n",[6002,19778,19779,19784,19789,19794,19798,19803,19808,19812,19816,19821],{"__ignoreMap":45},[5853,19780,19781],{"class":7026,"line":9},[5853,19782,19783],{},"cat trace.log \\\n",[5853,19785,19786],{"class":7026,"line":15},[5853,19787,19788],{},"  | jq -c '. | {\"index\": {\"_index\": \"trace\", \"_type\": \"trace\"}}, .' \\\n",[5853,19790,19791],{"class":7026,"line":56},[5853,19792,19793],{},"  | split -l 10000 - load-\n",[5853,19795,19796],{"class":7026,"line":5212},[5853,19797,7045],{"emptyLinePlaceholder":5976},[5853,19799,19800],{"class":7026,"line":7077},[5853,19801,19802],{},"for f in load-* ; do\n",[5853,19804,19805],{"class":7026,"line":7083},[5853,19806,19807],{},"  cat $f | curl -XPOST 'http:\u002F\u002Felastic:changeme@localhost:9200\u002F_bulk' --data-binary @- >\u002Fdev\u002Fnull\n",[5853,19809,19810],{"class":7026,"line":7094},[5853,19811,13172],{},[5853,19813,19814],{"class":7026,"line":7100},[5853,19815,7045],{"emptyLinePlaceholder":5976},[5853,19817,19818],{"class":7026,"line":7110},[5853,19819,19820],{},"# I guess we could clean up now...\n",[5853,19822,19823],{"class":7026,"line":7118},[5853,19824,19825],{},"rm load-*\n",[5825,19827,19828],{},"OK! Now we can finally have some fun!",[5825,19830,19831,19832],{},"Load up ",[5950,19833,19834],{"href":19834,"rel":19835},"http:\u002F\u002Flocalhost:5601\u002F",[5954],[6013,19837,19838,19841,19844],{},[6016,19839,19840],{},"Set index name to \"trace\"",[6016,19842,19843],{},"Accept the timestamp field it automatically picks",[6016,19845,19846],{},"Click into discover, and now you can slice and dice some stuff!",[5825,19848,19849],{},"Given a file, annotate the lines with a list of the tests that touch that line:",[6971,19851,19853],{"className":8277,"code":19852,"language":8279,"meta":45,"style":45},"FILEPATH=$1\n\ncurl -s -XGET \"localhost:9200\u002Ftrace\u002F_search?q=%2Bpath:$FILEPATH%20%2Bline:%5B1%20TO%20100000%5D&sort=timestamp:desc&size=10000&pretty\" \\\n  | jq -r '.hits.hits[]._source| \"\\(.line) \\(.rspec_location)\"' \\\n  | sort -u -n\n",[6002,19854,19855,19860,19864,19869,19874],{"__ignoreMap":45},[5853,19856,19857],{"class":7026,"line":9},[5853,19858,19859],{},"FILEPATH=$1\n",[5853,19861,19862],{"class":7026,"line":15},[5853,19863,7045],{"emptyLinePlaceholder":5976},[5853,19865,19866],{"class":7026,"line":56},[5853,19867,19868],{},"curl -s -XGET \"localhost:9200\u002Ftrace\u002F_search?q=%2Bpath:$FILEPATH%20%2Bline:%5B1%20TO%20100000%5D&sort=timestamp:desc&size=10000&pretty\" \\\n",[5853,19870,19871],{"class":7026,"line":5212},[5853,19872,19873],{},"  | jq -r '.hits.hits[]._source| \"\\(.line) \\(.rspec_location)\"' \\\n",[5853,19875,19876],{"class":7026,"line":7077},[5853,19877,19878],{},"  | sort -u -n\n",[5825,19880,19881],{},"Given a file and a line, list all of the tests that cover that line:",[6971,19883,19885],{"className":8277,"code":19884,"language":8279,"meta":45,"style":45},"#!\u002Fbin\u002Fsh\n\nFILEPATH=$1\nLINE=$2\n\ncurl -s -XGET \\\n  \"localhost:9200\u002Ftrace\u002F_search?q=%2Bpath:$FILEPATH%20%2Bline:$LINE&sort=timestamp:desc&size=1000&pretty\" \\\n  | jq -r '.hits.hits[]._source.rspec_location' \\\n  | sort -u\n",[6002,19886,19887,19891,19895,19899,19904,19908,19913,19918,19923],{"__ignoreMap":45},[5853,19888,19889],{"class":7026,"line":9},[5853,19890,8287],{},[5853,19892,19893],{"class":7026,"line":15},[5853,19894,7045],{"emptyLinePlaceholder":5976},[5853,19896,19897],{"class":7026,"line":56},[5853,19898,19859],{},[5853,19900,19901],{"class":7026,"line":5212},[5853,19902,19903],{},"LINE=$2\n",[5853,19905,19906],{"class":7026,"line":7077},[5853,19907,7045],{"emptyLinePlaceholder":5976},[5853,19909,19910],{"class":7026,"line":7083},[5853,19911,19912],{},"curl -s -XGET \\\n",[5853,19914,19915],{"class":7026,"line":7094},[5853,19916,19917],{},"  \"localhost:9200\u002Ftrace\u002F_search?q=%2Bpath:$FILEPATH%20%2Bline:$LINE&sort=timestamp:desc&size=1000&pretty\" \\\n",[5853,19919,19920],{"class":7026,"line":7100},[5853,19921,19922],{},"  | jq -r '.hits.hits[]._source.rspec_location' \\\n",[5853,19924,19925],{"class":7026,"line":7110},[5853,19926,19927],{},"  | sort -u\n",[5825,19929,19930],{},"Ideas:",[6013,19932,19933,19956,19959,19973,19976,19990,19993,20001],{},[6016,19934,19935,19936],{},"Editor:\n",[6013,19937,19938,19941,19944,19947,19950,19953],{},[6016,19939,19940],{},"Add to quickfix all of the tests that get here",[6016,19942,19943],{},"Highlight on the screen in a heatmap way the code that leads to the current line and the code that leads away from the current line",[6016,19945,19946],{},"Highlight untested lines",[6016,19948,19949],{},"Given a test, highlight lines that get executed",[6016,19951,19952],{},"Follow a trace within the editor, stepping forward\u002Fback\u002Fin\u002Fout. Choose your own adventure for where to step next",[6016,19954,19955],{},"Highlight variables that are visible from the current scope",[6016,19957,19958],{},"Given a test, generate a new copy of the codebase with only enough code to pass that one test",[6016,19960,19961,19962],{},"Visualize (graphviz) some interesting control flows\n",[6013,19963,19964,19967,19970],{},[6016,19965,19966],{},"Make an interactive (svg+web) trace",[6016,19968,19969],{},"Step in, step over, switch sequences",[6016,19971,19972],{},"Highlight past vs future in different colors",[6016,19974,19975],{},"Record state in the trace -- local variable contents",[6016,19977,19978,19979],{},"Profiling:\n",[6013,19980,19981,19984,19987],{},[6016,19982,19983],{},"Block enter vs exit duration",[6016,19985,19986],{},"Line duration",[6016,19988,19989],{},"Variable scope & contents",[6016,19991,19992],{},"Record during interactive execution (not only tests)",[6016,19994,19995,19996],{},"Capture line source code at time of trace?\n",[6013,19997,19998],{},[6016,19999,20000],{},"With cache to make it efficient",[6016,20002,20003],{},"Extract into gem for recording, cli-app for using",[5825,20005,20006],{},"Related work:",[6013,20008,20009],{},[6016,20010,20011,20012],{},"Using Neo4j instead of ES\n",[6013,20013,20014,20020,20023],{},[6016,20015,20016],{},[5950,20017,20018],{"href":20018,"rel":20019},"https:\u002F\u002Fneo4j.com\u002Fblog\u002Fneolytics-ruby-code-neo4j\u002F",[5954],[6016,20021,20022],{},"They also index a TON of other stuff -- AST, variable contents",[6016,20024,20025],{},"Implementation is specific to Ruby",[7147,20027,20028],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sOrwc, html code.shiki .sOrwc{--shiki-default:#E36209;--shiki-dark:#FFAB70;--shiki-sepia:#F8F8F2}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sTrkL, html code.shiki .sTrkL{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .s-m8C, html code.shiki .s-m8C{--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}",{"title":45,"searchDepth":15,"depth":15,"links":20030},[],"2017-07-30T00:57-04:00",{},{"title":1102,"description":19253},"Deep Code Tracing",[],"2017-07-31T10:29-04:00","U6bbm91Hk7iXzHieyQjMwBswh0_rrdrkeQSmUsFl8BA",{"id":20039,"title":2623,"body":20040,"createdAt":20136,"description":20044,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":20137,"navigation":5976,"path":2622,"seo":20138,"stem":20139,"tags":20140,"updatedAt":20141,"__hash__":20142},"content\u002FPerl6 Colons.md",{"type":5822,"value":20041,"toc":20126},[20042,20045,20051,20054,20057,20063,20066,20072,20075,20081,20084,20090,20093,20099,20102,20108,20111,20117,20120],[5825,20043,20044],{},"I'm collecting all the ways you can use : in Perl 6.",[5825,20046,20047,20048,20050],{},"Larry's 1st Law of Language Redesign: Everyone wants the colon",[6297,20049],{},"\nLarry's 2nd Law of Language Redesign: Larry gets the colon",[5825,20052,20053],{},"A lot of these are variations on a theme, especially the theme of \"colon-pair\" syntax. Where two uses of the colon look different or are in a different usage context, even if they are technically the same, I'd prefer to illustrate them both.",[7710,20055,2628],{"id":20056},"namespace",[6971,20058,20061],{"className":20059,"code":20060,"language":6976},[6974],"# namespace\npackage A::B { ... }\nclass A::B { ... }\n\n# Namespace separator\nmy $x = A::B.new;\n\n# Dynamic namespace\nmy $package_name = \"A::B\";\nmy $x = ::($package_name).new;\n\n# Pseudopackage representing null namespace?\nsay :: ;\n\n# Anonymous class\nmy $anon_class = class :: is Int {...}\n\n# Current class in a compile-time var\nclass Who { method myname { say ::?CLASS } }\n\n# Call Int method of Int class\n42.Int::Int;\n\n# Treat package X as a hash\nsay X::.keys;\n",[6002,20062,20060],{"__ignoreMap":45},[7710,20064,2632],{"id":20065},"binding",[6971,20067,20070],{"className":20068,"code":20069,"language":6976},[6974],"# Binding\nmy $y := $a;\n\n# Read-only binding\nmy $z ::= $y;\n\n# Container identity\n$y =:= $a; # True\n",[6002,20071,20069],{"__ignoreMap":45},[7710,20073,2636],{"id":20074},"colon-pair-syntax",[6971,20076,20079],{"className":20077,"code":20078,"language":6976},[6974],"# Colon-Pair syntax (often seen as adverbs)\nmy $x = 'cat';\n:foo(5)        # 'foo' => 5\n:foo('dog')    # 'foo' => 'dog'\n:foo($x)       # 'foo' => 'cat'\n\n# Value word quoting, no interpolation\n:foo\u003Cbar>      # 'foo' => 'bar'\n:foo\u003Cbar baz>  # 'foo' => ('bar', 'baz')\n:foo\u003C$x>       # 'foo' => '$x'\n\n# Value word quoting with interpolation\n:foo\u003C\u003C$x>>     # 'foo' => 'cat'\n:foo\u003C\u003C$x dog>> # 'foo' => ('cat', 'dog')\n\n# Numeric-prefix extraction\nsay (:73day) # day => 73\n\n# Default to true value\nsay (:foo) # foo => True\n\n# False instead of true\nsay (:!foo) # foo => False\n\n# Var name as key, content as value\nmy $x = 'cat';\nmy @foo=1,2;\n:@foo # foo => [1,2]\n:$x   # x   => 'cat'\n\n# Base conversion via colon-pair\nsay :16(\"dead\") # 57005\n\n# binding pair in sig:\nmy $a;\nsub b (:foo($x)! is rw) { $x = 42};\nb(:foo($a));\nsay $a # 42\n",[6002,20080,20078],{"__ignoreMap":45},[7710,20082,2070],{"id":20083},"types",[6971,20085,20088],{"className":20086,"code":20087,"language":6976},[6974],"# T takes value's type\n-> Numeric ::T \\x { say T }(42);\n\n# Type Smileys\nInt:D; # Defined Int\nInt:U; # Undefined Int\n",[6002,20089,20087],{"__ignoreMap":45},[7710,20091,2643],{"id":20092},"signature",[6971,20094,20097],{"className":20095,"code":20096,"language":6976},[6974],"# signature literal\nmy $sig = :(Int $foo);\n\n# signature on Callable &var, not yet implemented\nmy &f:(Str) = -> Str {};\n",[6002,20098,20096],{"__ignoreMap":45},[7710,20100,2647],{"id":20101},"operators-as-methods",[6971,20103,20106],{"className":20104,"code":20105,"language":6976},[6974],"my $a = 1;\n$a.infix:[\"+\"](3); # $a + 3\n$a.infix:\u003C+>(3);   # $a + 3, but shorter with quote brackets\n$a.prefix:\u003C++>;    # ++$a\n$a.postfix:\u003C++>;   # ++$a\n$a.:\u003C++>;          # Shorthand for prefix (no param)\n$a.:\u003C+>(3);        # Shorthand for infix (param provided)\n",[6002,20107,20105],{"__ignoreMap":45},[7710,20109,2651],{"id":20110},"regex",[6971,20112,20115],{"className":20113,"code":20114,"language":6976},[6974],"\n  # Regex adverb\n:i\u002Fa\u002F  # Case insensitive, outside\n\u002F:i a\u002F # Case insensitive, inside\n\n# Declare vars in regex scope\nmy regex foo { :my $var; }\n\n# Backtracking control\n# similar ones not yet implemented are :: ::> :::\n\u002F a: b?: c*: \u002F\n\n# One especially interesting example you often (don't) see is :?\n\u002F .*:? \u002F # explicit minimal match\n\u002F .*? \u002F  # short version that is usually used has no colon\n\n# Unicode character classes\nsay so \"a\" ~~ \u002F\u003C[:Alpha]>\u002F\n",[6002,20116,20114],{"__ignoreMap":45},[7710,20118,2193],{"id":20119},"misc",[6971,20121,20124],{"className":20122,"code":20123,"language":6976},[6974],"# Quote adverb\nQ:w(word of the day); \\# :w adverb\n\n# Precedence dropper\n@stuff.map({ $_ + 1 }); # Explicit parameter\n@stuff.map: { $_ + 1 }; # Parameters come after ':'\n\n# Invocant marker method invocation\n$x.say-hi(names => [\u003Cme you>]);  # Normal way\nsay-hi($x: names => [\u003Cme you>]) # Invocant marker way\n\n# Declare alternative to 'self' for current-instance in method\nmethod wuzzup($this: $name) { say \"WUZZUP $name?!\" }\n\n# object hashes, ones with complex keys\nmy $x = :{ (now) => \"when?\" };\n\n# longname\nsub infix:\u003Cya> { ... }\n\n# Specific uses of longnames\nuse Foo:from\u003CPerl5>;\n\n# Loop labels\nMYLABEL: for ^100 {\n  for ^200 {\n    last MYLABEL;\n  }\n}\n\n# Twigil for formal named param for a block (like $^x)\nsay { $:add ?? $^a + $^b !! $^a - $^b }( 4, 5 ) :!add\n\n# This one is a stretch...\n# Colons instead of dashes when you invoke cli commands that use MAIN\nsub MAIN ( :$filename ) { ... }\n\n# cmd --filename=file.txt\n# cmd :filename=file.txt\n# cmd :filename \\# filename => true\n",[6002,20125,20123],{"__ignoreMap":45},{"title":45,"searchDepth":15,"depth":15,"links":20127},[20128,20129,20130,20131,20132,20133,20134,20135],{"id":20056,"depth":56,"text":2628},{"id":20065,"depth":56,"text":2632},{"id":20074,"depth":56,"text":2636},{"id":20083,"depth":56,"text":2070},{"id":20092,"depth":56,"text":2643},{"id":20101,"depth":56,"text":2647},{"id":20110,"depth":56,"text":2651},{"id":20119,"depth":56,"text":2193},"2016-01-13T14:22-05:00",{},{"title":2623,"description":20044},"Perl6 Colons",[],"2017-07-23T00:35-04:00","vKOO9A8LMHluTO5Sf0CbVXqbeqXaWnXT8HUvMD_27AM",{"id":20144,"title":408,"body":20145,"createdAt":20356,"description":45,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":20357,"navigation":5976,"path":407,"seo":20358,"stem":20359,"tags":20360,"updatedAt":20361,"__hash__":20362},"content\u002FComments on Perl6 Colons.md",{"type":5822,"value":20146,"toc":20353},[20147,20150,20153,20156,20159,20162,20165,20172,20180,20202,20205,20208,20210,20213,20216,20219,20225,20228,20231,20249,20252,20259,20262,20264,20267,20276,20279,20281,20291,20294,20296,20299,20302,20304,20307,20310,20316,20324,20326,20329,20332,20334,20337,20345,20347,20350],[7710,20148,394],{"id":20149},"_9-comments",[5825,20151,20152],{},"Some uses I know of which do not appear to be in your list:",[5825,20154,20155],{},"say :: # Pseudopackage representing null namespace?",[5825,20157,20158],{},"say X::.keys # The package X treated as a hash",[5825,20160,20161],{},"42.Int::Int # Call Int method of Int class",[5825,20163,20164],{},"-> Numeric ::T \\x { say T }(42) # T takes value's type",[5825,20166,20167,20168,20171],{},"my regex foo { ",[20169,20170],"my",{}," $var; } # declare vars in regex scope",[5825,20173,20174,20175,20179],{},"my regex bar { a: b:? c:! :: ::> } # ",[5950,20176,20177],{"href":20177,"rel":20178},"http:\u002F\u002Fdesign.perl6.org\u002FS05.html#Backtracking_control",[5954]," (some of these implemented already, Larry says he plans to do more this year)",[5825,20181,20182,20183,20185,20186,20188,20189,20191,20192,20195,20191,20197,20199,20201],{},"Fwiw you're missing a lot of colon-pair syntax variations too, eg:",[6297,20184],{},"\nsay (:1day) # day => 1",[6297,20187],{},"\nsay (:!foo) # foo => False",[6297,20190],{},"\nmy @foo=1,2; say (:@foo) # foo => ",[5853,20193,20194],{},"1,2",[6297,20196],{},[5853,20198,20194],{},[6297,20200],{},"\nsay :16(\"dead\") # 57005",[5825,20203,20204],{},":)",[5825,20206,20207],{},"-- raiph 2016-01-21 05:03 UTC",[5829,20209],{},[5825,20211,20212],{},"A quick scan of some docs reminds me of:",[5825,20214,20215],{},"class :: is Int {...}   # :: stands for an anonymous class",[10262,20217,416],{"id":20218},"alternative-to-foo-passed-on-command-line",[5825,20220,20221,20222],{},"perl6 -e 'sub MAIN (:$foo) { say $foo }' ",[20223,20224],"foo",{},[5825,20226,20227],{},"And here's something I didn't already know:",[10262,20229,421],{"id":20230},"binding-pair-in-sig",[5825,20232,20233,20234,20236,20237,20239,20240,20242,20243,20245,20246,20248],{},"my $a;",[6297,20235],{},"\nsub b (",[20223,20238],{},"($a)! is rw) { $a = 42};",[6297,20241],{},"\nb(",[20223,20244],{},"($a));",[6297,20247],{},"\nsay $a # 42",[10262,20250,426],{"id":20251},"and-then-theres-all-the-specific-uses-of-longnames-like",[5825,20253,20254,20255],{},"use Foo:from",[20256,20257,20258],"perl5",{},";",[5825,20260,20261],{},"-- raiph 2016-01-21 05:50 UTC",[5829,20263],{},[5825,20265,20266],{},"Another one:",[5825,20268,20269,20270,20275],{},"say so \"a\" ~~ \u002F\u003C",[5853,20271,20272],{},[20273,20274],"alpha",{},">\u002F # Unicode character classes",[5825,20277,20278],{},"-- raiph 2016-01-21 08:27 UTC",[5829,20280],{},[5825,20282,20283,20284,20286,20287,20290],{},"How about the alternative method calling syntax;",[6297,20285],{},"\n@measurements.map:  { check_accuracy($",[5834,20288,20289],{},");  fail if $"," \u003C 0 }",[5825,20292,20293],{},"-- Marty 2016-03-01 10:44 UTC",[5829,20295],{},[5825,20297,20298],{},"Greetings Marty -- that last bit is covered as \"Precedence dropper\" in the misc section.",[5825,20300,20301],{},"-- awwaiid 2016-03-06 03:43 UTC",[5829,20303],{},[5825,20305,20306],{},"The compile-time variable ::?CLASS.",[5825,20308,20309],{},"E.g. the following are equivalent:",[6971,20311,20314],{"className":20312,"code":20313,"language":6976},[6974],"class TreeNode { has TreeNode @children; }\nclass TreeNode { has ::?CLASS @children; }\n",[6002,20315,20313],{"__ignoreMap":45},[5825,20317,19052,20318,20323],{},[5950,20319,20322],{"href":20320,"rel":20321},"http:\u002F\u002Fpostcircumfix.com",[5954],"smls"," 2016-08-26 08:30 UTC",[5829,20325],{},[5825,20327,20328],{},"That is a bizzaro variable.",[5825,20330,20331],{},"-- awwaiid 2016-09-05 00:45 UTC",[5829,20333],{},[5825,20335,20336],{},"Considering you can create your own slangs that mutate the language grammar... I'd say the number of colon uses is infinite.",[5825,20338,19052,20339,20344],{},[5950,20340,20343],{"href":20341,"rel":20342},"https:\u002F\u002Frakudo.party",[5954],"Zoffix"," 2017-07-22 14:39 UTC",[5829,20346],{},[5825,20348,20349],{},"Zoffix -- I think that is cheating a bit. I guess I'm looking more at the \"core\" language, assuming there is such a thing :)",[5825,20351,20352],{},"-- awwaiid 2017-07-22 15:37 UTC",{"title":45,"searchDepth":15,"depth":15,"links":20354},[20355],{"id":20149,"depth":56,"text":394},"2016-01-21T00:03-05:00",{},{"title":408,"description":45},"Comments on Perl6 Colons",[],"2017-07-22T11:37-04:00","JIk_xiXXFSWBiya1jpLywgKhnTaHn-h2jjEOQ5-F05s",{"id":20364,"title":4296,"body":20365,"createdAt":20388,"description":20389,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":20390,"navigation":5976,"path":4295,"seo":20391,"stem":20392,"tags":20393,"updatedAt":20394,"__hash__":20395},"content\u002FTLT - 2017.07.08 - Lignting Talk on Rakudo Colons.md",{"type":5822,"value":20366,"toc":20386},[20367,20373,20376],[5825,20368,20369,20370,20372],{},"I gave a lightning talk at The Perl Conference about my collection of ",[5950,20371,20139],{"href":2622},". Looks like Geoff gave me 34 extra seconds... not sure that I approve :)",[5825,20374,20375],{},"Enjoy!",[5825,20377,20378,20379],{},"[",[20380,20381],"iframe",{"width":20382,"height":20383,"src":20384,"frameBorder":15705,"allow":20385,"allowFullScreen":5976},560,315,"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FjsDElLlt9gQ](\u002Fyoutube:jsdelllt9gq)","accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture",{"title":45,"searchDepth":15,"depth":15,"links":20387},[],"2017-07-08T22:27-04:00","I gave a lightning talk at The Perl Conference about my collection of Perl6 Colons. Looks like Geoff gave me 34 extra seconds... not sure that I approve :)",{},{"title":4296,"description":20389},"TLT - 2017.07.08 - Lignting Talk on Rakudo Colons",[5980],"2017-07-08T22:28-04:00","SGk9unaZIMLHkiulwg8LOJuiNAgXO5jYWqcx_8O-svI",{"id":20397,"title":2159,"body":20398,"createdAt":20596,"description":2161,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":20597,"navigation":5976,"path":2158,"seo":20598,"stem":14683,"tags":20599,"updatedAt":20600,"__hash__":20601},"content\u002FMusic Gear and Setup.md",{"type":5822,"value":20399,"toc":20585},[20400,20402,20405,20413,20423,20433,20443,20455,20458,20461,20464,20470,20473,20482,20491,20497,20503,20506,20509,20512,20515,20517,20520,20522,20524,20530,20536,20542,20548,20554,20564,20567,20570,20576,20579],[5825,20401,2161],{},[6071,20403,2164],{"id":20404},"hardware",[5825,20406,20407,20412],{},[7247,20408,20409,7950],{},[5950,20410,20411],{"href":148},"Asus Zenbook Prime UX32VD"," My laptop, powerful enough for my needs",[5825,20414,20415,20422],{},[7247,20416,20417,7950],{},[5950,20418,20421],{"href":20419,"rel":20420},"http:\u002F\u002Fwww.alesis.com\u002Fio2express",[5954],"Alesis iO2 Express"," A 2-input USB recorder, effectively an internal soundcard. This is way better than the intel soundcard in my laptop, none of the noise or anything. It takes XLR inputs for microphones, and 1\u002F4\" plugs for guitar (or non-XLR mics). With this I can record two things at once... not as fancy as some other setups but it's been working great for me. Probably the biggest issue is that the USB adds a touch of latency (relative to PCI, Firewire, or ExpressCard).",[5825,20424,20425,20432],{},[7247,20426,20427,7950],{},[5950,20428,20431],{"href":20429,"rel":20430},"http:\u002F\u002Fwww.shure.com\u002Famericas\u002Fproducts\u002Fmicrophones\u002Fsm\u002Fsm57-instrument-microphone",[5954],"SM57 Microphone"," Industry standard apparently, I like mine very much.",[5825,20434,20435,20442],{},[7247,20436,20437,7950],{},[5950,20438,20441],{"href":20439,"rel":20440},"http:\u002F\u002Fwww.m-audio.com\u002Fproducts\u002Fen_us\u002FAxiom49New.html",[5954],"M-Audio Axiom 49 (v2) Midi Keyboard"," After doing a trial-run on a $20 Craig's List keyboard, I found one of these on sale. Works great, and has lots of knobs and sliders to play with. Besides the keyboard itself, the most enjoyable thing has been the 8 (velocity-sensitive) drum pads.",[5825,20444,20445,20448,20449,20454],{},[7247,20446,20447],{},"Instruments:"," Harmonicas, mainly ",[5950,20450,20453],{"href":20451,"rel":20452},"http:\u002F\u002Fwww.hohnerusa.com\u002Findex.php?8",[5954],"Hohner Special 20",". Acoustic guitar. Pots and pans. Semi-broken anglo concertina.",[6071,20456,2169],{"id":20457},"software",[5825,20459,20460],{},"This is where it starts getting complex. I think I'll just highlight the things that I use on a regular basis.",[5825,20462,20463],{},"I use Debian sid. Here's some stuff:",[6971,20465,20468],{"className":20466,"code":20467,"language":6976},[6974],"# Jack stuff\napt install jackd jack-tools jack-keyboard qjackctl pulseaudio-module-jack a2jmidid patchage\n\n# PulseAudio helpers\napt install pulseaudio pulseaudio-module-jack pavucontrol pulseaudio-utils\n\n# Synths\napt install zynaddsubfx qsynth fluid-soundfont-gm fluid-soundfont-gs\n\n# Ardour, mixing\napt install ardour3 swh-lv2 calf-plugins tap-plugins\n\n# Monitor & Visualize\napt install meterbridge freqtweak\n\n# Overtone\napt install clojure1.4 leiningen\n\n# Misc\napt install audacity vorbis-tools vlc\n",[6002,20469,20467],{"__ignoreMap":45},[7710,20471,2174],{"id":20472},"jackd",[5825,20474,20475,20476,20481],{},"Linux \u002F Open Source music generally follows the unix philosophy of having many tools and open protocols to get them working together. With the command line, that's often sockets and pipes. In linux the main thing is ",[5950,20477,20480],{"href":20478,"rel":20479},"http:\u002F\u002Fjackaudio.org\u002F",[5954],"Jack",". Jack is basically a software patch-board, allowing you to connect one program to another, so long as they know how to talk to Jack.",[5825,20483,20484,20485,20487,20490],{},"Jack-related software:",[6297,20486],{},[7247,20488,20489],{},"qjackctl:"," GUI for jack daemon configuration and jack sessions.",[5825,20492,20493,20496],{},[7247,20494,20495],{},"patchage:"," GUI for jack connections.",[5825,20498,20499,20502],{},[7247,20500,20501],{},"a2jmidid:"," Turn Alsa midi devices into jack midi.",[7710,20504,140],{"id":20505},"ardour",[5825,20507,20508],{},"I used Audacity for quite a while, but recently got turned on to Ardour. What a fantastic program! I'm using the Ardour3, using it as a multi-track non-destructive editor, mixer, and even midi sequencer a bit.",[5825,20510,20511],{},"I've also been using this as the main mixing\u002Fmastering tool, hooking it in to filters. I like the LV2 calf plugins, like reverb, compression, etc.",[7710,20513,2183],{"id":20514},"hydrogen",[5825,20516,2185],{},[7710,20518,2188],{"id":20519},"overtone",[5825,20521,2190],{},[7710,20523,2193],{"id":20119},[5825,20525,20526,20529],{},[7247,20527,20528],{},"qsynth:"," Nice wrapper for fluidsynth, renders midi using soundfonts.",[5825,20531,20532,20535],{},[7247,20533,20534],{},"Audacity:"," Good for doing quick file conversions.",[5825,20537,20538,20541],{},[7247,20539,20540],{},"zynaddsubfx:"," Super powerful synthesizer (forked as yoshimi, I use that sometimes).",[5825,20543,20544,20547],{},[7247,20545,20546],{},"non tools:"," non-daw, non-mixer, non-sequencer ... lightweight DAW related tools.",[5825,20549,20550,20553],{},[7247,20551,20552],{},"Seq24:"," This is a fun midi sequencer that I've played with.",[5825,20555,20556,20563],{},[7247,20557,20558,7950],{},[5950,20559,20562],{"href":20560,"rel":20561},"http:\u002F\u002Fcharlie-roberts.com\u002FControl\u002F",[5954],"Control"," Opensource Android application for OSC UI.",[6071,20565,2198],{"id":20566},"configuration-and-helper-scripts",[5825,20568,20569],{},"I have one script named 'musicstuff.sh' what gets things going, primarily Jack. I plug in my hardware first, then fire it up. It differentiates between when I run in laptop-only mode and when I run with my io2 plugged in. I created those two profiles manually in qjackctl and saved them with the given names.",[6971,20571,20574],{"className":20572,"code":20573,"language":6976},[6974],"# Jack GUI and jackd itself\nif grep -q io2 \u002Fproc\u002Fasound\u002Fcards ; then\n  echo \"Running with iO2\"\n  qjackctl -s -p io2normal &\nelse\n  echo \"Running with onboard sound\"\n  qjackctl -s -p laptopmode &\nfi\n\n# Give jack a few seconds to get started\nsleep 3\n\n# PulseAudio -> Jack\npacmd load-module module-jack-source channels=2\npacmd load-module module-jack-sink channels=2\npacmd set-default-sink jack_out\n\n# Nice GUI connection manager\npatchage -A &\n\n# Magical bridge between legacy ALSA midi and jack\na2jmidid -e &\n",[6002,20575,20573],{"__ignoreMap":45},[5825,20577,20578],{},"I also have a shut down script (triggered from qjackctl), which just undoes the PulseAudio -> Jack:",[6971,20580,20583],{"className":20581,"code":20582,"language":6976},[6974],"pacmd set-default-sink 0\npactl unload-module module-jack-sink\npactl unload-module module-jack-source\n",[6002,20584,20582],{"__ignoreMap":45},{"title":45,"searchDepth":15,"depth":15,"links":20586},[20587,20588,20595],{"id":20404,"depth":15,"text":2164},{"id":20457,"depth":15,"text":2169,"children":20589},[20590,20591,20592,20593,20594],{"id":20472,"depth":56,"text":2174},{"id":20505,"depth":56,"text":140},{"id":20514,"depth":56,"text":2183},{"id":20519,"depth":56,"text":2188},{"id":20119,"depth":56,"text":2193},{"id":20566,"depth":15,"text":2198},"2011-08-27T10:13-04:00",{},{"title":2159,"description":2161},[6271],"2017-06-02T21:50-04:00","IBko9HTyi9RjzGbfvS4mS_cubAJLTEJCOB1yoQ_DZuI",{"id":20603,"title":4291,"body":20604,"createdAt":20620,"description":20608,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":20621,"navigation":5976,"path":4290,"seo":20622,"stem":20623,"tags":20624,"updatedAt":20620,"__hash__":20625},"content\u002FTLT - 2017.05.21 - Core Logic.md",{"type":5822,"value":20605,"toc":20618},[20606,20609,20612,20615],[5825,20607,20608],{},"There are many tools in my programming toolbox, but one that I've felt is missing is constraint and logic programming. I've done a spot of Prolog and played with some inference systems of various types ... but even when I run into something where I think it's the right hammer... I don't have a go-to tool.",[5825,20610,20611],{},"I got The Reasoned Schemer a while back, hoping to use it to learn clojure's core.logic or similar, but the writing still KILLS me. Hate it so much. It is like the worst extreme sort of Socratic Method that I can imagine, literally everything has two columns of question and answer. But the QUESTIONS are obtuse! Working through it that way is not the sort of enlightenment that I'm going for ... I don't want to apply a unification algorithm on my understanding of logic programming with the contents of the book! The programming system might be \"backwards\" that way, but my way of learning isn't.",[5825,20613,20614],{},"Anyway. One dumb thing that I had a hard time getting over was things ending in -o, like conso and emptyo. But tonight I had a breakthrough! See those 'o' things, according to the internets, are supposed to be sort of like question-marks except describing a goal. So now if I read the 'o' as '-objective' (as in, \"goal\") then they sound much better. cons-objective, empty-objective. Declaring the goal of the statement.",[5825,20616,20617],{},"I guess I should go back and try reading The Reasoned Schemer with that in mind, and see if it makes me less angry :)",{"title":45,"searchDepth":15,"depth":15,"links":20619},[],"2017-05-21T23:46-04:00",{},{"title":4291,"description":20608},"TLT - 2017.05.21 - Core Logic",[5980],"Hvix7HEOSwqsXDOpyb7SMbi4-kvdM9Tv6015k6h-jpA",{"id":20627,"title":2800,"body":20628,"createdAt":20786,"description":20634,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":20787,"navigation":5976,"path":2799,"seo":20788,"stem":2800,"tags":20789,"updatedAt":20790,"__hash__":20791},"content\u002FRandori.md",{"type":5822,"value":20629,"toc":20780},[20630,20635,20641,20647,20650,20682,20685,20711,20714,20753,20756],[5825,20631,20632],{},[7706,20633,20634],{},"\"Pair Programming Musical Chairs\"",[5825,20636,20637,20638,20640],{},"Apparently a ",[6002,20639,2800],{}," is a form of martial arts training where the students take turns sparring with the instructor. In the context of programming, it's a form of pair programming where the pairs rotate every few minutes, and everyone is working on the same problem together. It's a great way to learn from others, and to teach others, and to get a feel for how different people approach problems.",[5825,20642,20643,20644],{},"Also it is ",[7247,20645,20646],{},"SUPER FUN!!!",[6071,20648,2805],{"id":20649},"roles",[6013,20651,20652,20658,20664,20670,20676],{},[6016,20653,20654,20657],{},[10084,20655,20656],{},"Driver"," -- One person at the keyboard. Don't think, just type (maybe syntax-level -- write a function, extract a method, if they know the language). Only does what the Navigator tells them to do.",[6016,20659,20660,20663],{},[10084,20661,20662],{},"Navigator"," -- Sit next to the driver and direct them. Can also ask the choir\u002Fqueue for advice, especially if they aren't familiar with the technology being used",[6016,20665,20666,20669],{},[10084,20667,20668],{},"Choir"," -- Everyone else, watching and kibitzing as appropriate and helpful to the Navigator",[6016,20671,20672,20675],{},[10084,20673,20674],{},"Audience"," -- Passive watchers who aren't actively participating. Ideally used if you run out of space in the Choir, and ideally they keep their thoughts to themselves until they join the Choir :)",[6016,20677,20678,20681],{},[10084,20679,20680],{},"Bonus role: Guide"," -- this person knows the tech and guides the current Navigator, teaching the whole group through the guidance",[6071,20683,2810],{"id":20684},"physical-setup",[6013,20686,20687,20690,20702,20708],{},[6016,20688,20689],{},"A screen that everyone can see that is projecting from a computer",[6016,20691,20692,20693,7881,20695,20697,20698,20701],{},"Computer on a table with two chairs, off to the side. This is where the ",[10084,20694,20656],{},[10084,20696,20662],{}," sit, so they can see the screen and the ",[10084,20699,20700],{},"Choir-Queue"," can hear them.",[6016,20703,20704,20705,20707],{},"Row of chairs for the ",[10084,20706,20700],{},", facing the screen",[6016,20709,20710],{},"More chairs behind that for the general passive audience",[6071,20712,2815],{"id":20713},"process",[6013,20715,20716,20719,20747,20750],{},[6016,20717,20718],{},"Group picks a problem with specific goals \u002F strategy (or one is provided by moderator)",[6016,20720,20721,20722,20725],{},"After a fixed amount of time (3-5mins) or event (red\u002Fgreen\u002Frefactor) everyone ",[5834,20723,20724],{},"ROTATES!",[6013,20726,20727,20730,20733,20738,20741,20744],{},[6016,20728,20729],{},"Joyously shout \"ROTATE!\"",[6016,20731,20732],{},"Everyone stands up",[6016,20734,20735,20736],{},"Driver heads over to the end of the ",[10084,20737,20700],{},[6016,20739,20740],{},"Navigator becomes Driver",[6016,20742,20743],{},"First chair in the Choir-Queue becomes Navigator",[6016,20745,20746],{},"Everyone in Choir moves down a chair, making room for the previous Driver!",[6016,20748,20749],{},"Do this for a while (1-2 hours maybe, or a nice stopping point) and then everyone reviews",[6016,20751,20752],{},"This works well with toy problems and small challenges. I've done it with command-line games especially, but other things also like going through a tutorial or one time we built a Christmas Tree out of pure CSS and a few divs.",[6071,20754,2820],{"id":20755},"questions",[6013,20757,20758,20766],{},[6016,20759,20760,20761],{},"What if I have a lot of participants?\n",[6013,20762,20763],{},[6016,20764,20765],{},"Since each rotation is 3-5 minutes, this starts running out of scale at 8-10 participants. You can additionally have an audience, folks sitting in the back who are passive watchers learning and observing. You could leave an empty seat in the choir for people to join\u002Fdepart. The longer the Randori the more people can participate, of course, but it can't last forever :)",[6016,20767,20768,20769],{},"What if I have some people who are shy, who don't want to program publicly?\n",[6013,20770,20771,20774,20777],{},[6016,20772,20773],{},"That's ok! It's cool to hang out in the audience and watch from afar",[6016,20775,20776],{},"Set the tone of friendly enthusiasm and you will find it to be contagious :)",[6016,20778,20779],{},"Remember to let folks know that they are NEVER alone, and at no point are they solely responsible for what is happening; the overall hive mind is working together",{"title":45,"searchDepth":15,"depth":15,"links":20781},[20782,20783,20784,20785],{"id":20649,"depth":15,"text":2805},{"id":20684,"depth":15,"text":2810},{"id":20713,"depth":15,"text":2815},{"id":20755,"depth":15,"text":2820},"2017-04-26T15:37-04:00",{},{"title":2800,"description":20634},[],"2017-05-18T11:31-04:00","1eWb_R8YPR9dnw8GBStru4vnXFZ5N1DsRD-K8w3qZqQ",{"id":20793,"title":5689,"body":20794,"createdAt":20827,"description":20828,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":20829,"navigation":5976,"path":5688,"seo":20830,"stem":15107,"tags":20831,"updatedAt":20827,"__hash__":20832},"content\u002FWhite Roses.md",{"type":5822,"value":20795,"toc":20825},[20796,20802,20810,20813],[5825,20797,17953,20798,6241,20800,6259],{},[6237,20799],{"controls":5976,"preload":6239,"src":15112},[5950,20801,6245],{"download":15115,"external":45,"href":15112},[5825,20803,20804,20805,17963,20807,17969],{},"Artist: Brock Wilcox, Sacha",[6297,20806],{},[5950,20808,17968],{"href":17966,"rel":20809},[5954],[5825,20811,20812],{},"Chords:",[5825,20814,20815,20816,20818,20819,20821,20822,20824],{},"AGDE",[6297,20817],{},"\nAGDE",[6297,20820],{},"\nACFG",[6297,20823],{},"\nDEBC",{"title":45,"searchDepth":15,"depth":15,"links":20826},[],"2017-04-13T23:06-04:00","Listen:  (download)",{},{"title":5689,"description":20828},[6271],"Hidnz28OcUsoWe62WxrTJWk9crQH-C10r_TKF4T7Ayc",{"id":20834,"title":4286,"body":20835,"createdAt":20856,"description":20857,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":20858,"navigation":5976,"path":4285,"seo":20859,"stem":20860,"tags":20861,"updatedAt":20862,"__hash__":20863},"content\u002FTLT - 2017.04.10 - VimWiki Gateway.md",{"type":5822,"value":20836,"toc":20854},[20837,20845,20851],[5825,20838,20839,20840,20844],{},"I've been having lots of fun with ",[5950,20841,20842],{"href":20842,"rel":20843},"https:\u002F\u002Fgithub.com\u002Fvimwiki\u002Fvimwiki",[5954]," lately! I've mixed in a bit of encryptfs to have a private directory of notes. Sometime during boot, I set it up with:",[6971,20846,20849],{"className":20847,"code":20848,"language":6976},[6974],"sudo mount -t ecryptfs \\\n  -o key=passphrase,ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_passthrough=no,ecryptfs_enable_filename_crypto=yes,ecryptfs_fnek_sig=1a9380706fdf5bce \\\n  ~\u002Fdocs\u002Fprivate\u002Fvimwiki ~\u002Fnotes\n",[6002,20850,20848],{"__ignoreMap":45},[5825,20852,20853],{},"I haven't done much customization yet. But one thing I'm playing with now is making it easy to post notes from VimWiki directly onto my website.",{"title":45,"searchDepth":15,"depth":15,"links":20855},[],"2017-04-10T10:30-04:00","I've been having lots of fun with https:\u002F\u002Fgithub.com\u002Fvimwiki\u002Fvimwiki lately! I've mixed in a bit of encryptfs to have a private directory of notes. Sometime during boot, I set it up with:",{},{"title":4286,"description":20857},"TLT - 2017.04.10 - VimWiki Gateway",[5980],"2017-04-10T11:11-04:00","3IRfnYXyOYqKgkgLkduCO6hOG7xIOBnWreze29qyXjM",{"id":20865,"title":1480,"body":20866,"createdAt":20965,"description":20828,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":20966,"navigation":5976,"path":1479,"seo":20967,"stem":1480,"tags":20968,"updatedAt":20969,"__hash__":20970},"content\u002FGitmo.md",{"type":5822,"value":20867,"toc":20962},[20868,20874,20881,20884,20896,20908,20916,20928,20936,20946,20948,20951],[5825,20869,17953,20870,6241,20872,6259],{},[6237,20871],{"controls":5976,"preload":6239,"src":14936},[5950,20873,6245],{"download":14939,"external":45,"href":14936},[5825,20875,17960,20876,17963,20878,17969],{},[6297,20877],{},[5950,20879,17968],{"href":17966,"rel":20880},[5954],[6071,20882,300],{"id":20883},"lyrics",[5825,20885,20886,20887,20889,20890,20892,20893,20895],{},"President Obama",[6297,20888],{},"\nYou know you wanna",[6297,20891],{},"\nGet rid of Gitmo",[6297,20894],{},"\nLet all those people go",[5825,20897,20898,20899,20901,20902,20904,20905,20907],{},"Maximum security",[6297,20900],{},"\nThat's good enough for me",[6297,20903],{},"\nDo it for society",[6297,20906],{},"\nTry them now or set them free",[5825,20909,20886,20910,20889,20912,20892,20914,20895],{},[6297,20911],{},[6297,20913],{},[6297,20915],{},[5825,20917,20918,20919,20921,20922,20924,20925,20927],{},"We have come too far",[6297,20920],{},"\nFor this to be who we are",[6297,20923],{},"\nShow the world we know",[6297,20926],{},"\n107 left to go",[5825,20929,20898,20930,20901,20932,20904,20934,20907],{},[6297,20931],{},[6297,20933],{},[6297,20935],{},[5825,20937,20886,20938,20940,20941,20892,20943,20945],{},[6297,20939],{},"\nWhen are you gonna",[6297,20942],{},[6297,20944],{},"\nLet all those people go!",[5829,20947],{},[5825,20949,20950],{},"Alternate verses",[5825,20952,20953,20954,20956,20957,20924,20959,20961],{},"We're the USA",[6297,20955],{},"\nLeader for today",[6297,20958],{},[6297,20960],{},"\nLet those people go",{"title":45,"searchDepth":15,"depth":15,"links":20963},[20964],{"id":20883,"depth":15,"text":300},"2017-02-16T13:32-05:00",{},{"title":1480,"description":20828},[6271],"2017-02-16T13:37-05:00","vPk2jxlBrZAediDqsA3GHNjiz1wJqZB-yoRGdpB1mBM",{"id":20972,"title":4281,"body":20973,"createdAt":21014,"description":21015,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":21016,"navigation":5976,"path":4280,"seo":21017,"stem":21018,"tags":21019,"updatedAt":21020,"__hash__":21021},"content\u002FTLT - 2017.01.11 - Slack Hash Store.md",{"type":5822,"value":20974,"toc":21012},[20975,20989,20995,20998],[5825,20976,20977,20978,20983,20984,20988],{},"Last night at the ",[5950,20979,20982],{"href":20980,"rel":20981},"https:\u002F\u002Fwww.meetup.com\u002FDC-Perl-Mongers\u002F",[5954],"DC Perl Mongers meetup"," we collaboratively built a proof-of-concept for storing key\u002Fvalue pairs as messages in a slack channel, ",[5950,20985,20986],{"href":20986,"rel":20987},"https:\u002F\u002Fgithub.com\u002Fplicease\u002Fglobalhash",[5954],". This was made straightforward by great Slack API docs and cpan:WebService::Slack::WebApi. Example usage:",[6971,20990,20993],{"className":20991,"code":20992,"language":6976},[6974],"# writes \"hello=world\" into the #globalhash channel\n$ globalhash set hello world\n\n# reads the #globalhash channel for the most\n# recent value of hello and prints it\n$ globalhash get hello\nworld\n",[6002,20994,20992],{"__ignoreMap":45},[5825,20996,20997],{},"There are of course a TON of things you could do from here. Some ideas:",[6013,20999,21000,21003,21006,21009],{},[6016,21001,21002],{},"More features: list of keys, delete, complex values, binary values, value history",[6016,21004,21005],{},"Clean implementation and better usage\u002Ferror messaging, docs",[6016,21007,21008],{},"Port to other languages -- perl6 and still using the perl5 module would be fun",[6016,21010,21011],{},"Register as a slack app that anyone can use, fix up OAuth or whatever",{"title":45,"searchDepth":15,"depth":15,"links":21013},[],"2017-01-11T09:00-05:00","Last night at the DC Perl Mongers meetup we collaboratively built a proof-of-concept for storing key\u002Fvalue pairs as messages in a slack channel, https:\u002F\u002Fgithub.com\u002Fplicease\u002Fglobalhash. This was made straightforward by great Slack API docs and cpan:WebService::Slack::WebApi. Example usage:",{},{"title":4281,"description":21015},"TLT - 2017.01.11 - Slack Hash Store",[5980],"2017-01-18T08:27-05:00","iuknoDv973vh7pvhKSYOY-zFyqAs-AQJjDlsgeYVck8",{"id":21023,"title":1901,"body":21024,"createdAt":21199,"description":21200,"draft":5972,"extension":5973,"image":5974,"mastodonThread":5974,"meta":21201,"navigation":5976,"path":1900,"seo":21202,"stem":21203,"tags":21204,"updatedAt":21199,"__hash__":21205},"content\u002FLinks TODO.md",{"type":5822,"value":21025,"toc":21197},[21026,21035,21044,21053,21062,21071,21080,21089,21098,21107,21116,21125,21134,21143,21152,21161,21170,21179,21188],[5825,21027,21028,21029,21031],{},"Martin Prescher, CTO, AutoGravity - Scrapping the Monolith",[6297,21030],{},[5950,21032,21033],{"href":21033,"rel":21034},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Feoiit75e8p",[5954],[5825,21036,21037,21038,21040],{},"Eliot Horowitz, CTO, MongoDB - Coding Time for Managers",[6297,21039],{},[5950,21041,21042],{"href":21042,"rel":21043},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fbqk2yj6mni",[5954],[5825,21045,21046,21047,21049],{},"Liz Crawford, ex-CTO, Birchbox - How to Build a Product Team",[6297,21048],{},[5950,21050,21051],{"href":21051,"rel":21052},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002F006f3skx41",[5954],[5825,21054,21055,21056,21058],{},"Jean-Michel Lemieux, SVP Engineering, Shopify - Post Traumatic Agile Syndrome",[6297,21057],{},[5950,21059,21060],{"href":21060,"rel":21061},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fa44b80zoyi",[5954],[5825,21063,21064,21065,21067],{},"Ilia Papas, CTO & Founder, Blue Apron - Scaling your team before people know you're a tech company",[6297,21066],{},[5950,21068,21069],{"href":21069,"rel":21070},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fgg7g3r2h1d",[5954],[5825,21072,21073,21074,21076],{},"Jeff Smith, Manager, Tech, x.ai - Bringing Data Scientists and Engineers Together",[6297,21075],{},[5950,21077,21078],{"href":21078,"rel":21079},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Ft61jczn2iy",[5954],[5825,21081,21082,21083,21085],{},"Daniel Doubrovkine, CTO, Artsy - Inspiring Team Leads to Give Away Their Legos",[6297,21084],{},[5950,21086,21087],{"href":21087,"rel":21088},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fxo6uw6v4fm",[5954],[5825,21090,21091,21092,21094],{},"Johnny Austin, Senior Engineering Manager, Social Tables - Diversity as a Means to Profitability",[6297,21093],{},[5950,21095,21096],{"href":21096,"rel":21097},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fbycwn9rwj8",[5954],[5825,21099,21100,21101,21103],{},"Debbie Madden, CEO, Stride - The Top 5 Secrets to Stop Engineering & Product Inter-Team Communication Breakdown",[6297,21102],{},[5950,21104,21105],{"href":21105,"rel":21106},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fufj8thiobq",[5954],[5825,21108,21109,21110,21112],{},"Will Ballard, CTO, Gerson Lehrman Group - Real Engineering Value Metrics",[6297,21111],{},[5950,21113,21114],{"href":21114,"rel":21115},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002F67o33fzgiq",[5954],[5825,21117,21118,21119,21121],{},"Adam Jonas, MD of Engineering, Flatiron School - Overcoming Ourselves: Firing One of Our Own",[6297,21120],{},[5950,21122,21123],{"href":21123,"rel":21124},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fejf4tmn5h5",[5954],[5825,21126,21127,21128,21130],{},"Dustin Lucien, COO (ex-CTO), Betterment - Nimble Project Planning and Execution",[6297,21129],{},[5950,21131,21132],{"href":21132,"rel":21133},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002F23smwsq1d9",[5954],[5825,21135,21136,21137,21139],{},"Andrea Goulet, CEO, Corgibytes - Makers vs. Menders",[6297,21138],{},[5950,21140,21141],{"href":21141,"rel":21142},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002F82l99hvnj3",[5954],[5825,21144,21145,21146,21148],{},"Damion Hankejh, CTO and Founder, Ingk - The Jeopardies of Cognitive Computing",[6297,21147],{},[5950,21149,21150],{"href":21150,"rel":21151},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fr02ejnrrqm",[5954],[5825,21153,21154,21155,21157],{},"Griffin Caprio, Dir Eng, Enova - Engineering at Scale: Running a 100+ person team",[6297,21156],{},[5950,21158,21159],{"href":21159,"rel":21160},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fta42qetgj5",[5954],[5825,21162,21163,21164,21166],{},"Jeff Casimir, Executive Director, The Turing School of Software and Design - New Ideas on Compensation",[6297,21165],{},[5950,21167,21168],{"href":21168,"rel":21169},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fuhw46qblqq",[5954],[5825,21171,21172,21173,21175],{},"Will Maier, VP Eng, Simple - You Should Build Distributed Teams",[6297,21174],{},[5950,21176,21177],{"href":21177,"rel":21178},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fdfbtv9vhke",[5954],[5825,21180,21181,21182,21184],{},"Lisa van Gelder, VP Eng, Stride - Burnout Isn't Just Overwork",[6297,21183],{},[5950,21185,21186],{"href":21186,"rel":21187},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fcokjtjrsvt",[5954],[5825,21189,21190,21191,21193],{},"Albert Wenger, Managing Partner, Union Square Ventures - Some Questions about the Future of Code",[6297,21192],{},[5950,21194,21195],{"href":21195,"rel":21196},"https:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Fo97gtyrpgj",[5954],{"title":45,"searchDepth":15,"depth":15,"links":21198},[],"2016-12-20T16:15-05:00","Martin Prescher, CTO, AutoGravity - Scrapping the Monolithhttps:\u002F\u002Fpbell.wistia.com\u002Fmedias\u002Feoiit75e8p",{},{"title":1901,"description":21200},"Links TODO",[],"Yve4IRnN9jx6fmywLfc_ZS4rTF5ItHFim_eDHDKG6XQ",1791636464211]