[{"data":1,"prerenderedAt":2954},["ShallowReactive",2],{"content-/cperez/2026-06-30/how-ceos-should-evaluate-ai-investments":3},{"article":4,"all":1996},{"_path":5,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":9,"description":10,"publishDate":6,"image":11,"author":12,"tags":15,"excerpt":10,"body":21,"_type":1990,"_id":1991,"_source":1992,"_file":1993,"_stem":1994,"_extension":1995},"/cperez/2026-06-30/how-ceos-should-evaluate-ai-investments","2026-06-30",false,"","How Should CEOs Evaluate AI Investments?","CEOs should evaluate AI investments by asking whether the investment improves a measurable business outcome, changes a real workflow, keeps humans appropriately involved, has a realistic path to production, and creates value that outweighs cost and risk.","/cperez/2026-06-30/img/how-ceos-should-evaluate-ai-investments.jpg",{"name":13,"user":14},"Carlos Perez","cperez",[16,17,18,19,20],"agentic ai","ai investment","humans in the loop","ai","software development",{"type":22,"children":23,"toc":1954},"root",[24,31,44,49,54,59,66,71,212,217,223,228,233,249,261,266,271,277,282,287,292,337,342,347,352,357,362,368,373,378,501,506,511,517,522,527,532,537,542,595,600,605,615,620,626,631,636,641,646,689,694,707,713,718,723,736,741,746,799,811,816,821,827,832,837,847,852,857,862,867,873,878,883,888,897,902,907,913,918,923,928,937,942,947,952,957,963,968,981,986,991,1000,1005,1010,1016,1021,1026,1031,1124,1134,1139,1145,1150,1155,1168,1173,1178,1183,1188,1193,1203,1208,1214,1219,1224,1229,1234,1247,1252,1257,1310,1315,1320,1326,1331,1336,1341,1480,1485,1495,1505,1511,1516,1526,1536,1546,1556,1561,1566,1572,1577,1651,1656,1661,1667,1672,1740,1745,1751,1756,1761,1771,1781,1791,1796,1801,1806,1811,1817,1822,1827,1832,1837,1843,1850,1855,1861,1866,1872,1877,1883,1888,1894,1899,1905,1910,1916,1921,1927,1932,1938,1943,1949],{"type":25,"tag":26,"props":27,"children":28},"element","p",{},[29],{"type":30,"value":10},"text",{"type":25,"tag":26,"props":32,"children":33},{},[34,36,42],{"type":30,"value":35},"The best AI investments are not simply tool purchases; they are ",{"type":25,"tag":37,"props":38,"children":39},"strong",{},[40],{"type":30,"value":41},"business capability investments",{"type":30,"value":43},". That means the question is not just “Can AI do this?” It is: “Can we build, integrate, govern, and maintain an AI-enabled system that makes the business meaningfully better?”",{"type":25,"tag":26,"props":45,"children":46},{},[47],{"type":30,"value":48},"That distinction matters.",{"type":25,"tag":26,"props":50,"children":51},{},[52],{"type":30,"value":53},"AI can summarize documents, draft content, analyze data, generate code, classify requests, and recommend next steps. But those capabilities do not become business value on their own. They become valuable when they are designed into real software systems, connected to real workflows, monitored by real people, and supported by engineers who understand what the system is doing and why.",{"type":25,"tag":26,"props":55,"children":56},{},[57],{"type":30,"value":58},"At Art+Logic, we think that distinction is critical. AI can accelerate parts of the software process, but it does not replace software engineering. Code generated with AI still needs architecture, review, testing, security, maintainability, documentation, and ownership. A model can suggest code, but it cannot be responsible for the code; that responsibility still belongs to people.",{"type":25,"tag":60,"props":61,"children":63},"h3",{"id":62},"the-ceo-ai-investment-framework",[64],{"type":30,"value":65},"The CEO AI Investment Framework",{"type":25,"tag":26,"props":67,"children":68},{},[69],{"type":30,"value":70},"A practical AI investment review should cover six areas:",{"type":25,"tag":72,"props":73,"children":74},"table",{},[75,99],{"type":25,"tag":76,"props":77,"children":78},"thead",{},[79],{"type":25,"tag":80,"props":81,"children":82},"tr",{},[83,89,94],{"type":25,"tag":84,"props":85,"children":86},"th",{},[87],{"type":30,"value":88},"Evaluation Area",{"type":25,"tag":84,"props":90,"children":91},{},[92],{"type":30,"value":93},"CEO Question",{"type":25,"tag":84,"props":95,"children":96},{},[97],{"type":30,"value":98},"Why It Matters",{"type":25,"tag":100,"props":101,"children":102},"tbody",{},[103,122,140,158,176,194],{"type":25,"tag":80,"props":104,"children":105},{},[106,112,117],{"type":25,"tag":107,"props":108,"children":109},"td",{},[110],{"type":30,"value":111},"Business value",{"type":25,"tag":107,"props":113,"children":114},{},[115],{"type":30,"value":116},"What measurable outcome will improve?",{"type":25,"tag":107,"props":118,"children":119},{},[120],{"type":30,"value":121},"AI should connect to revenue, cost, speed, quality, risk, or customer value.",{"type":25,"tag":80,"props":123,"children":124},{},[125,130,135],{"type":25,"tag":107,"props":126,"children":127},{},[128],{"type":30,"value":129},"Workflow fit",{"type":25,"tag":107,"props":131,"children":132},{},[133],{"type":30,"value":134},"What process changes if this succeeds?",{"type":25,"tag":107,"props":136,"children":137},{},[138],{"type":30,"value":139},"AI creates value when it changes how work gets done, not when it sits beside existing work.",{"type":25,"tag":80,"props":141,"children":142},{},[143,148,153],{"type":25,"tag":107,"props":144,"children":145},{},[146],{"type":30,"value":147},"Data readiness",{"type":25,"tag":107,"props":149,"children":150},{},[151],{"type":30,"value":152},"Is the data accurate, accessible, secure, and usable?",{"type":25,"tag":107,"props":154,"children":155},{},[156],{"type":30,"value":157},"Poor data quality can stop AI projects from scaling.",{"type":25,"tag":80,"props":159,"children":160},{},[161,166,171],{"type":25,"tag":107,"props":162,"children":163},{},[164],{"type":30,"value":165},"Human oversight",{"type":25,"tag":107,"props":167,"children":168},{},[169],{"type":30,"value":170},"Where do people need to review, approve, override, or understand AI output?",{"type":25,"tag":107,"props":172,"children":173},{},[174],{"type":30,"value":175},"Humans need to stay accountable for high-impact decisions and production software.",{"type":25,"tag":80,"props":177,"children":178},{},[179,184,189],{"type":25,"tag":107,"props":180,"children":181},{},[182],{"type":30,"value":183},"Governance and risk",{"type":25,"tag":107,"props":185,"children":186},{},[187],{"type":30,"value":188},"What could go wrong, and who owns it?",{"type":25,"tag":107,"props":190,"children":191},{},[192],{"type":30,"value":193},"AI needs clear boundaries, especially when it affects customers, decisions, or regulated processes.",{"type":25,"tag":80,"props":195,"children":196},{},[197,202,207],{"type":25,"tag":107,"props":198,"children":199},{},[200],{"type":30,"value":201},"Scale economics",{"type":25,"tag":107,"props":203,"children":204},{},[205],{"type":30,"value":206},"What will this cost to operate in production?",{"type":25,"tag":107,"props":208,"children":209},{},[210],{"type":30,"value":211},"Pilot costs rarely reflect the full cost of a reliable AI capability.",{"type":25,"tag":26,"props":213,"children":214},{},[215],{"type":30,"value":216},"This framework helps CEOs separate promising AI investments from expensive distractions.",{"type":25,"tag":60,"props":218,"children":220},{"id":219},"why-should-ceos-treat-ai-as-a-software-investment",[221],{"type":30,"value":222},"Why Should CEOs Treat AI as a Software Investment?",{"type":25,"tag":26,"props":224,"children":225},{},[226],{"type":30,"value":227},"CEOs should treat AI as a software investment because AI only creates durable value when it is embedded into systems people can trust, use, and maintain.",{"type":25,"tag":26,"props":229,"children":230},{},[231],{"type":30,"value":232},"A standalone AI tool may help an individual employee work faster. A custom AI-enabled system can reshape a workflow, connect to existing business data, support governance, and create a repeatable capability.",{"type":25,"tag":26,"props":234,"children":235},{},[236,238,247],{"type":30,"value":237},"That is where an experienced software development firm can add value. At Art+Logic, we see AI work as part of custom AI-driven software that can automate workflows, surface key trends, translate natural language into system actions, parse and summarize documents, and accelerate asset generation, including code, copy, and media. (",{"type":25,"tag":239,"props":240,"children":244},"a",{"href":241,"rel":242},"https://artandlogic.com/ai/",[243],"nofollow",[245],{"type":30,"value":246},"Art+Logic",{"type":30,"value":248},")",{"type":25,"tag":26,"props":250,"children":251},{},[252,254,259],{"type":30,"value":253},"The important word there is ",{"type":25,"tag":37,"props":255,"children":256},{},[257],{"type":30,"value":258},"software",{"type":30,"value":260},".",{"type":25,"tag":26,"props":262,"children":263},{},[264],{"type":30,"value":265},"AI is not useful because it is impressive in isolation. It is useful when it is designed into the right product, interface, workflow, database, integration, permission model, testing process, and operating environment.",{"type":25,"tag":26,"props":267,"children":268},{},[269],{"type":30,"value":270},"That is the difference between a demo and a system the business can depend on.",{"type":25,"tag":60,"props":272,"children":274},{"id":273},"why-should-ai-investments-start-with-business-outcomes",[275],{"type":30,"value":276},"Why Should AI Investments Start With Business Outcomes?",{"type":25,"tag":26,"props":278,"children":279},{},[280],{"type":30,"value":281},"AI investments should start with business outcomes because the tool itself is not the strategy.",{"type":25,"tag":26,"props":283,"children":284},{},[285],{"type":30,"value":286},"A vendor demo, a boardroom trend, or an internal push to “use AI” is not enough reason to invest. The investment should be tied to a business result the company already cares about.",{"type":25,"tag":26,"props":288,"children":289},{},[290],{"type":30,"value":291},"Strong AI investment goals include:",{"type":25,"tag":293,"props":294,"children":295},"ul",{},[296,302,307,312,317,322,327,332],{"type":25,"tag":297,"props":298,"children":299},"li",{},[300],{"type":30,"value":301},"Increasing revenue",{"type":25,"tag":297,"props":303,"children":304},{},[305],{"type":30,"value":306},"Reducing operating cost",{"type":25,"tag":297,"props":308,"children":309},{},[310],{"type":30,"value":311},"Improving customer experience",{"type":25,"tag":297,"props":313,"children":314},{},[315],{"type":30,"value":316},"Accelerating software or product delivery",{"type":25,"tag":297,"props":318,"children":319},{},[320],{"type":30,"value":321},"Improving decision quality",{"type":25,"tag":297,"props":323,"children":324},{},[325],{"type":30,"value":326},"Reducing risk",{"type":25,"tag":297,"props":328,"children":329},{},[330],{"type":30,"value":331},"Creating a new product capability",{"type":25,"tag":297,"props":333,"children":334},{},[335],{"type":30,"value":336},"Strengthening competitive advantage",{"type":25,"tag":26,"props":338,"children":339},{},[340],{"type":30,"value":341},"For example, “We want an AI chatbot” is not a complete business case.",{"type":25,"tag":26,"props":343,"children":344},{},[345],{"type":30,"value":346},"A better version is: “We want to reduce support resolution time while maintaining or improving customer satisfaction.”",{"type":25,"tag":26,"props":348,"children":349},{},[350],{"type":30,"value":351},"“We want AI for engineering” is also too broad.",{"type":25,"tag":26,"props":353,"children":354},{},[355],{"type":30,"value":356},"A stronger version is: “We want to shorten software delivery cycles while maintaining code quality, security, transparency, and maintainability.”",{"type":25,"tag":26,"props":358,"children":359},{},[360],{"type":30,"value":361},"The CEO’s role is not to choose the model. It is to make sure the investment is pointed at a business problem worth solving.",{"type":25,"tag":60,"props":363,"children":365},{"id":364},"what-types-of-ai-investments-should-ceos-compare",[366],{"type":30,"value":367},"What Types of AI Investments Should CEOs Compare?",{"type":25,"tag":26,"props":369,"children":370},{},[371],{"type":30,"value":372},"Not all AI investments should be judged by the same standard. A productivity tool, an internal decision-support system, a customer-facing AI feature, and an autonomous workflow agent have different costs, timelines, risks, and payoff profiles.",{"type":25,"tag":26,"props":374,"children":375},{},[376],{"type":30,"value":377},"CEOs should usually compare AI investments across four categories.",{"type":25,"tag":72,"props":379,"children":380},{},[381,406],{"type":25,"tag":76,"props":382,"children":383},{},[384],{"type":25,"tag":80,"props":385,"children":386},{},[387,392,397,401],{"type":25,"tag":84,"props":388,"children":389},{},[390],{"type":30,"value":391},"AI Investment Type",{"type":25,"tag":84,"props":393,"children":394},{},[395],{"type":30,"value":396},"Best Use",{"type":25,"tag":84,"props":398,"children":399},{},[400],{"type":30,"value":93},{"type":25,"tag":84,"props":402,"children":403},{},[404],{"type":30,"value":405},"Main Risk",{"type":25,"tag":100,"props":407,"children":408},{},[409,432,455,478],{"type":25,"tag":80,"props":410,"children":411},{},[412,417,422,427],{"type":25,"tag":107,"props":413,"children":414},{},[415],{"type":30,"value":416},"Productivity AI",{"type":25,"tag":107,"props":418,"children":419},{},[420],{"type":30,"value":421},"Speeding up knowledge work",{"type":25,"tag":107,"props":423,"children":424},{},[425],{"type":30,"value":426},"What will we do with the time saved?",{"type":25,"tag":107,"props":428,"children":429},{},[430],{"type":30,"value":431},"The value stays theoretical.",{"type":25,"tag":80,"props":433,"children":434},{},[435,440,445,450],{"type":25,"tag":107,"props":436,"children":437},{},[438],{"type":30,"value":439},"Decision support",{"type":25,"tag":107,"props":441,"children":442},{},[443],{"type":30,"value":444},"Improving business decisions",{"type":25,"tag":107,"props":446,"children":447},{},[448],{"type":30,"value":449},"What decision gets better?",{"type":25,"tag":107,"props":451,"children":452},{},[453],{"type":30,"value":454},"Poor data or unclear accountability.",{"type":25,"tag":80,"props":456,"children":457},{},[458,463,468,473],{"type":25,"tag":107,"props":459,"children":460},{},[461],{"type":30,"value":462},"Customer-facing AI",{"type":25,"tag":107,"props":464,"children":465},{},[466],{"type":30,"value":467},"Improving product or service experience",{"type":25,"tag":107,"props":469,"children":470},{},[471],{"type":30,"value":472},"Does this improve trust and usability?",{"type":25,"tag":107,"props":474,"children":475},{},[476],{"type":30,"value":477},"Brand, legal, or customer harm.",{"type":25,"tag":80,"props":479,"children":480},{},[481,486,491,496],{"type":25,"tag":107,"props":482,"children":483},{},[484],{"type":30,"value":485},"Agentic AI",{"type":25,"tag":107,"props":487,"children":488},{},[489],{"type":30,"value":490},"Automating bounded workflows",{"type":25,"tag":107,"props":492,"children":493},{},[494],{"type":30,"value":495},"Is the process well understood?",{"type":25,"tag":107,"props":497,"children":498},{},[499],{"type":30,"value":500},"Uncontrolled action or escalating cost.",{"type":25,"tag":26,"props":502,"children":503},{},[504],{"type":30,"value":505},"The more deeply AI is connected to business operations, the more important software engineering becomes.",{"type":25,"tag":26,"props":507,"children":508},{},[509],{"type":30,"value":510},"A simple writing assistant may require light governance. An AI feature inside a customer product requires much more: interface design, testing, integration, security, monitoring, auditability, escalation paths, and a clear answer to the question, “Who is responsible when this system is wrong?”",{"type":25,"tag":60,"props":512,"children":514},{"id":513},"how-should-ceos-evaluate-ai-assisted-software-development",[515],{"type":30,"value":516},"How Should CEOs Evaluate AI-Assisted Software Development?",{"type":25,"tag":26,"props":518,"children":519},{},[520],{"type":30,"value":521},"CEOs should evaluate AI-assisted software development carefully. AI can help engineers move faster, but it does not remove the need for engineering judgment.",{"type":25,"tag":26,"props":523,"children":524},{},[525],{"type":30,"value":526},"This is one of the easiest places to misunderstand AI.",{"type":25,"tag":26,"props":528,"children":529},{},[530],{"type":30,"value":531},"AI can generate code. That does not mean AI has designed a system. It does not mean the code is secure. It does not mean the architecture is appropriate. It does not mean the implementation is maintainable. It does not mean the business logic is correct. It does not mean the code will still make sense six months from now.",{"type":25,"tag":26,"props":533,"children":534},{},[535],{"type":30,"value":536},"A responsible software team uses AI as an accelerator, not as an unquestioned authority.",{"type":25,"tag":26,"props":538,"children":539},{},[540],{"type":30,"value":541},"Human software engineers still need to:",{"type":25,"tag":293,"props":543,"children":544},{},[545,550,555,560,565,570,575,580,585,590],{"type":25,"tag":297,"props":546,"children":547},{},[548],{"type":30,"value":549},"Understand the business requirements",{"type":25,"tag":297,"props":551,"children":552},{},[553],{"type":30,"value":554},"Choose the right architecture",{"type":25,"tag":297,"props":556,"children":557},{},[558],{"type":30,"value":559},"Review AI-generated code",{"type":25,"tag":297,"props":561,"children":562},{},[563],{"type":30,"value":564},"Test edge cases",{"type":25,"tag":297,"props":566,"children":567},{},[568],{"type":30,"value":569},"Identify security risks",{"type":25,"tag":297,"props":571,"children":572},{},[573],{"type":30,"value":574},"Preserve maintainability",{"type":25,"tag":297,"props":576,"children":577},{},[578],{"type":30,"value":579},"Document important decisions",{"type":25,"tag":297,"props":581,"children":582},{},[583],{"type":30,"value":584},"Monitor system behavior",{"type":25,"tag":297,"props":586,"children":587},{},[588],{"type":30,"value":589},"Refactor when requirements change",{"type":25,"tag":297,"props":591,"children":592},{},[593],{"type":30,"value":594},"Take responsibility for the final product",{"type":25,"tag":26,"props":596,"children":597},{},[598],{"type":30,"value":599},"This is especially important for CEOs because software is not only an asset at launch. It is an asset over time.",{"type":25,"tag":26,"props":601,"children":602},{},[603],{"type":30,"value":604},"A system that no one understands is a liability, even if it works today. A codebase that cannot be explained, maintained, secured, or extended will slow the business down later.",{"type":25,"tag":26,"props":606,"children":607},{},[608,610],{"type":30,"value":609},"The CEO question is: ",{"type":25,"tag":37,"props":611,"children":612},{},[613],{"type":30,"value":614},"Can our engineers explain, own, and maintain the code behind this AI-enabled system?",{"type":25,"tag":26,"props":616,"children":617},{},[618],{"type":30,"value":619},"If the answer is no, the investment is not ready to scale.",{"type":25,"tag":60,"props":621,"children":623},{"id":622},"why-is-human-in-the-loop-ai-important",[624],{"type":30,"value":625},"Why Is Human-in-the-Loop AI Important?",{"type":25,"tag":26,"props":627,"children":628},{},[629],{"type":30,"value":630},"Human-in-the-loop AI is important because AI systems can be useful without being fully autonomous.",{"type":25,"tag":26,"props":632,"children":633},{},[634],{"type":30,"value":635},"In many business settings, the right goal is not to remove people from the process. The right goal is to help people make better decisions, move faster, reduce repetitive work, and focus on higher-value judgment.",{"type":25,"tag":26,"props":637,"children":638},{},[639],{"type":30,"value":640},"That is especially true when AI affects customers, financial decisions, compliance, security, hiring, healthcare, legal review, product quality, or production software.",{"type":25,"tag":26,"props":642,"children":643},{},[644],{"type":30,"value":645},"A human-in-the-loop design can include:",{"type":25,"tag":293,"props":647,"children":648},{},[649,654,659,664,669,674,679,684],{"type":25,"tag":297,"props":650,"children":651},{},[652],{"type":30,"value":653},"Human review before an AI recommendation is acted on",{"type":25,"tag":297,"props":655,"children":656},{},[657],{"type":30,"value":658},"Approval steps for high-risk outputs",{"type":25,"tag":297,"props":660,"children":661},{},[662],{"type":30,"value":663},"Escalation paths when confidence is low",{"type":25,"tag":297,"props":665,"children":666},{},[667],{"type":30,"value":668},"Clear visibility into source data or reasoning context",{"type":25,"tag":297,"props":670,"children":671},{},[672],{"type":30,"value":673},"Logging and audit trails",{"type":25,"tag":297,"props":675,"children":676},{},[677],{"type":30,"value":678},"Feedback loops that improve future performance",{"type":25,"tag":297,"props":680,"children":681},{},[682],{"type":30,"value":683},"Override controls",{"type":25,"tag":297,"props":685,"children":686},{},[687],{"type":30,"value":688},"Limits on what the AI system is allowed to do automatically",{"type":25,"tag":26,"props":690,"children":691},{},[692],{"type":30,"value":693},"This does not make AI less valuable. It makes AI more usable.",{"type":25,"tag":26,"props":695,"children":696},{},[697,699,705],{"type":30,"value":698},"We emphasize embedding AI into real operational workflows while keeping humans firmly in the loop. (",{"type":25,"tag":239,"props":700,"children":703},{"href":701,"rel":702},"https://artandlogic.com/two-minutes-on-tech/",[243],[704],{"type":30,"value":246},{"type":30,"value":706},") That is a practical way to think about enterprise AI: not as a black box that replaces judgment, but as software that supports better human and organizational performance.",{"type":25,"tag":60,"props":708,"children":710},{"id":709},"what-value-does-a-software-development-partner-add-to-ai-investments",[711],{"type":30,"value":712},"What Value Does a Software Development Partner Add to AI Investments?",{"type":25,"tag":26,"props":714,"children":715},{},[716],{"type":30,"value":717},"A software development partner adds value by turning an AI idea into a working, maintainable, secure system.",{"type":25,"tag":26,"props":719,"children":720},{},[721],{"type":30,"value":722},"That value matters because most AI failures do not happen because the model cannot produce an impressive answer. They happen because the business cannot integrate that capability into real operations.",{"type":25,"tag":26,"props":724,"children":725},{},[726,728,735],{"type":30,"value":727},"Gartner predicted that at least 30% of generative AI projects would be abandoned after proof of concept by the end of 2025 because of poor data quality, inadequate risk controls, escalating costs, or unclear business value. (",{"type":25,"tag":239,"props":729,"children":732},{"href":730,"rel":731},"https://www.gartner.com/en/newsroom/press-releases/2024-07-29-gartner-predicts-30-percent-of-generative-ai-projects-will-be-abandoned-after-proof-of-concept-by-end-of-2025",[243],[733],{"type":30,"value":734},"Gartner",{"type":30,"value":248},{"type":25,"tag":26,"props":737,"children":738},{},[739],{"type":30,"value":740},"Those are not purely AI problems. They are software, data, product, and operating model problems.",{"type":25,"tag":26,"props":742,"children":743},{},[744],{"type":30,"value":745},"An experienced development partner can help CEOs and leadership teams answer questions like:",{"type":25,"tag":293,"props":747,"children":748},{},[749,754,759,764,769,774,779,784,789,794],{"type":25,"tag":297,"props":750,"children":751},{},[752],{"type":30,"value":753},"What should we build, buy, or integrate?",{"type":25,"tag":297,"props":755,"children":756},{},[757],{"type":30,"value":758},"Which workflow is worth improving first?",{"type":25,"tag":297,"props":760,"children":761},{},[762],{"type":30,"value":763},"What data does the system need?",{"type":25,"tag":297,"props":765,"children":766},{},[767],{"type":30,"value":768},"How should humans review or approve outputs?",{"type":25,"tag":297,"props":770,"children":771},{},[772],{"type":30,"value":773},"What parts of the workflow should remain deterministic?",{"type":25,"tag":297,"props":775,"children":776},{},[777],{"type":30,"value":778},"How should the AI connect to existing systems?",{"type":25,"tag":297,"props":780,"children":781},{},[782],{"type":30,"value":783},"What should be logged, monitored, or audited?",{"type":25,"tag":297,"props":785,"children":786},{},[787],{"type":30,"value":788},"How do we test quality before launch?",{"type":25,"tag":297,"props":790,"children":791},{},[792],{"type":30,"value":793},"How do we keep the system maintainable?",{"type":25,"tag":297,"props":795,"children":796},{},[797],{"type":30,"value":798},"How do we avoid creating a black box no one owns?",{"type":25,"tag":26,"props":800,"children":801},{},[802,804,810],{"type":30,"value":803},"Art+Logic works on custom software, AI development, web apps, legacy upgrades, automation, secure software development, and technically difficult projects. The company has been designing and developing custom software since 1991 and has built software for more than 900 clients across industries. (",{"type":25,"tag":239,"props":805,"children":808},{"href":806,"rel":807},"https://artandlogic.com/",[243],[809],{"type":30,"value":246},{"type":30,"value":248},{"type":25,"tag":26,"props":812,"children":813},{},[814],{"type":30,"value":815},"That kind of experience matters because AI projects still have all the hard parts of software projects: requirements, architecture, integration, user experience, security, deployment, testing, change management, and long-term maintenance.",{"type":25,"tag":26,"props":817,"children":818},{},[819],{"type":30,"value":820},"AI does not remove those needs. It raises the stakes.",{"type":25,"tag":60,"props":822,"children":824},{"id":823},"how-should-ceos-evaluate-productivity-ai",[825],{"type":30,"value":826},"How Should CEOs Evaluate Productivity AI?",{"type":25,"tag":26,"props":828,"children":829},{},[830],{"type":30,"value":831},"Productivity AI helps employees write, research, summarize, analyze, code, search internal knowledge, or automate repetitive tasks.",{"type":25,"tag":26,"props":833,"children":834},{},[835],{"type":30,"value":836},"These tools can produce fast wins, but their ROI is often harder to measure than it first appears. Time saved does not automatically become money saved. If employees save three hours a week but the company does not increase throughput, improve quality, reduce cost, or reallocate capacity, the value may remain theoretical.",{"type":25,"tag":26,"props":838,"children":839},{},[840,842],{"type":30,"value":841},"The key CEO question is: ",{"type":25,"tag":37,"props":843,"children":844},{},[845],{"type":30,"value":846},"What will we do with the time we save?",{"type":25,"tag":26,"props":848,"children":849},{},[850],{"type":30,"value":851},"Will teams handle more customer volume? Ship software faster? Reduce vendor spend? Improve proposal quality? Shorten sales cycles? Reallocate people to higher-value work?",{"type":25,"tag":26,"props":853,"children":854},{},[855],{"type":30,"value":856},"Without that second-order benefit, productivity AI becomes a convenience rather than a strategic investment.",{"type":25,"tag":26,"props":858,"children":859},{},[860],{"type":30,"value":861},"For software teams specifically, AI-assisted development should be evaluated by more than speed. CEOs should also ask whether quality, security, documentation, testing, and maintainability are improving or declining.",{"type":25,"tag":26,"props":863,"children":864},{},[865],{"type":30,"value":866},"Fast code is not automatically good software.",{"type":25,"tag":60,"props":868,"children":870},{"id":869},"how-should-ceos-evaluate-ai-for-decision-support",[871],{"type":30,"value":872},"How Should CEOs Evaluate AI for Decision Support?",{"type":25,"tag":26,"props":874,"children":875},{},[876],{"type":30,"value":877},"AI decision-support systems help leaders and teams analyze data, identify patterns, forecast outcomes, or recommend actions.",{"type":25,"tag":26,"props":879,"children":880},{},[881],{"type":30,"value":882},"Examples include demand forecasting, churn prediction, pricing support, fraud detection, operational planning, and financial scenario modeling.",{"type":25,"tag":26,"props":884,"children":885},{},[886],{"type":30,"value":887},"The value is not just automation. It is better judgment at scale.",{"type":25,"tag":26,"props":889,"children":890},{},[891,892],{"type":30,"value":841},{"type":25,"tag":37,"props":893,"children":894},{},[895],{"type":30,"value":896},"What decision improves, who makes it, and how will we know the decision got better?",{"type":25,"tag":26,"props":898,"children":899},{},[900],{"type":30,"value":901},"A decision-support investment should have a clear link to a recurring business decision. It should also define how recommendations will be reviewed, when humans remain accountable, and how the company will measure whether decisions improve over time.",{"type":25,"tag":26,"props":903,"children":904},{},[905],{"type":30,"value":906},"AI can support a decision. It should not obscure responsibility for that decision.",{"type":25,"tag":60,"props":908,"children":910},{"id":909},"how-should-ceos-evaluate-customer-facing-ai",[911],{"type":30,"value":912},"How Should CEOs Evaluate Customer-Facing AI?",{"type":25,"tag":26,"props":914,"children":915},{},[916],{"type":30,"value":917},"Customer-facing AI includes capabilities embedded into products, platforms, services, or support experiences.",{"type":25,"tag":26,"props":919,"children":920},{},[921],{"type":30,"value":922},"Examples include personalization, recommendations, natural language interfaces, intelligent onboarding, automated support, AI-assisted design tools, and domain-specific copilots.",{"type":25,"tag":26,"props":924,"children":925},{},[926],{"type":30,"value":927},"These investments can create differentiation, but they also carry higher brand and trust risk. A bad internal AI answer may waste time. A bad customer-facing AI answer may damage credibility, expose sensitive information, or create legal risk.",{"type":25,"tag":26,"props":929,"children":930},{},[931,932],{"type":30,"value":841},{"type":25,"tag":37,"props":933,"children":934},{},[935],{"type":30,"value":936},"Does this improve the customer experience enough to justify the operational and reputational risk?",{"type":25,"tag":26,"props":938,"children":939},{},[940],{"type":30,"value":941},"Customer-facing AI should be evaluated not only for accuracy but also for usability, transparency, escalation paths, privacy, security, and failure handling.",{"type":25,"tag":26,"props":943,"children":944},{},[945],{"type":30,"value":946},"This is another place where software engineering is essential. The user experience around the model often matters as much as the model itself.",{"type":25,"tag":26,"props":948,"children":949},{},[950],{"type":30,"value":951},"Can the user tell when they are interacting with AI? Can they correct it? Can they escalate to a person? Can the system explain where an answer came from? Can the business trace what happened if something goes wrong?",{"type":25,"tag":26,"props":953,"children":954},{},[955],{"type":30,"value":956},"Those are product and engineering questions, not just AI questions.",{"type":25,"tag":60,"props":958,"children":960},{"id":959},"how-should-ceos-evaluate-agentic-ai",[961],{"type":30,"value":962},"How Should CEOs Evaluate Agentic AI?",{"type":25,"tag":26,"props":964,"children":965},{},[966],{"type":30,"value":967},"Agentic AI refers to systems that can take actions across tools, workflows, or systems with some degree of autonomy.",{"type":25,"tag":26,"props":969,"children":970},{},[971,973,980],{"type":30,"value":972},"This area is attracting heavy executive interest, but it requires extra discipline. Gartner predicted that over 40% of agentic AI projects would be canceled by the end of 2027 because of escalating costs, unclear business value, or inadequate risk controls. (",{"type":25,"tag":239,"props":974,"children":977},{"href":975,"rel":976},"https://www.reuters.com/business/over-40-agentic-ai-projects-will-be-scrapped-by-2027-gartner-says-2025-06-25/",[243],[978],{"type":30,"value":979},"Reuters",{"type":30,"value":248},{"type":25,"tag":26,"props":982,"children":983},{},[984],{"type":30,"value":985},"That does not mean CEOs should ignore agentic AI. It means they should apply a higher bar.",{"type":25,"tag":26,"props":987,"children":988},{},[989],{"type":30,"value":990},"Agentic systems are most promising when the workflow is valuable, repeatable, well-bounded, observable, and connected to clear business metrics. They are risky when the workflow is ambiguous, exception-heavy, poorly documented, or dependent on judgment the organization cannot clearly define.",{"type":25,"tag":26,"props":992,"children":993},{},[994,995],{"type":30,"value":841},{"type":25,"tag":37,"props":996,"children":997},{},[998],{"type":30,"value":999},"Are we automating a well-understood business process, or are we asking AI to compensate for a process we do not understand?",{"type":25,"tag":26,"props":1001,"children":1002},{},[1003],{"type":30,"value":1004},"For agentic AI, human-in-the-loop design becomes even more important. The system should have clear limits on what it can do, when it must ask for approval, what actions are logged, and how a human can intervene.",{"type":25,"tag":26,"props":1006,"children":1007},{},[1008],{"type":30,"value":1009},"Autonomy without accountability is not a business capability. It is a risk.",{"type":25,"tag":60,"props":1011,"children":1013},{"id":1012},"what-is-the-real-cost-of-an-ai-investment",[1014],{"type":30,"value":1015},"What Is the Real Cost of an AI Investment?",{"type":25,"tag":26,"props":1017,"children":1018},{},[1019],{"type":30,"value":1020},"The real cost of an AI investment includes much more than software licenses or model usage.",{"type":25,"tag":26,"props":1022,"children":1023},{},[1024],{"type":30,"value":1025},"A pilot may only require a few users, a small technical team, and limited API spend. A production AI system usually requires a broader operating model.",{"type":25,"tag":26,"props":1027,"children":1028},{},[1029],{"type":30,"value":1030},"CEOs should expect serious AI investments to include some combination of:",{"type":25,"tag":293,"props":1032,"children":1033},{},[1034,1039,1044,1049,1054,1059,1064,1069,1074,1079,1084,1089,1094,1099,1104,1109,1114,1119],{"type":25,"tag":297,"props":1035,"children":1036},{},[1037],{"type":30,"value":1038},"Data preparation and cleanup",{"type":25,"tag":297,"props":1040,"children":1041},{},[1042],{"type":30,"value":1043},"System integration",{"type":25,"tag":297,"props":1045,"children":1046},{},[1047],{"type":30,"value":1048},"Security review",{"type":25,"tag":297,"props":1050,"children":1051},{},[1052],{"type":30,"value":1053},"Cloud infrastructure and model usage",{"type":25,"tag":297,"props":1055,"children":1056},{},[1057],{"type":30,"value":1058},"Vendor evaluation and procurement",{"type":25,"tag":297,"props":1060,"children":1061},{},[1062],{"type":30,"value":1063},"Legal and compliance review",{"type":25,"tag":297,"props":1065,"children":1066},{},[1067],{"type":30,"value":1068},"User experience design",{"type":25,"tag":297,"props":1070,"children":1071},{},[1072],{"type":30,"value":1073},"Workflow redesign",{"type":25,"tag":297,"props":1075,"children":1076},{},[1077],{"type":30,"value":1078},"Training and change management",{"type":25,"tag":297,"props":1080,"children":1081},{},[1082],{"type":30,"value":1083},"Human review processes",{"type":25,"tag":297,"props":1085,"children":1086},{},[1087],{"type":30,"value":1088},"Testing and evaluation",{"type":25,"tag":297,"props":1090,"children":1091},{},[1092],{"type":30,"value":1093},"Monitoring and maintenance",{"type":25,"tag":297,"props":1095,"children":1096},{},[1097],{"type":30,"value":1098},"Incident response planning",{"type":25,"tag":297,"props":1100,"children":1101},{},[1102],{"type":30,"value":1103},"Ongoing model, prompt, and data updates",{"type":25,"tag":297,"props":1105,"children":1106},{},[1107],{"type":30,"value":1108},"Software documentation",{"type":25,"tag":297,"props":1110,"children":1111},{},[1112],{"type":30,"value":1113},"Code review and refactoring",{"type":25,"tag":297,"props":1115,"children":1116},{},[1117],{"type":30,"value":1118},"Observability and logging",{"type":25,"tag":297,"props":1120,"children":1121},{},[1122],{"type":30,"value":1123},"Long-term ownership",{"type":25,"tag":26,"props":1125,"children":1126},{},[1127,1129],{"type":30,"value":1128},"A useful rule for CEOs: ",{"type":25,"tag":37,"props":1130,"children":1131},{},[1132],{"type":30,"value":1133},"If the estimate only includes the AI tool, it is not a complete estimate.",{"type":25,"tag":26,"props":1135,"children":1136},{},[1137],{"type":30,"value":1138},"The model may work, but the business environment around it may not be ready. That is where many AI business cases break down.",{"type":25,"tag":60,"props":1140,"children":1142},{"id":1141},"why-does-workflow-redesign-matter-for-ai-roi",[1143],{"type":30,"value":1144},"Why Does Workflow Redesign Matter for AI ROI?",{"type":25,"tag":26,"props":1146,"children":1147},{},[1148],{"type":30,"value":1149},"Workflow redesign matters because AI creates value when it changes how work gets done.",{"type":25,"tag":26,"props":1151,"children":1152},{},[1153],{"type":30,"value":1154},"Giving employees access to AI tools may improve individual productivity. But larger gains usually come from redesigning workflows around AI-enabled capabilities.",{"type":25,"tag":26,"props":1156,"children":1157},{},[1158,1160,1167],{"type":30,"value":1159},"McKinsey’s 2025 global AI survey found that workflow redesign had the biggest effect on an organization’s ability to see EBIT impact from generative AI. The same survey reported that 21% of respondents whose organizations use generative AI said their organizations had fundamentally redesigned at least some workflows. (",{"type":25,"tag":239,"props":1161,"children":1164},{"href":1162,"rel":1163},"https://www.mckinsey.com/capabilities/quantumblack/our-insights/the-state-of-ai-how-organizations-are-rewiring-to-capture-value",[243],[1165],{"type":30,"value":1166},"McKinsey & Company",{"type":30,"value":248},{"type":25,"tag":26,"props":1169,"children":1170},{},[1171],{"type":30,"value":1172},"That distinction is important.",{"type":25,"tag":26,"props":1174,"children":1175},{},[1176],{"type":30,"value":1177},"AI adoption means people have access to tools.",{"type":25,"tag":26,"props":1179,"children":1180},{},[1181],{"type":30,"value":1182},"AI value means the business has changed a workflow in a measurable way.",{"type":25,"tag":26,"props":1184,"children":1185},{},[1186],{"type":30,"value":1187},"For example, giving a sales team an AI writing assistant may help individual sellers move faster. Redesigning the sales proposal process with AI-assisted research, reusable knowledge, pricing guidance, legal review support, and CRM integration may change the economics of the whole function.",{"type":25,"tag":26,"props":1189,"children":1190},{},[1191],{"type":30,"value":1192},"The same applies to software development. AI coding tools can improve individual productivity, but larger gains require disciplined engineering workflows: clearer requirements, better testing, stronger code review, improved documentation, deployment automation, and maintainable architecture.",{"type":25,"tag":26,"props":1194,"children":1195},{},[1196,1198],{"type":30,"value":1197},"The CEO question is simple: ",{"type":25,"tag":37,"props":1199,"children":1200},{},[1201],{"type":30,"value":1202},"What workflow changes if this succeeds?",{"type":25,"tag":26,"props":1204,"children":1205},{},[1206],{"type":30,"value":1207},"If the answer is “nothing,” the investment is probably too shallow.",{"type":25,"tag":60,"props":1209,"children":1211},{"id":1210},"how-should-ceos-think-about-ai-governance",[1212],{"type":30,"value":1213},"How Should CEOs Think About AI Governance?",{"type":25,"tag":26,"props":1215,"children":1216},{},[1217],{"type":30,"value":1218},"CEOs should treat AI governance as part of the investment case, not as an afterthought.",{"type":25,"tag":26,"props":1220,"children":1221},{},[1222],{"type":30,"value":1223},"Governance is often framed as a brake on innovation. In reality, good governance is what allows AI to scale.",{"type":25,"tag":26,"props":1225,"children":1226},{},[1227],{"type":30,"value":1228},"Without governance, companies risk shadow AI, inconsistent data handling, unclear accountability, duplicated tools, uncontrolled costs, unmanaged security exposure, unreliable outputs, and code no one fully understands.",{"type":25,"tag":26,"props":1230,"children":1231},{},[1232],{"type":30,"value":1233},"With governance, teams have clearer rules for where AI can be used, what data is allowed, who approves high-risk use cases, how outputs are reviewed, how code is tested, and how systems are monitored.",{"type":25,"tag":26,"props":1235,"children":1236},{},[1237,1239,1246],{"type":30,"value":1238},"Regulation is also becoming more concrete. The EU AI Act entered into force on August 1, 2024, and is scheduled to become fully applicable on August 2, 2026, with some exceptions. (",{"type":25,"tag":239,"props":1240,"children":1243},{"href":1241,"rel":1242},"https://digital-strategy.ec.europa.eu/en/policies/regulatory-framework-ai",[243],[1244],{"type":30,"value":1245},"Digital Strategy",{"type":30,"value":248},{"type":25,"tag":26,"props":1248,"children":1249},{},[1250],{"type":30,"value":1251},"Even companies outside the EU should pay attention to this direction. Customers, regulators, insurers, partners, and enterprise buyers are increasingly likely to ask how AI systems are governed.",{"type":25,"tag":26,"props":1253,"children":1254},{},[1255],{"type":30,"value":1256},"A practical AI governance review should answer:",{"type":25,"tag":293,"props":1258,"children":1259},{},[1260,1265,1270,1275,1280,1285,1290,1295,1300,1305],{"type":25,"tag":297,"props":1261,"children":1262},{},[1263],{"type":30,"value":1264},"Who owns the AI system?",{"type":25,"tag":297,"props":1266,"children":1267},{},[1268],{"type":30,"value":1269},"What data can and cannot be used?",{"type":25,"tag":297,"props":1271,"children":1272},{},[1273],{"type":30,"value":1274},"What security and privacy controls are required?",{"type":25,"tag":297,"props":1276,"children":1277},{},[1278],{"type":30,"value":1279},"When is human review required?",{"type":25,"tag":297,"props":1281,"children":1282},{},[1283],{"type":30,"value":1284},"How will outputs be tested?",{"type":25,"tag":297,"props":1286,"children":1287},{},[1288],{"type":30,"value":1289},"How will AI-generated code be reviewed?",{"type":25,"tag":297,"props":1291,"children":1292},{},[1293],{"type":30,"value":1294},"What happens when the system is wrong?",{"type":25,"tag":297,"props":1296,"children":1297},{},[1298],{"type":30,"value":1299},"How will performance be monitored after launch?",{"type":25,"tag":297,"props":1301,"children":1302},{},[1303],{"type":30,"value":1304},"How will the company respond to incidents?",{"type":25,"tag":297,"props":1306,"children":1307},{},[1308],{"type":30,"value":1309},"Who is responsible for maintaining the system over time?",{"type":25,"tag":26,"props":1311,"children":1312},{},[1313],{"type":30,"value":1314},"The governance should match the risk. An internal brainstorming assistant does not need the same oversight as an AI system that affects hiring, lending, medical guidance, legal review, financial decisions, customer eligibility, or production infrastructure.",{"type":25,"tag":26,"props":1316,"children":1317},{},[1318],{"type":30,"value":1319},"But every AI investment needs boundaries.",{"type":25,"tag":60,"props":1321,"children":1323},{"id":1322},"what-metrics-should-ceos-use-to-measure-ai-roi",[1324],{"type":30,"value":1325},"What Metrics Should CEOs Use to Measure AI ROI?",{"type":25,"tag":26,"props":1327,"children":1328},{},[1329],{"type":30,"value":1330},"CEOs should measure AI ROI using business metrics, not just usage metrics.",{"type":25,"tag":26,"props":1332,"children":1333},{},[1334],{"type":30,"value":1335},"Usage can show adoption, but it does not prove value. A tool can be widely used and still fail to improve business performance.",{"type":25,"tag":26,"props":1337,"children":1338},{},[1339],{"type":30,"value":1340},"Better AI ROI metrics include:",{"type":25,"tag":72,"props":1342,"children":1343},{},[1344,1360],{"type":25,"tag":76,"props":1345,"children":1346},{},[1347],{"type":25,"tag":80,"props":1348,"children":1349},{},[1350,1355],{"type":25,"tag":84,"props":1351,"children":1352},{},[1353],{"type":30,"value":1354},"Business Goal",{"type":25,"tag":84,"props":1356,"children":1357},{},[1358],{"type":30,"value":1359},"Possible AI ROI Metric",{"type":25,"tag":100,"props":1361,"children":1362},{},[1363,1376,1389,1402,1415,1428,1441,1454,1467],{"type":25,"tag":80,"props":1364,"children":1365},{},[1366,1371],{"type":25,"tag":107,"props":1367,"children":1368},{},[1369],{"type":30,"value":1370},"Reduce cost",{"type":25,"tag":107,"props":1372,"children":1373},{},[1374],{"type":30,"value":1375},"Lower cost per ticket, transaction, claim, report, or workflow",{"type":25,"tag":80,"props":1377,"children":1378},{},[1379,1384],{"type":25,"tag":107,"props":1380,"children":1381},{},[1382],{"type":30,"value":1383},"Improve speed",{"type":25,"tag":107,"props":1385,"children":1386},{},[1387],{"type":30,"value":1388},"Shorter cycle time, faster response time, reduced backlog",{"type":25,"tag":80,"props":1390,"children":1391},{},[1392,1397],{"type":25,"tag":107,"props":1393,"children":1394},{},[1395],{"type":30,"value":1396},"Increase revenue",{"type":25,"tag":107,"props":1398,"children":1399},{},[1400],{"type":30,"value":1401},"Higher conversion, larger deal velocity, better retention",{"type":25,"tag":80,"props":1403,"children":1404},{},[1405,1410],{"type":25,"tag":107,"props":1406,"children":1407},{},[1408],{"type":30,"value":1409},"Improve quality",{"type":25,"tag":107,"props":1411,"children":1412},{},[1413],{"type":30,"value":1414},"Fewer errors, fewer rework cycles, better customer satisfaction",{"type":25,"tag":80,"props":1416,"children":1417},{},[1418,1423],{"type":25,"tag":107,"props":1419,"children":1420},{},[1421],{"type":30,"value":1422},"Increase capacity",{"type":25,"tag":107,"props":1424,"children":1425},{},[1426],{"type":30,"value":1427},"More throughput without proportional headcount growth",{"type":25,"tag":80,"props":1429,"children":1430},{},[1431,1436],{"type":25,"tag":107,"props":1432,"children":1433},{},[1434],{"type":30,"value":1435},"Reduce risk",{"type":25,"tag":107,"props":1437,"children":1438},{},[1439],{"type":30,"value":1440},"Fewer compliance issues, better anomaly detection, improved auditability",{"type":25,"tag":80,"props":1442,"children":1443},{},[1444,1449],{"type":25,"tag":107,"props":1445,"children":1446},{},[1447],{"type":30,"value":1448},"Improve delivery",{"type":25,"tag":107,"props":1450,"children":1451},{},[1452],{"type":30,"value":1453},"Faster software releases, fewer defects, shorter review cycles",{"type":25,"tag":80,"props":1455,"children":1456},{},[1457,1462],{"type":25,"tag":107,"props":1458,"children":1459},{},[1460],{"type":30,"value":1461},"Improve maintainability",{"type":25,"tag":107,"props":1463,"children":1464},{},[1465],{"type":30,"value":1466},"Lower technical debt, clearer documentation, easier onboarding",{"type":25,"tag":80,"props":1468,"children":1469},{},[1470,1475],{"type":25,"tag":107,"props":1471,"children":1472},{},[1473],{"type":30,"value":1474},"Improve transparency",{"type":25,"tag":107,"props":1476,"children":1477},{},[1478],{"type":30,"value":1479},"Better traceability, explainability, logs, and review workflows",{"type":25,"tag":26,"props":1481,"children":1482},{},[1483],{"type":30,"value":1484},"A strong AI business case should explain the baseline, the expected improvement, and the method for measurement.",{"type":25,"tag":26,"props":1486,"children":1487},{},[1488,1490],{"type":30,"value":1489},"For example, “save 10,000 hours” is not enough. The better question is: ",{"type":25,"tag":37,"props":1491,"children":1492},{},[1493],{"type":30,"value":1494},"Which hours, whose hours, what happens next, and what business result changes?",{"type":25,"tag":26,"props":1496,"children":1497},{},[1498,1500],{"type":30,"value":1499},"For AI-assisted software development, “more code shipped” is not enough either. The better question is: ",{"type":25,"tag":37,"props":1501,"children":1502},{},[1503],{"type":30,"value":1504},"Are we shipping better software faster, with clear ownership and less long-term risk?",{"type":25,"tag":60,"props":1506,"children":1508},{"id":1507},"should-ceos-build-buy-or-partner-on-ai",[1509],{"type":30,"value":1510},"Should CEOs Build, Buy, or Partner on AI?",{"type":25,"tag":26,"props":1512,"children":1513},{},[1514],{"type":30,"value":1515},"CEOs should choose build, buy, or partner based on strategic importance, differentiation, control, cost, and speed.",{"type":25,"tag":26,"props":1517,"children":1518},{},[1519,1524],{"type":25,"tag":37,"props":1520,"children":1521},{},[1522],{"type":30,"value":1523},"Buy",{"type":30,"value":1525}," when the capability is common, non-differentiating, and well-served by mature tools. Examples may include meeting summaries, basic document drafting, internal productivity assistants, or commodity support features.",{"type":25,"tag":26,"props":1527,"children":1528},{},[1529,1534],{"type":25,"tag":37,"props":1530,"children":1531},{},[1532],{"type":30,"value":1533},"Build",{"type":30,"value":1535}," when the capability is central to differentiation, depends on proprietary workflows or data, or must be deeply embedded into the product or operating model.",{"type":25,"tag":26,"props":1537,"children":1538},{},[1539,1544],{"type":25,"tag":37,"props":1540,"children":1541},{},[1542],{"type":30,"value":1543},"Partner",{"type":30,"value":1545}," when the opportunity is strategically important but the company needs outside software, AI, product, data, or architecture expertise to execute safely and effectively.",{"type":25,"tag":26,"props":1547,"children":1548},{},[1549,1551],{"type":30,"value":1550},"The CEO-level question is: ",{"type":25,"tag":37,"props":1552,"children":1553},{},[1554],{"type":30,"value":1555},"Where do we need ownership, and where do we simply need utility?",{"type":25,"tag":26,"props":1557,"children":1558},{},[1559],{"type":30,"value":1560},"A software development partner like Art+Logic can be especially valuable when the AI investment touches custom workflows, proprietary systems, legacy software, complex integrations, regulated environments, or product differentiation.",{"type":25,"tag":26,"props":1562,"children":1563},{},[1564],{"type":30,"value":1565},"In those cases, the challenge is rarely “Can we call an AI API?” The challenge is building a system that works reliably inside the business.",{"type":25,"tag":60,"props":1567,"children":1569},{"id":1568},"what-should-an-ai-investment-proposal-include",[1570],{"type":30,"value":1571},"What Should an AI Investment Proposal Include?",{"type":25,"tag":26,"props":1573,"children":1574},{},[1575],{"type":30,"value":1576},"A CEO-ready AI investment proposal should include:",{"type":25,"tag":1578,"props":1579,"children":1580},"ol",{},[1581,1586,1591,1596,1601,1606,1611,1616,1621,1626,1631,1636,1641,1646],{"type":25,"tag":297,"props":1582,"children":1583},{},[1584],{"type":30,"value":1585},"The business problem",{"type":25,"tag":297,"props":1587,"children":1588},{},[1589],{"type":30,"value":1590},"The proposed AI-enabled capability",{"type":25,"tag":297,"props":1592,"children":1593},{},[1594],{"type":30,"value":1595},"The workflow change required",{"type":25,"tag":297,"props":1597,"children":1598},{},[1599],{"type":30,"value":1600},"The expected value",{"type":25,"tag":297,"props":1602,"children":1603},{},[1604],{"type":30,"value":1605},"The full cost",{"type":25,"tag":297,"props":1607,"children":1608},{},[1609],{"type":30,"value":1610},"The data requirements",{"type":25,"tag":297,"props":1612,"children":1613},{},[1614],{"type":30,"value":1615},"The human-in-the-loop design",{"type":25,"tag":297,"props":1617,"children":1618},{},[1619],{"type":30,"value":1620},"The software architecture",{"type":25,"tag":297,"props":1622,"children":1623},{},[1624],{"type":30,"value":1625},"The risks and controls",{"type":25,"tag":297,"props":1627,"children":1628},{},[1629],{"type":30,"value":1630},"The owner",{"type":25,"tag":297,"props":1632,"children":1633},{},[1634],{"type":30,"value":1635},"The implementation path",{"type":25,"tag":297,"props":1637,"children":1638},{},[1639],{"type":30,"value":1640},"The success metrics",{"type":25,"tag":297,"props":1642,"children":1643},{},[1644],{"type":30,"value":1645},"The plan for testing, monitoring, and maintenance",{"type":25,"tag":297,"props":1647,"children":1648},{},[1649],{"type":30,"value":1650},"The decision point for scaling, changing, or stopping",{"type":25,"tag":26,"props":1652,"children":1653},{},[1654],{"type":30,"value":1655},"That level of clarity makes AI less mysterious. It also makes it more useful.",{"type":25,"tag":26,"props":1657,"children":1658},{},[1659],{"type":30,"value":1660},"A good AI investment case should not simply say, “This technology is powerful.” It should explain how the business will use that power responsibly to improve a measurable outcome.",{"type":25,"tag":60,"props":1662,"children":1664},{"id":1663},"what-are-the-biggest-red-flags-in-ai-investment-proposals",[1665],{"type":30,"value":1666},"What Are the Biggest Red Flags in AI Investment Proposals?",{"type":25,"tag":26,"props":1668,"children":1669},{},[1670],{"type":30,"value":1671},"CEOs should watch for these warning signs:",{"type":25,"tag":293,"props":1673,"children":1674},{},[1675,1680,1685,1690,1695,1700,1705,1710,1715,1720,1725,1730,1735],{"type":25,"tag":297,"props":1676,"children":1677},{},[1678],{"type":30,"value":1679},"The business case is based only on generic productivity assumptions.",{"type":25,"tag":297,"props":1681,"children":1682},{},[1683],{"type":30,"value":1684},"The team cannot explain the workflow impact.",{"type":25,"tag":297,"props":1686,"children":1687},{},[1688],{"type":30,"value":1689},"The proposal depends on clean data the company does not have.",{"type":25,"tag":297,"props":1691,"children":1692},{},[1693],{"type":30,"value":1694},"The demo uses examples that are much simpler than real-world work.",{"type":25,"tag":297,"props":1696,"children":1697},{},[1698],{"type":30,"value":1699},"No one has budgeted for integration or change management.",{"type":25,"tag":297,"props":1701,"children":1702},{},[1703],{"type":30,"value":1704},"Legal, security, or compliance teams are brought in only at the end.",{"type":25,"tag":297,"props":1706,"children":1707},{},[1708],{"type":30,"value":1709},"The system has no clear owner after launch.",{"type":25,"tag":297,"props":1711,"children":1712},{},[1713],{"type":30,"value":1714},"Success is measured by usage instead of business impact.",{"type":25,"tag":297,"props":1716,"children":1717},{},[1718],{"type":30,"value":1719},"The project requires high trust in outputs but has weak testing.",{"type":25,"tag":297,"props":1721,"children":1722},{},[1723],{"type":30,"value":1724},"AI-generated code is accepted without engineering review.",{"type":25,"tag":297,"props":1726,"children":1727},{},[1728],{"type":30,"value":1729},"The team cannot explain how the system works.",{"type":25,"tag":297,"props":1731,"children":1732},{},[1733],{"type":30,"value":1734},"The system has no human override path.",{"type":25,"tag":297,"props":1736,"children":1737},{},[1738],{"type":30,"value":1739},"The investment is justified mainly by fear of falling behind.",{"type":25,"tag":26,"props":1741,"children":1742},{},[1743],{"type":30,"value":1744},"Fear is not a strategy. Neither is experimentation without a path to value.",{"type":25,"tag":60,"props":1746,"children":1748},{"id":1747},"what-is-the-best-ai-investment-strategy-for-ceos",[1749],{"type":30,"value":1750},"What Is the Best AI Investment Strategy for CEOs?",{"type":25,"tag":26,"props":1752,"children":1753},{},[1754],{"type":30,"value":1755},"The best AI investment strategy is a portfolio strategy.",{"type":25,"tag":26,"props":1757,"children":1758},{},[1759],{"type":30,"value":1760},"A healthy AI portfolio includes a mix of near-term productivity gains, operational improvements, and strategic bets.",{"type":25,"tag":26,"props":1762,"children":1763},{},[1764,1769],{"type":25,"tag":37,"props":1765,"children":1766},{},[1767],{"type":30,"value":1768},"Near-term productivity gains",{"type":30,"value":1770}," help teams build AI fluency and identify practical use cases.",{"type":25,"tag":26,"props":1772,"children":1773},{},[1774,1779],{"type":25,"tag":37,"props":1775,"children":1776},{},[1777],{"type":30,"value":1778},"Operational improvements",{"type":30,"value":1780}," target measurable workflows where better automation, analysis, or decision support can improve business performance.",{"type":25,"tag":26,"props":1782,"children":1783},{},[1784,1789],{"type":25,"tag":37,"props":1785,"children":1786},{},[1787],{"type":30,"value":1788},"Strategic bets",{"type":30,"value":1790}," explore new products, services, business models, or defensible capabilities that may take longer to mature.",{"type":25,"tag":26,"props":1792,"children":1793},{},[1794],{"type":30,"value":1795},"The portfolio should be reviewed regularly. Some experiments should be stopped. Some should be merged. Some should receive more funding. Some should move from innovation budgets into operating budgets.",{"type":25,"tag":26,"props":1797,"children":1798},{},[1799],{"type":30,"value":1800},"That last point matters.",{"type":25,"tag":26,"props":1802,"children":1803},{},[1804],{"type":30,"value":1805},"Once an AI system becomes part of how the business runs, it is no longer an experiment. It is infrastructure.",{"type":25,"tag":26,"props":1807,"children":1808},{},[1809],{"type":30,"value":1810},"And infrastructure needs engineering discipline.",{"type":25,"tag":60,"props":1812,"children":1814},{"id":1813},"final-takeaway-ceos-should-evaluate-ai-as-responsible-software",[1815],{"type":30,"value":1816},"Final Takeaway: CEOs Should Evaluate AI as Responsible Software",{"type":25,"tag":26,"props":1818,"children":1819},{},[1820],{"type":30,"value":1821},"AI can be transformative, but only when it is evaluated as more than technology.",{"type":25,"tag":26,"props":1823,"children":1824},{},[1825],{"type":30,"value":1826},"For CEOs, the mandate is clear: do not evaluate AI by the quality of the demo. Evaluate it by the quality of the business case, the workflow design, the human oversight model, and the engineering discipline behind it.",{"type":25,"tag":26,"props":1828,"children":1829},{},[1830],{"type":30,"value":1831},"The companies that create lasting value with AI will not necessarily be the ones that spend the most or automate the fastest. They will be the ones that connect AI investments to measurable business outcomes, redesign workflows around those capabilities, keep humans responsible where it matters, and build software that can be trusted, explained, maintained, and improved.",{"type":25,"tag":26,"props":1833,"children":1834},{},[1835],{"type":30,"value":1836},"AI investment is a strategy decision. It is an operating model decision. It is a governance decision. It is a software engineering decision. And increasingly, it is a leadership decision.",{"type":25,"tag":60,"props":1838,"children":1840},{"id":1839},"faqs",[1841],{"type":30,"value":1842},"FAQs",{"type":25,"tag":1844,"props":1845,"children":1847},"h4",{"id":1846},"how-should-ceos-evaluate-ai-investments",[1848],{"type":30,"value":1849},"How should CEOs evaluate AI investments?",{"type":25,"tag":26,"props":1851,"children":1852},{},[1853],{"type":30,"value":1854},"CEOs should evaluate AI investments by asking whether they improve a measurable business outcome, change a real workflow, include appropriate human oversight, have a realistic path to production, and create value that outweighs cost and risk.",{"type":25,"tag":1844,"props":1856,"children":1858},{"id":1857},"why-should-ceos-treat-ai-as-a-software-investment-1",[1859],{"type":30,"value":1860},"Why should CEOs treat AI as a software investment?",{"type":25,"tag":26,"props":1862,"children":1863},{},[1864],{"type":30,"value":1865},"CEOs should treat AI as a software investment because AI only creates durable value when it is integrated into reliable systems, workflows, data sources, interfaces, security controls, and maintenance processes. A demo is not the same thing as production software.",{"type":25,"tag":1844,"props":1867,"children":1869},{"id":1868},"why-is-human-in-the-loop-ai-important-1",[1870],{"type":30,"value":1871},"Why is human-in-the-loop AI important?",{"type":25,"tag":26,"props":1873,"children":1874},{},[1875],{"type":30,"value":1876},"Human-in-the-loop AI is important because people need to remain accountable for high-impact decisions, customer-facing actions, regulated workflows, and production software. Human oversight helps improve accuracy, trust, transparency, and risk management.",{"type":25,"tag":1844,"props":1878,"children":1880},{"id":1879},"can-ai-write-production-code-without-software-engineers",[1881],{"type":30,"value":1882},"Can AI write production code without software engineers?",{"type":25,"tag":26,"props":1884,"children":1885},{},[1886],{"type":30,"value":1887},"AI can generate code, but software engineers still need to review, test, secure, document, maintain, and take responsibility for that code. AI-generated code should be treated as a starting point, not as a finished software product.",{"type":25,"tag":1844,"props":1889,"children":1891},{"id":1890},"what-value-does-a-software-development-firm-add-to-an-ai-project",[1892],{"type":30,"value":1893},"What value does a software development firm add to an AI project?",{"type":25,"tag":26,"props":1895,"children":1896},{},[1897],{"type":30,"value":1898},"A software development firm can help turn an AI idea into a working system by designing the architecture, integrating data and tools, building user workflows, testing outputs, managing risk, reviewing code, and ensuring the software remains maintainable over time.",{"type":25,"tag":1844,"props":1900,"children":1902},{"id":1901},"what-is-the-most-important-question-ceos-should-ask-about-ai-roi",[1903],{"type":30,"value":1904},"What is the most important question CEOs should ask about AI ROI?",{"type":25,"tag":26,"props":1906,"children":1907},{},[1908],{"type":30,"value":1909},"The most important question is: what business result will improve? AI ROI should be measured through outcomes such as lower cost, faster cycle time, higher revenue, better customer experience, improved quality, increased capacity, reduced risk, or better maintainability.",{"type":25,"tag":1844,"props":1911,"children":1913},{"id":1912},"why-do-ai-projects-fail-after-proof-of-concept",[1914],{"type":30,"value":1915},"Why do AI projects fail after proof of concept?",{"type":25,"tag":26,"props":1917,"children":1918},{},[1919],{"type":30,"value":1920},"AI projects often fail after proof of concept because the demo works, but the business environment is not ready. Common causes include poor data quality, unclear business value, escalating costs, weak governance, integration challenges, and lack of workflow redesign.",{"type":25,"tag":1844,"props":1922,"children":1924},{"id":1923},"should-ceos-focus-on-ai-tools-or-ai-capabilities",[1925],{"type":30,"value":1926},"Should CEOs focus on AI tools or AI capabilities?",{"type":25,"tag":26,"props":1928,"children":1929},{},[1930],{"type":30,"value":1931},"CEOs should focus on AI capabilities. A tool is only valuable if it helps the business do something meaningfully better, such as make faster decisions, automate a high-value workflow, improve a customer experience, or create a differentiated product feature.",{"type":25,"tag":1844,"props":1933,"children":1935},{"id":1934},"what-should-every-ai-investment-proposal-include",[1936],{"type":30,"value":1937},"What should every AI investment proposal include?",{"type":25,"tag":26,"props":1939,"children":1940},{},[1941],{"type":30,"value":1942},"Every AI investment proposal should include the business problem, proposed capability, expected value, workflow impact, data requirements, human oversight model, software architecture, full cost, risks, governance controls, owner, implementation path, success metrics, and maintenance plan.",{"type":25,"tag":1844,"props":1944,"children":1946},{"id":1945},"how-should-ceos-decide-whether-to-build-buy-or-partner-on-ai",[1947],{"type":30,"value":1948},"How should CEOs decide whether to build, buy, or partner on AI?",{"type":25,"tag":26,"props":1950,"children":1951},{},[1952],{"type":30,"value":1953},"CEOs should buy AI when the capability is common, build when it is strategically differentiating, and partner when the opportunity is important but the company needs outside software, AI, product, data, or architecture expertise to execute safely and effectively.",{"title":8,"searchDepth":1955,"depth":1955,"links":1956},3,[1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977],{"id":62,"depth":1955,"text":65},{"id":219,"depth":1955,"text":222},{"id":273,"depth":1955,"text":276},{"id":364,"depth":1955,"text":367},{"id":513,"depth":1955,"text":516},{"id":622,"depth":1955,"text":625},{"id":709,"depth":1955,"text":712},{"id":823,"depth":1955,"text":826},{"id":869,"depth":1955,"text":872},{"id":909,"depth":1955,"text":912},{"id":959,"depth":1955,"text":962},{"id":1012,"depth":1955,"text":1015},{"id":1141,"depth":1955,"text":1144},{"id":1210,"depth":1955,"text":1213},{"id":1322,"depth":1955,"text":1325},{"id":1507,"depth":1955,"text":1510},{"id":1568,"depth":1955,"text":1571},{"id":1663,"depth":1955,"text":1666},{"id":1747,"depth":1955,"text":1750},{"id":1813,"depth":1955,"text":1816},{"id":1839,"depth":1955,"text":1842,"children":1978},[1979,1981,1982,1983,1984,1985,1986,1987,1988,1989],{"id":1846,"depth":1980,"text":1849},4,{"id":1857,"depth":1980,"text":1860},{"id":1868,"depth":1980,"text":1871},{"id":1879,"depth":1980,"text":1882},{"id":1890,"depth":1980,"text":1893},{"id":1901,"depth":1980,"text":1904},{"id":1912,"depth":1980,"text":1915},{"id":1923,"depth":1980,"text":1926},{"id":1934,"depth":1980,"text":1937},{"id":1945,"depth":1980,"text":1948},"markdown","content:cperez:2026-06-30:how-ceos-should-evaluate-ai-investments.md","content","cperez/2026-06-30/how-ceos-should-evaluate-ai-investments.md","cperez/2026-06-30/how-ceos-should-evaluate-ai-investments","md",[1997,2010,2019,2032,2047,2059,2067,2077,2088,2097,2109,2120,2131,2140,2150,2161,2174,2185,2194,2204,2212,2219,2228,2236,2245,2255,2265,2274,2283,2291,2302,2310,2318,2327,2335,2345,2353,2361,2369,2377,2385,2393,2401,2411,2419,2429,2437,2447,2457,2468,2478,2488,2502,2513,2516,2526,2537,2549,2560,2570,2583,2592,2602,2612,2622,2634,2646,2660,2674,2689,2697,2705,2714,2723,2732,2741,2750,2759,2768,2777,2786,2797,2810,2820,2828,2836,2844,2852,2864,2876,2886,2895,2904,2914,2923,2933,2942],{"_path":1998,"title":1999,"description":2000,"image":2001,"publishDate":2002,"tags":2003,"_id":2006,"author":2007},"/alalande/2023-1/escaping_text","Thinking Like a Programmer: Escaping Text","In this progressive and vivid explanation, we explore the HOW and WHY of quoting, nesting, and escaping text.","/alalande/2023-1/img/header.png","2024-02-15",[2004,2005],"series","educational","content:alalande:2023-1:escaping_text.md",{"user":2008,"name":2009},"alalande","Anthony Lalande",{"_path":2011,"title":2012,"description":2013,"image":2014,"publishDate":2015,"tags":2016,"_id":2017,"author":2018},"/alalande/2023-2/heuristics","Thinking Like a Programmer: Heuristics","We want to help you turbo-charge your decision making.","/alalande/2023-2/img/heuristics.png","2024-03-15",[2004,2005],"content:alalande:2023-2:heuristics.md",{"user":2008,"name":2009},{"_path":2020,"title":2021,"description":2022,"tags":2023,"publishDate":2026,"image":2027,"_id":2028,"author":2029},"/areichert/2023-10/rapid-testing-techniques-for-web-and-mobile","Rapid Testing Techniques for Web & Mobile Apps","Testing rapidly or the need to test quickly under shortened execution cycles is not new. Rapid testing has been around for as long as software testing has existed but increases when a product release is imminent, strained, or behind schedule. There are many reasons development gets behind schedule. Similar to testing, development is prone to surprise requirements changes and increases in scope and complexity.",[2024,2025],"software-testing","qa","2024-06-01","/areichert/2023-10/img/rapid_testing.png","content:areichert:2023-10:Rapid Testing techniques for web and mobile.md",{"user":2030,"name":2031},"areichert","Amy Reichert",{"_path":2033,"title":2034,"description":2035,"image":2036,"publishDate":2037,"tags":2038,"_id":2043,"author":2044},"/asherbrooke/2020-4/watchwah","Bringing an Idea to Life: WatchWah Proof of Concept","\"Wouldn't it be cool if...\"","/asherbrooke/2020-4/img/Guitar_and_Watch.jpeg","2020-04-01",[2039,2040,2041,2042],"ios","apple","watch","juce","content:asherbrooke:2020-4:watchwah.md",{"user":2045,"name":2046},"asherbrooke","Andrew Sherbrooke",{"_path":2048,"title":2049,"description":2050,"publishDate":2051,"tags":2052,"_id":2055,"author":2056},"/avogan/2012-07/salt","What Your Users Don't Know (Part 1)","What's wrong with this code?","2012-07-13",[2053,2054,2004],"cryptography","security","content:avogan:2012-07:salt.md",{"user":2057,"name":2058},"avogan","Andrew Vogan",{"_path":2060,"title":2061,"description":2062,"publishDate":2063,"tags":2064,"_id":2065,"author":2066},"/avogan/2012-07/salt-2","What Your Users Don't Know (Part 2)","In my last post we saw that what your users don't know can hurt them. In other words, how securely you handle your users' private data behind the scenes can have profound implications both for your business and your users' well being. To put it bluntly, it's bad for your business to be publicly shamed over your handling of sensitive data, and it's bad for your users to have their bank accounts pilfered -- those being some of the worse case scenarios.","2012-07-26",[2053,2054,2004],"content:avogan:2012-07:salt-2.md",{"user":2057,"name":2058},{"_path":2068,"title":2069,"description":2070,"publishDate":2071,"image":2072,"_id":2073,"author":2074},"/bporter/2012-5/cd_player","My First CD Player","I started college right about the time when the first CD players were coming onto the market -- there weren't many available, and they were all obscenely expensive. At the time, my dad was dong a lot of traveling to Japan for business, and he was able to bring me a really nice Yamaha CD player back from a shop in Akihabara for about 1/4th of what a similar unit would have cost me here in the US.","2012-05-01","/bporter/2012-5/img/cd_player.jpg","content:bporter:2012-5:cd_player.md",{"user":2075,"name":2076},"bporter","Brett Porter",{"_path":2078,"title":2079,"description":2080,"publishDate":2081,"tags":2082,"image":2085,"_id":2086,"author":2087},"/bporter/2012-5/improtech","ImproTech Paris-New York 2012","Last week, I took a vacation day to attend one day of workshops at NYU as part of ImproTech 2012 Paris-New York That website descibes the event as:","2012-05-24",[2083,2084],"improvisation","music","/bporter/2012-5/img/affichemartin.jpg","content:bporter:2012-5:improtech.md",{"user":2075,"name":2076},{"_path":2089,"title":2090,"description":2091,"publishDate":2092,"tags":2093,"_id":2095,"author":2096},"/bporter/2012-5/learntocode","Yes, Do Learn To Code!","My usual pre-work routine is to walk the dog (working at home, this is my counterpart to a commute), pour my first cup of coffee, and then curl up for a little while with Google Reader. I don't know if it's because I've selected feeds that are too closely aligned with my values and personal agenda, but it's really rare that I'll read a post that is just so wrong that it makes me angry. Jeff Atwood wrote a post like that: Please Don't Learn To Code","2012-05-15",[2094],"learn-to-code","content:bporter:2012-5:learntocode.md",{"user":2075,"name":2076},{"_path":2098,"title":2099,"description":2100,"publishDate":2101,"tags":2102,"image":2106,"_id":2107,"author":2108},"/bporter/2012-6/dsl","Watch Your Language","Interesting to see a theme emerge in my Pinboard account this week -- lots of stuff about the idea of 'programming language'. I've spent the last few weeks preparing to dive back into a personal interactive music project that I've been working on sporadically since I was in graduate school. I had recently realized that the conceptual roadblock I hit before my last hiatus was something that I'd need to address by adding some sort of little programming language into the system. After following Martin Fowler's many blog posts over the years discussing domain specific languages, I finally broke down and bought his book on the topic. It's too early yet for me to have much concrete to say about the book, but I remember getting enough out of those blog posts to be confident that it will be worth the money and time to read.","2012-06-29",[2103,2104,2105],"dsl","erlang","go","/bporter/2012-6/img/dsl.jpg","content:bporter:2012-6:dsl.md",{"user":2075,"name":2076},{"_path":2110,"title":2111,"description":2112,"image":2113,"publishDate":2114,"tags":2115,"_id":2118,"author":2119},"/bporter/2019-3/animator","Friz: A flexible animation controller for JUCE","As is often the case, I found myself working on a personal project and had some UI elements that really wanted to have some life to them on the screen.","/bporter/2019-3/img/animator.png","2019-03-01",[2042,2116,2117],"ui","c++","content:bporter:2019-3:animator.md",{"user":2075,"name":2076},{"_path":2121,"title":2122,"description":2123,"image":2124,"publishDate":2125,"tags":2126,"_id":2129,"author":2130},"/bporter/2019-4/aesannounce","Art+Logic In the Real World","There are a few events coming up in the next few weeks where A+L will have people in attendance. If you're going to be there or nearby, please get in touch and we'll meet up.","/bporter/2019-4/img/aesLogo.jpg","2019-04-01",[2127,2128],"a+l","event","content:bporter:2019-4:aesAnnounce.md",{"user":2075,"name":2076},{"_path":2132,"title":2133,"description":2134,"image":2135,"publishDate":2136,"tags":2137,"_id":2138,"author":2139},"/bporter/2020-10/reanimated","Re-animated","Last year, I posted here about an animation control framework called 'Friz' that works within the JUCE Application Framework.","/bporter/2020-10/img/module.png","2020-10-01",[2042,2116,2117],"content:bporter:2020-10:reanimated.md",{"user":2075,"name":2076},{"_path":2141,"title":2142,"description":2143,"image":2144,"publishDate":2114,"tags":2145,"_id":2146,"author":2147},"/bstevens/2019-3","Coding the Impossible","As you can see on the Art+Logic website, our slogan is Coding the \"impossible.\"®","/bstevens/2019-3/img/impossible.png",[2127],"content:bstevens:2019-3:index.md",{"user":2148,"name":2149},"bstevens","Ben Stevens",{"_path":2151,"title":2152,"description":2153,"publishDate":2154,"tags":2155,"_id":2157,"author":2158},"/ckeefer/2013-1/misc","JS Hints & Shortcuts","During the course of any complex project (and even many simple ones), on the way to accomplish the actual goal, you're certain to encounter any number of small hurdles along the way - little problems which need to be resolved for the bigger picture to come into focus.","2013-09-01",[2156],"js","content:ckeefer:2013-1:misc.md",{"user":2159,"name":2160},"ckeefer","Christopher Keefer",{"_path":2162,"title":2163,"description":2164,"publishDate":2165,"tags":2166,"image":2171,"_id":2172,"author":2173},"/ckeefer/2013-2/xslt","XML and XSLT","Not terribly long ago, XML was the darling of the web. HTML4 was reformulated as XHTML 1.0, SOAP messages were XML, and let us not forget XMLHttpRequest.","2013-10-08",[2167,2168,2169,2170],"data-formats","xml","xsl","xslt","/ckeefer/2013-2/img/xslt-processing.png","content:ckeefer:2013-2:xslt.md",{"user":2159,"name":2160},{"_path":2175,"title":2176,"description":2177,"publishDate":2178,"tags":2179,"image":2182,"_id":2183,"author":2184},"/ckeefer/2013-3/ajax-upload","Ajax Upload Part I: Framed (and jQuery Deferred)","Inevitably, people want their files on the Internet. If your project is about cute cats, someone will task you with allowing users to upload photos of their cats, videos of their cats, long rambling audio clips in which they attempt to convince their cat to stop attacking the microphone, etcetera. If your project is about the nature and proclivities of mold, someone, somewhere will want to share detailed photographic evidence of their mold problem. The need to upload files is a given.","2013-03-20",[2156,2180,2181],"jquery","html5","/ckeefer/2013-3/img/upframe.jpg","content:ckeefer:2013-3:ajax-upload.md",{"user":2159,"name":2160},{"_path":2186,"title":2187,"description":2188,"publishDate":2189,"tags":2190,"_id":2192,"author":2193},"/ckeefer/2013-4/teaching-programming","Can (and Should) Everyone Learn to Program?","Fair warning: The following article is long, rambly, and contains no code. It does, however, contain some rumination on the idea that everyone can and should learn to program.","2013-12-03",[2191],"programming","content:ckeefer:2013-4:teaching-programming.md",{"user":2159,"name":2160},{"_path":2195,"title":2196,"description":2197,"publishDate":2198,"tags":2199,"image":2201,"_id":2202,"author":2203},"/ckeefer/2013-5/ajax-uploader","Ajax Upload XHR2, Take 2","It's a pleasure to be able to interact with files in the browser at long last, isn't it? Reading files in without needing to bounce them against the server first opens up a lot of possibilities - and getting progress from a chunked ajax upload is miles away from the indeterminate form uploads of days past.","2014-02-19",[2180,2156,2200],"xhr2","/ckeefer/2013-5/img/html5.jpg","content:ckeefer:2013-5:ajax-uploader.md",{"user":2159,"name":2160},{"_path":2205,"title":2206,"description":2207,"publishDate":2208,"tags":2209,"_id":2210,"author":2211},"/ckeefer/2013-07/anchors-hash","Anchors, Hash Sign, javascript:void(0)","So, you've got a link that, in reality, is just a click target for performing some javascript function. You want the appearance of a standard anchor link, but if it's not performing the intended function, should it really be an anchor? And if so, what should we fill that 'href' attribute in with?","2013-07-29",[2156],"content:ckeefer:2013-07:anchors-hash.md",{"user":2159,"name":2160},{"_path":2213,"title":2214,"description":2215,"publishDate":2216,"_id":2217,"author":2218},"/ckeefer/2013-07/static-vmware-host","Static Hosting with VMWare","Virtualization is one of the many benefits of the excess (metaphorical) horsepower available to us with modern hardware. Need to test against (Windows XP/7/8/NT || Fedora || Mint || Ubuntu || FreeBSD || MacOSX || etc)? Fire up the VM. Need a Linux environment for the packages your server relies on, but need to test in the iPad simulator? VM's to the rescue.","2013-07-26","content:ckeefer:2013-07:static-vmware-host.md",{"user":2159,"name":2160},{"_path":2220,"title":2221,"description":2222,"publishDate":2223,"tags":2224,"_id":2226,"author":2227},"/ckeefer/2013-08/fullproof-fulltext-search","Client-side Fulltext Searching with Fullproof","Recently, I was engaged in a genial argument with a friend of an older generation, each of us taking an opposing stance on some obscure trivia neither of us was entirely certain about - but which we were both ready to defend with all the wit and rhetoric at our disposal. When we had finally exhausted all attempts to make the other budge on the matter, we turned to an authoritative 3rd-party source to lay the matter to rest for us - a Google search.","2013-08-29",[2225,2170],"search","content:ckeefer:2013-08:fullproof-fulltext-search.md",{"user":2159,"name":2160},{"_path":2229,"title":2230,"description":2231,"publishDate":2232,"tags":2233,"_id":2234,"author":2235},"/ckeefer/2013-11/jquery-ajax-blobs","jQuery Ajax Blobs and Array Buffers","A big part of what makes jQuery a regular part of so many web projects is the clean interface it offers us for a number of sometimes messy built-in aspects of javascript. The most obvious is the DOM interface; and in second place, jquery ajax and its various shorthand methods. Abstracting away the difference between ActiveXObject and XMLHttpRequest is one of the most obvious benefits - but even if you don't need to worry about supporting old versions of IE, you might well enjoy the clean, object-based, promise-returning interface that jquery ajax offers.","2013-11-21",[2156,2180],"content:ckeefer:2013-11:jquery-ajax-blobs.md",{"user":2159,"name":2160},{"_path":2237,"title":2238,"description":2239,"publishDate":2240,"tags":2241,"_id":2243,"author":2244},"/ckeefer/2013-12/deploying-with-git","Deploying Websites with Git","Deploying your webapp is an important part of the web development equation - your client's site isn't going to attract a lot of attention sitting in your local dev directory. Deployment concerns tend to fall to the bottom of the priority list, though, and the end result tends to be kludgy, hastily thrown-together deployment scripts; and because they are so kludgy and, often, time consuming, when time crunches threaten, a developer may resort to making changes directly on the remote server that need to be (but sometimes never are) backported to the code living in your version control.","2013-12-23",[2242],"git","content:ckeefer:2013-12:deploying-with-git.md",{"user":2159,"name":2160},{"_path":2246,"title":2247,"description":2248,"publishDate":2249,"tags":2250,"image":2252,"_id":2253,"author":2254},"/ckeefer/2014-1/still-using-php","Still Using PHP?","Poor PHP. It's so lonely and unloved these days.","2014-01-29",[2251],"php","/ckeefer/2014-1/img/php.jpg","content:ckeefer:2014-1:still-using-php.md",{"user":2159,"name":2160},{"_path":2256,"title":2257,"description":2258,"publishDate":2259,"tags":2260,"image":2262,"_id":2263,"author":2264},"/ckeefer/2014-2/ajax-upload-2","Ajax Upload Part II: XHR2 (and FileReader)","So, the client has told you their users should be able to upload their drunken party pictures for all the internet to see. \"We want the very best experience possible,\" they tell you. \"Simple, seamless - maybe using that new html5 thing I've heard so much about.\"","2013-04-09",[2156,2261],"xmlhttprequest","/ckeefer/2014-2/img/html5.jpg","content:ckeefer:2014-2:ajax-upload-2.md",{"user":2159,"name":2160},{"_path":2266,"title":2267,"description":2268,"publishDate":2269,"tags":2270,"_id":2272,"author":2273},"/ckeefer/2014-3/customgmapsinfowindow","Custom Google Maps Info Windows","When it comes time to relate the ephemeral world of data to the physical world, Maps are key in both enterprise and consumer applications. Whatever else you might think of it, Google Maps tends to be the default option - certainly, its the only one I've ever had clients ask for by name.","2014-02-26",[2156,2271],"google-maps","content:ckeefer:2014-3:customgmapsinfowindow.md",{"user":2159,"name":2160},{"_path":2275,"title":2276,"description":2277,"publishDate":2278,"tags":2279,"_id":2281,"author":2282},"/ckeefer/2014-4/hidden-options","Hidden Options: A Workaround","Here's the situation: You've got a select. Maybe a whole bunch of selects, with a ton of options each (metric ton - let's keep our imaginary hyperbolic units straight here); and these are meant to be complex interactive elements, with options made visible or not as some programmatic condition dictates.","2014-04-23",[2280,2156,2180],"how-to","content:ckeefer:2014-4:hidden-options.md",{"user":2159,"name":2160},{"_path":2284,"title":2285,"description":2286,"publishDate":2287,"tags":2288,"_id":2289,"author":2290},"/ckeefer/2014-5/cgwin2","Custom Google Info Windows: Updated, Live","April 30, 2014 at 3:22 am Remy says:","2014-05-09",[2156,2271],"content:ckeefer:2014-5:cgwin2.md",{"user":2159,"name":2160},{"_path":2292,"title":2293,"description":2294,"publishDate":2295,"tags":2296,"image":2299,"_id":2300,"author":2301},"/ckeefer/2014-6/backbonesocketsync","Websockets for Backbone","Backbone's had some of its thunder stolen lately by trendier frameworks like Meteor and Angular; for good reason, in most cases, as without the prosthetic functionality offered by the likes of Marionette, Backbone's view handling (amongst a few other lacks and warts) is really just 'roughed in'.","2014-06-25",[2156,2297,2298],"websockets","backbone","/ckeefer/2014-6/img/WebsocketsPlusBackbone.png","content:ckeefer:2014-6:backbonesocketsync.md",{"user":2159,"name":2160},{"_path":2303,"title":2304,"description":2305,"publishDate":2306,"tags":2307,"_id":2308,"author":2309},"/ckeefer/2014-7/promises","It's a (jQuery-style) Promise","Way back when I brought up the topic of promises (particularly, jQuery Deferred), and I promised we would come back to the topic someday.","2014-10-16",[2156,2180],"content:ckeefer:2014-7:promises.md",{"user":2159,"name":2160},{"_path":2311,"title":2312,"description":2313,"publishDate":2314,"tags":2315,"_id":2316,"author":2317},"/ckeefer/2014-8/behold-views","Behold! (JavaScript Views)","JavaScript has the propensity to be very untidy - if you let it, it will sprawl all over the place. Hundreds of global variables scattered across dozens of files, messy half-measures towards object-orientation, mixed in seemingly at random with ungrouped functions - anyone who's had a client bring them a failed project from some other development team knows just how bad it can get.","2015-01-07",[2156],"content:ckeefer:2014-8:behold-views.md",{"user":2159,"name":2160},{"_path":2319,"title":2320,"description":2321,"publishDate":2322,"tags":2323,"image":2324,"_id":2325,"author":2326},"/ckeefer/2015-1/writeonce","Write Once, Debug Everywhere","It's pretty seldom that anyone mentions web pages these days, other than in historical reference to days long gone by (yes, a whole few years ago). Web sites, sure, but not if what is really wanted is to replace something that, not so long ago, would have been some native code for a smartphone (or a little further back still, a desktop computer). Generally speaking, the most common term tripping from client's lips these days is 'web applications' - or webapps, because who has time for spaces and proper spelling, amirite?","2015-02-02",[2156],"/ckeefer/2015-1/img/html5java.jpg","content:ckeefer:2015-1:writeonce.md",{"user":2159,"name":2160},{"_path":2328,"title":2329,"description":2330,"publishDate":2331,"tags":2332,"_id":2333,"author":2334},"/ckeefer/2015-2/js-frameworks","The What and Why of Javascript Frameworks","JavaScript has the propensity to be very untidy if you let it be. This isn't a problem unique to JavaScript, of course - many other languages suffer from a lack of native organization, especially for specific tasks.","2015-05-29",[2156],"content:ckeefer:2015-2:js-frameworks.md",{"user":2159,"name":2160},{"_path":2336,"title":2337,"description":2338,"publishDate":2339,"tags":2340,"_id":2343,"author":2344},"/ckeefer/2015-3/emailvalidation","Email Validation with Django and python-social-auth","When it comes to user accounts, the standard litmus test is email validation. Besides the immediate benefits - of offering us a straightforward unique identifier for users, and making it more difficult to automate creating a mass of accounts on our service - by requiring that each account have an email address and interact therewith to confirm the addresses validity, it also offers us the chance to associate a known-working email account with a user account. This is important for transactional emails such as password resets or for potential two-factor authentication use... and if you're a little less ethical, for sending marketing desirable and informative emails about interesting products and services.","2015-07-23",[2341,2342],"python","django","content:ckeefer:2015-3:EmailValidation.md",{"user":2159,"name":2160},{"_path":2346,"title":2347,"description":2348,"publishDate":2349,"tags":2350,"_id":2351,"author":2352},"/ckeefer/2015-5/file-reader-chunking","FileReader Chunking and Base64 DataURLs","In a hurry? You can now use our HUp jquery plugin to read files in a chunked fashion as data URLs. Hooray!","2015-12-15",[2156,2180],"content:ckeefer:2015-5:file-reader-chunking.md",{"user":2159,"name":2160},{"_path":2354,"title":2355,"description":2356,"publishDate":2357,"tags":2358,"_id":2359,"author":2360},"/ckeefer/2016-1/ajaxbinarycaching","Caching Binary Data With jQuery Ajax and IndexedDB","After long, grueling months (years? or does it only feel like years?), your web application nears completion. It is tightly coded, well documented, works across all modern browsers, and is well received by your beta testers. It's nearly time to go live, and a smile of pure relief plays upon your lips... and freezes into a rictus grin when your client turns to you, and asks, \"so, hey, can we speed up the dynamic cat pic loading? Especially when I close the browser and come back to it later. I think that's really key to the whole application.\"","2016-04-25",[2156,2180],"content:ckeefer:2016-1:ajaxBinaryCaching.md",{"user":2159,"name":2160},{"_path":2362,"title":2363,"description":2364,"publishDate":2365,"tags":2366,"_id":2367,"author":2368},"/ckeefer/2016-2/paymentprocessing","Payment Processing with Braintree","You've built the web application of the century, and the users have rightly flooded to it. Cat pictures for everyone!","2016-05-11",[2342,2156,2180,2341],"content:ckeefer:2016-2:paymentprocessing.md",{"user":2159,"name":2160},{"_path":2370,"title":2371,"description":2372,"publishDate":2373,"tags":2374,"_id":2375,"author":2376},"/ckeefer/2016-3/djangochannels1","Django Channels: From the Ground Up - Part 1","You stare mournfully into the mass of code you've inherited. At some point, it's clear, the requirements called for the server to push information to the client, because there's an unholy mix of Server-Side Events, long-polling, hidden iframes and even a Java applet in there, all supporting some level of long-term connectivity with the server. It's almost fascinating in its barely functional hideousness, and you would be inclined to leave well enough alone... except for the new feature specifications you've been assigned, which require the client to be able to send data back to the server in response to the received events, in as close to real-time as you can get.","2016-06-13",[2342,2341,2297],"content:ckeefer:2016-3:djangoChannels1.md",{"user":2159,"name":2160},{"_path":2378,"title":2379,"description":2380,"publishDate":2381,"tags":2382,"_id":2383,"author":2384},"/ckeefer/2016-4/djangochannels2","Django Channels: From the Ground Up - Part 2","Last time, we decided to embark on a brave new adventure and give our Django framework a big upgrade with the inclusion of Django Channels. We got just far enough to get the development server running, but while this may be an adequate start, it's better to develop against something like what we intend to deploy, right?","2016-06-15",[2342,2341,2297],"content:ckeefer:2016-4:djangochannels2.md",{"user":2159,"name":2160},{"_path":2386,"title":2387,"description":2388,"publishDate":2389,"tags":2390,"_id":2391,"author":2392},"/ckeefer/2016-6/gofetch1","Go Fetch! (JavaScript Fetch API)","Long ago, we briefly brushed upon the topic of what has made jQuery such a valuable part of the web developer's toolset for such a long time - namely, a cleaner interface for interacting with the DOM, and the $.ajax abstraction over XMLHttpRequest.","2016-10-03",[2156,2180,2004],"content:ckeefer:2016-6:goFetch1.md",{"user":2159,"name":2160},{"_path":2394,"title":2395,"description":2396,"publishDate":2397,"tags":2398,"_id":2399,"author":2400},"/ckeefer/2016-7/gofetch2","Go Fetch 2! (JavaScript Fetch API)","Last time we discussed the Fetch API in general, taking a look at how it differed from the XMLHttpRequest API, and some of its advantages. Today, we're going to take a look at a little library that you can include in your projects today that offers you localStorage caching for the Fetch API.","2016-10-10",[2156,2180,2004],"content:ckeefer:2016-7:goFetch2.md",{"user":2159,"name":2160},{"_path":2402,"title":2403,"description":2404,"publishDate":2405,"tags":2406,"_id":2409,"author":2410},"/ckeefer/2016-8/herokupdf","Generating PDFs: wkhtmltopdf & Heroku","So, it has come to this.","2016-12-21",[2407,2408,2341],"heroku","pdf","content:ckeefer:2016-8:HerokuPDF.md",{"user":2159,"name":2160},{"_path":2412,"title":2413,"description":2414,"publishDate":2415,"tags":2416,"_id":2417,"author":2418},"/ckeefer/2017-1/downloadingclientsidecontent","Downloading Client-side Generated Content","A young developer, new to the Tao of the client-side, comes to a Master of the way, and speaks thusly: \"Oh Master, our application nears completion; and lo, cat pics can be drawn upon, and captions fixated thereto, for the creation of humour and the bounteous enjoyment of our users.\"","2017-02-06",[2156],"content:ckeefer:2017-1:downloadingclientsidecontent.md",{"user":2159,"name":2160},{"_path":2420,"title":2421,"description":2422,"publishDate":2423,"tags":2424,"_id":2427,"author":2428},"/ckeefer/2017-2/morepwatoya-part1","More PWA to Ya! (Progressive Web Apps, Part 1)","It's project kickoff time, and you're having a conversation with your client about what form the application will take:","2017-02-01",[2425,2426,2004],"pwa","mobile","content:ckeefer:2017-2:MorePWAToYa-Part1.md",{"user":2159,"name":2160},{"_path":2430,"title":2431,"description":2432,"tags":2433,"publishDate":2434,"_id":2435,"author":2436},"/ckeefer/2017-3/morepwatoya-part2","More PWA to Ya! (Progressive Web Apps, Part 2)","Last time, we got into the nitty gritty on how to make your web application into a Progressive Web Application (PWA to it's friends). I promised we'd dig even deeper this time, and show you how to make your web app a little more 'native' on Android - and how to deal with iOS Safari's special snowflake syndrome.",[2426,2425,2004],"2017-03-01","content:ckeefer:2017-3:MorePWAToYa-Part2.md",{"user":2159,"name":2160},{"_path":2438,"title":2439,"description":2440,"image":2441,"publishDate":2442,"tags":2443,"_id":2445,"author":2446},"/ckeefer/2019-1/unlockingwebaudio","Unlocking Web Audio","\"It's going to be the coolest thing ever.\"","/ckeefer/2019-1/img/featured_image.jpg","2019-01-01",[2156,2444],"audio","content:ckeefer:2019-1:UnlockingWebAudio.md",{"user":2159,"name":2160},{"_path":2448,"title":2449,"description":2450,"publishDate":2451,"image":2452,"tags":2453,"_id":2455,"author":2456},"/ckeefer/2020-1/why-vue","Why Vue","Why choose Vue over any other front-end framework?","2020-01-01","/ckeefer/2020-1/img/vue-wall.jpg",[2156,2454],"vue","content:ckeefer:2020-1:Why Vue.md",{"user":2159,"name":2160},{"_path":2458,"title":2459,"description":2460,"tags":2461,"image":2464,"publishDate":2465,"_id":2466,"author":2467},"/ckeefer/2024-3/e2e_testing","E2E Testing: To What End?","Friend, can we agree that tests are a good idea? I won't scorn you for sometimes omitting them - time and budget constraints are what they are, and even the best intentioned of us sometimes have to just give our projects a lick and a promise. \"Proper test coverage soon\", you sweetly croon as you rock it to sleep, the knowledge that you're telling a dark, terrible lie twisting you up inside. Maybe you could just scrape enough budget together for some simple unit tests? Then, at least, you'd have \"tests\", right?",[2025,2024,2462,2463],"e2e","playwright","/ckeefer/2024-3/img/E2E_Testing_2024.png","2024-06-15","content:ckeefer:2024-3:e2e_testing.md",{"user":2159,"name":2160},{"_path":2469,"title":2470,"description":2471,"tags":2472,"image":2474,"publishDate":2475,"_id":2476,"author":2477},"/ckeefer/2024-7/vpubsub","Vue 3 Pub / Sub: All aboard the (event) bus","We like Vue at A+L. We think it's one of the best frontend frameworks, and a great choice pretty much anywhere you might otherwise be tempted to use React.",[2156,2454,2473],"pub/sub","/ckeefer/2024-7/img/event_bus.png","2024-08-15","content:ckeefer:2024-7:VPubSub.md",{"user":2159,"name":2160},{"_path":2479,"title":2480,"description":2481,"publishDate":2482,"tags":2483,"_id":2484,"author":2485},"/cmacksey/2012-5/php-musings","PHP Musings","Ran into an interesting, but thorough, rant the other day - PHP: A Fractal of Bad Design. The part that grabbed me the most was the analogy at the beginning, which was all too perfect:","2012-05-07",[2251],"content:cmacksey:2012-5:php-musings.md",{"user":2486,"name":2487},"cmacksey","Chris Macksey",{"_path":2489,"title":2490,"description":2491,"publishDate":2492,"image":2493,"author":2494,"tags":2495,"_id":2501},"/cperez/2026-06-17/xamarin-to-maui","Migrating a Xamarin Medical Application to .NET MAUI","A widely used medical reference application built with Xamarin had become increasingly difficult to maintain as platform support deadlines approached. The client needed to modernize the application before operating system changes and framework deprecations created larger compatibility risks.","2026-06-22","/cperez/2026-06-17/img/xamarin-to-maui.png",{"name":13,"user":14},[2496,2497,2498,2499,2500,2426],"legacy modernization","xamarin",".net","maui","app migration","content:cperez:2026-06-17:xamarin-to-maui.md",{"_path":2503,"title":2504,"description":2505,"publishDate":2506,"image":2507,"author":2508,"tags":2509,"_id":2512},"/cperez/2026-06-25/ai_makes_modernization_feasible","How AI-Assisted Legacy Modernization Reduces Cost, Risk, and Project Timelines","Many organizations know they need to modernize their legacy applications. They also know why they haven't.","2026-06-25","/cperez/2026-06-25/img/ai_makes_modernization_feasible.png",{"name":13,"user":14},[2496,2510,19,2511],"tech debt","legacy migration","content:cperez:2026-06-25:ai_makes_modernization_feasible.md",{"_path":5,"title":9,"description":10,"publishDate":6,"image":11,"author":2514,"tags":2515,"_id":1991},{"name":13,"user":14},[16,17,18,19,20],{"_path":2517,"title":2518,"description":2519,"publishDate":2520,"image":2521,"author":2522,"tags":2523,"_id":2525},"/cperez/2026-07-02/hidden-costs-of-legacy-software","What Are the Hidden Costs of Legacy Software?","Legacy software is rarely “bad” software.","2026-07-02","/cperez/2026-07-02/img/hidden-costs-of-legacy-software.jpg",{"name":13,"user":14},[2496,2524],"legacy software","content:cperez:2026-07-02:hidden-costs-of-legacy-software.md",{"_path":2527,"title":2528,"description":2529,"publishDate":2530,"image":2531,"author":2532,"tags":2533,"_id":2536},"/cperez/2026-07-07/why-ai-projects-fail","Why Do Most AI Projects Fail?","AI projects rarely fail because the model was not powerful enough.","2026-07-07","/cperez/2026-07-07/img/why-ai-projects-fail.jpg",{"name":13,"user":14},[19,2534,20,2535],"ethics","vibe coding","content:cperez:2026-07-07:why-ai-projects-fail.md",{"_path":2538,"title":2539,"description":2540,"publishDate":2541,"image":2542,"author":2543,"tags":2544,"_id":2548},"/cperez/2026-07-09/5-rs-application-modernization-legacy-software","Art+Logic’s 5 Rs of Application Modernization: How to Choose the Right Path for Legacy Software","Legacy software creates a strange kind of tension.","2026-07-01","/cperez/2026-07-09/img/5-rs-application-modernization-legacy-software.jpg",{"name":13,"user":14},[2545,2546,19,2547],"5-rs","legacy","application modernization","content:cperez:2026-07-09:5-rs-application-modernization-legacy-software.md",{"_path":2550,"title":2551,"description":2552,"publishDate":2553,"tags":2554,"_id":2556,"author":2557},"/dpopowich/2021-07-30/data-collector","Asynchronous Python - A Real World Example","A dive into a real example of async Python usage.","2021-07-30",[2341,2280,2555],"async","content:dpopowich:2021-07-30:data-collector.md",{"user":2558,"name":2559},"dpopowich","Daniel Popowich",{"_path":2561,"title":2562,"description":2563,"tags":2564,"image":2566,"publishDate":2567,"_id":2568,"author":2569},"/dpopowich/2023-8/postgres-pubsub","Using PostgreSQL for Pub/Sub","A+L has been working on a Single Page Application (SPA) wherein our client's users take on the role of Staff Users (think: project managers) as they aid their Customer Users in using the application to complete a complex project.",[2565,2341,2555],"postgresql","/dpopowich/2023-8/img/psql_pub_sub.png","2024-04-15","content:dpopowich:2023-8:postgres-pubsub.md",{"user":2558,"name":2559},{"_path":2571,"title":2572,"description":2573,"tags":2574,"image":2577,"publishDate":2578,"_id":2579,"author":2580},"/ewahl/2025-05/escape_deployment_hell","Escape Deployment Hell: IaC, CDK, Ephemeral Environments, and the Pragmatic Path to Platform Power","Another Friday afternoon, another deployment fire. If this sounds familiar, you're not alone. On too many projects, the chasm between application code and infrastructure management breeds manual configuration nightmares, crippling complexity, and agonizingly slow development cycles. But what if your team could sidestep this chaos, focusing on building features instead of constantly battling deployment gremlins?",[2575,2576,2341],"devops","aws","/ewahl/2025-05/img/deployment_hell.png","2025-05-13","content:ewahl:2025-05:escape_deployment_hell.md",{"user":2581,"name":2582},"ewahl","Edward F. Wahl",{"_path":2584,"title":2585,"description":2586,"publishDate":2587,"image":2588,"tags":2589,"_id":2590,"author":2591},"/ewahl/2025-06/argued_with_ai","I Argued With an AI for 20 Minutes About Async Code &mdash; And I'm Surprisingly Happy","If you have ever spent twenty minutes debating an obscure AWS Lambda invocation pattern with an AI, you might question your life choices. But here I am: amused by the wasted time but ultimately happy with the outcome and understanding I gained.","2026-06-01","/ewahl/2025-06/img/argued_with_ai.png",[2575,2576,2341],"content:ewahl:2025-06:argued_with_ai.md",{"user":2581,"name":2582},{"_path":2593,"title":2594,"description":2595,"tags":2596,"image":2597,"publishDate":2125,"_id":2598,"author":2599},"/jbagley/2019-4/makingspectrogramsinjuce","Making Spectrograms in JUCE","Art+Logic's Incubator project has made a lot of progress. In a previous post I mentioned that Dr. Scott Hawley's technique to classify audio involved converting audio to an image and using a Convolution Neural Network (CNN) to classify the audio based on this image. That image is a spectrogram. I'm going to go into some detail about what we do to create one, and why to the best of my ability.",[2042,2117,2444],"/jbagley/2019-4/img/Fortissimo_Trumpet_Ensemble_Matrix_Swells_61.wav-2048x1700.png","content:jbagley:2019-4:MakingSpectrogramsInJUCE.md",{"user":2600,"name":2601},"jbagley","Jason Bagley",{"_path":2603,"title":2604,"description":2605,"tags":2606,"image":2608,"publishDate":2609,"_id":2610,"author":2611},"/jbagley/2021-07/softwaresenescence","Legacy Vulnerabilities AKA Software Senescence","Does your business still have an XT computer in the back office because it's\nrunning that one version of some database software that your business depends\non? Yeah, we know there is. Most modern software doesn't work like that.",[2546,2607],"project-management","/jbagley/2021-07/img/old_software_to_new.jpg","2021-07-01","content:jbagley:2021-07:SoftwareSenescence.md",{"user":2600,"name":2601},{"_path":2613,"title":2614,"description":2615,"tags":2616,"image":2618,"publishDate":2619,"_id":2620,"author":2621},"/jbagley/2021-08-01/accuratetiming","Accurate Timing","In many tasks we need to do something at given intervals of time. The most obvious ways may not give you the best results.",[2117,2617],"timing","/jbagley/2021-08-01/img/accurateTiming.jpg","2021-08-01","content:jbagley:2021-08-01:AccurateTiming.md",{"user":2600,"name":2601},{"_path":2623,"title":2624,"description":2625,"tags":2626,"image":2630,"publishDate":2631,"_id":2632,"author":2633},"/jbagley/2023-06-01/universal_ffmpeg_custom_builds","Building Universal FFmpeg Custom Binaries","I am using a very pared down set of FFMpeg features for a macOS project that I\nbuild into a custom library. I had a script set up to configure the build which\nworked fine on my Intel based MacBook Pro. Then I upgraded to an Apple Silicon\nMacBookPro and wanted to run natively, or at least see what happened when I\ndid. To build, FFMpeg uses autoconf which produces a makefile that then handles\nthe build.",[2627,2628,2629,2040],"c","bash","ffmpeg","/jbagley/2023-06-01/img/header.png","2024-04-01","content:jbagley:2023-06-01:Universal_FFMPEG_custom_builds.md",{"user":2600,"name":2601},{"_path":2635,"title":2636,"description":2637,"publishDate":2638,"image":2639,"tags":2640,"_id":2644,"author":2645},"/jbagley/2025-08/a_developers_primer_on_apple_tracking_transparency","A Primer on Apple's App Tracking Transparency","If an app tracks user activity, Apple requires them to declare all information they collect as well as whether that data is linked or tracked. This includes collection by the app itself and any third parties the app uses. The app owner is responsible for knowing and correctly reporting privacy information for all components in the app.","2026-05-22","/jbagley/2025-08/img/apple_app_transparency.png",[2641,2642,2039,2643],"app tracking transparency","att","macos","content:jbagley:2025-08:a_developers_primer_on_apple_tracking_transparency.md",{"user":2600,"name":2601},{"_path":2647,"title":2648,"description":2649,"tags":2650,"image":2654,"publishDate":2655,"_id":2656,"author":2657},"/jestep/2023-3/fastapi","FastAPI: A High-Performance Python Framework for Rapid Web Development","FastAPI is a modern and high-performance Python web framework designed specifically for building APIs and web applications quickly and efficiently. Developed by Sebastián Ramírez and first released in 2018, FastAPI has rapidly gained traction in the developer community thanks to its focus on providing key features for API and web app development with excellent performance.",[2341,2651,2342,2652,2653],"fastapi","flask","pyramid","/jestep/2023-3/img/header.png","2024-05-01","content:jestep:2023-3:fastapi.md",{"user":2658,"name":2659},"jestep","Jagger Estep",{"_path":2661,"title":2662,"description":2663,"publishDate":2664,"tags":2665,"image":2669,"_id":2670,"author":2671},"/nharrison/2012-07/core-data","Securing Your Core Data with Transformable Attributes","In order to store private data in an iOS Core Data database, there are several methods available for encryption, including:","2012-07-30",[2666,2667,2039,2054,2668],"core-data","encryption","objective-c","/nharrison/2012-07/img/superman.jpg","content:nharrison:2012-07:core-data.md",{"user":2672,"name":2673},"nharrison","Noah Harrison",{"_path":2675,"title":2676,"description":2677,"tags":2678,"publishDate":2683,"image":2684,"_id":2685,"author":2686},"/phendry/2019-3/restfromthebottomup","REST from the Bottom Up","The RESTful API has a funny place in the software development world: it's widely regarded as the best general-purpose pattern for building web application APIs, and yet it's also nebulous enough of a concept to cause endless disagreements within teams over exactly how to implement one.",[2679,2680,2681,2682],"rest","api","web","architecture","2019-10-01","/phendry/2019-3/img/feature_image.png","content:phendry:2019-3:RestFromTheBottomUp.md",{"user":2687,"name":2688},"phendry","Paul Hendry",{"_path":2690,"title":2691,"description":2692,"tags":2693,"publishDate":2609,"image":2694,"_id":2695,"author":2696},"/phendry/2021-06/smoothupgradestovue3","Smooth Upgrades to Vue 3","This post assumes basic familiarity with Vue.js v2.x.",[2156,2454,2280],"/phendry/2021-06/img/vue-transition.jpg","content:phendry:2021-06:SmoothUpgradesToVue3.md",{"user":2687,"name":2688},{"_path":2698,"title":2699,"description":2700,"image":2701,"tags":2702,"publishDate":2553,"_id":2703,"author":2704},"/phendry/2021-07-30/spotthevulndataranges","Spot the Vulnerability: Data Ranges and Untrusted Input","In 1997, a flaw was discovered in how Linux and Windows handled IP fragmentation, a Denial-of-Service vulnerability which allowed systems to be crashed remotely.","/phendry/2021-07-30/img/vulnerability.jpg",[2054,2004],"content:phendry:2021-07-30:SpotTheVulnDataRanges.md",{"user":2687,"name":2688},{"_path":2706,"title":2707,"description":2708,"tags":2709,"image":2710,"publishDate":2711,"_id":2712,"author":2713},"/phendry/2021-08-15/exploringdependenttypesinidris","Exploring Dependent Types in Idris","When I'm not coding the \"impossible\" at Art+Logic, I take a lot of interest in new programming technologies and paradigms; even if they're not yet viable for use in production, there can often be takeaways for improving your everyday code.",[2191],"/phendry/2021-08-15/img/dependent-types.jpg","2021-08-15","content:phendry:2021-08-15:ExploringDependentTypesInIdris.md",{"user":2687,"name":2688},{"_path":2715,"title":2716,"description":2717,"tags":2718,"image":2719,"publishDate":2720,"_id":2721,"author":2722},"/phendry/2021-10-30/spotthevulnloopsandtermconditions","Spot the Vulnerability: Loops and Terminating Conditions","In memory-unsafe languages like C, special care must be taken when copying untrusted data, particularly when copying it to another buffer. In this post, we'll spot and mitigate a past vulnerability in Linux's NTP daemon.",[2054,2004],"/phendry/2021-10-30/img/vulnerability-2.jpg","2021-10-30","content:phendry:2021-10-30:SpotTheVulnLoopsAndTermConditions.md",{"user":2687,"name":2688},{"_path":2724,"title":2725,"description":2726,"image":2727,"tags":2728,"publishDate":2729,"_id":2730,"author":2731},"/phendry/2022-07-21/migratingfromexpresstofastifypart1","Migrating from Express to Fastify, Part 1","Express.js has for years been the dominant lightweight Web framework for Node.js, but over time its development has stalled, with its latest major version (5.0) still in pre-release nearly eight years after its first alpha release. There's a lot to be said for this sort of stability in a foundational dependency for a project, but it's worth assessing whether the added features of competing frameworks are worth making a switch. In this article we'll be looking at Fastify in particular, to understand what it has to offer compared to Express and how difficult it is to migrate an existing Express project.","/phendry/2022-07-21/img/Migrating from Express to Fastify, Part 1.png",[2156,2004],"2023-12-01","content:phendry:2022-07-21:MigratingFromExpressToFastifyPart1.md",{"user":2687,"name":2688},{"_path":2733,"title":2734,"description":2735,"image":2736,"tags":2737,"publishDate":2738,"_id":2739,"author":2740},"/phendry/2022-07-28/migratingfromexpresstofastifypart2","Migrating from Express to Fastify, Part 2","In Part 1, we looked at the features of the Fastify Node.js Web framework compared to Express.js. In Part 2, we'll work through migrating an example Express.js application to Fastify.","/phendry/2022-07-28/img/Migrating from Express to Fastify, Part 2.png",[2156,2004],"2023-12-31","content:phendry:2022-07-28:MigratingFromExpressToFastifyPart2.md",{"user":2687,"name":2688},{"_path":2742,"title":2743,"description":2744,"tags":2745,"image":2746,"publishDate":2747,"_id":2748,"author":2749},"/phendry/2023-01-19/badcode","\"Bad\" Code (Or, Why Software Development is Hard)","Recently, the Dutch government open-sourced the iOS application for their \"DigiD\" authentication service. A tweet with a snippet of that source code, presumably making fun of it, blew up into a debate about whether mocking it is even justified. The amount of debate over such a simple snippet of code highlights, in my mind, just how tricky software development can be.",[2054,2004],"/phendry/2023-01-19/img/Bad Code.png","2024-01-15","content:phendry:2023-01-19:BadCode.md",{"user":2687,"name":2688},{"_path":2751,"title":2752,"description":2753,"image":2754,"publishDate":2755,"tags":2756,"_id":2757,"author":2758},"/phendry/2023-01-31/forgetaboutcodestyle","Forget About [Code] Style","Good code style, being highly subjective, is something often debated among developers. After all, we spend more time reading code than writing it, so it's worth making sure our code is styled to be as easy as possible to read and to understand. On the other hand, deciding upon and continuously enforcing a style is also time-consuming, and the benefits are near-impossible to quantify. Given that modern code formatting tools can fully automate the process, is it still worth fretting about style?","/phendry/2023-01-31/img/forget_style_header.png","2024-02-01",[2191],"content:phendry:2023-01-31:ForgetAboutCodeStyle.md",{"user":2687,"name":2688},{"_path":2760,"title":2761,"description":2762,"image":2763,"tags":2764,"publishDate":2765,"_id":2766,"author":2767},"/phendry/2023-04-02/semantichtml","Don't Give Up on Semantic HTML","Since the early days of the Web, there has been tension between the ideal of \"semantic HTML\" and the practical reality of designing complex page layouts, which often could not be achieved without inserting style concerns into the document. More recently, frameworks like Tailwind CSS have emerged which challenge the very idea that semantic HTML is an ideal to strive for, and which commit to thoroughly embedding style concerns into HTML documents. With modern CSS features however, semantic HTML is more achievable than ever, and I do think it remains a worthy goal.","/phendry/2023-04-02/img/Don't Give Up on Semantic HTML.png",[2191],"2024-03-01","content:phendry:2023-04-02:SemanticHtml.md",{"user":2687,"name":2688},{"_path":2769,"title":2770,"description":2771,"image":2772,"tags":2773,"publishDate":2774,"_id":2775,"author":2776},"/phendry/2023-05-16/doyouneedacsspreprocessor","Do You Need a CSS Preprocessor in 2023?","CSS preprocessors like Less, Sass and Stylus have long provided powerful features that vanilla CSS lacked: variables, nesting of rulesets, mixins, control flow constructs, etc. These days however, the feature gap is considerably narrower, and it's not so clear that the benefits of a preprocessor outweight the burdens of setting it up.","/phendry/2023-05-16/img/css_preprocessor_header.png",[2191],"2023-01-01","content:phendry:2023-05-16:DoYouNeedACSSPreprocessor.md",{"user":2687,"name":2688},{"_path":2778,"title":2779,"description":2780,"image":2781,"publishDate":2782,"tags":2783,"_id":2784,"author":2785},"/phendry/2023-07-28/dependencymanagement","Software Dependency Management: Best Practices","Leveraging third-party libraries and frameworks is essential in most modern software projects, and the projects we build at Art+Logic are no exception. The pressure on developers to rapidly deliver features is high, and there are so many commonalities in the details of each project (particularly in Web development) that a lot of development time can be saved by using well-designed libraries that handle the details.","/phendry/2023-07-28/img/dependency_header.png","2023-01-02",[2191],"content:phendry:2023-07-28:DependencyManagement.md",{"user":2687,"name":2688},{"_path":2787,"title":2788,"description":2789,"tags":2790,"publishDate":2793,"image":2794,"_id":2795,"author":2796},"/phendry/2023-11-06/frontendframeworksin2024","Frontend Frameworks in 2024: React, Svelte and Vue","Several years ago, Art+Logic settled on Vue.js as our preferred frontend Web framework. Now, in 2024, we feel it's time to revisit the frontend framework landscape to see how things have (or haven't) changed.",[2191,2791,2792,2454],"react","svelte","2024-05-15","/phendry/2023-11-06/img/frontend_frameworks_2024.png","content:phendry:2023-11-06:FrontendFrameworksIn2024.md",{"user":2687,"name":2688},{"_path":2798,"title":2799,"description":2800,"publishDate":2801,"tags":2802,"image":2805,"_id":2806,"author":2807},"/rbrubaker/2012-06/arduino-thermometer","Turn Your Mac into a Thermometer with Arduino","The topic of the Arduino came up around A&L's \"virtual water cooler\" last week. About a year and a half ago, I purchased a SparkFun Inventor's Kit for Arduino. The kit is a fun way for a hardware novice like me to get started and learn some basics. It comes with more than a dozen sample projects such as lighting LEDs, spinning a motor and generating audio.","2012-06-28",[2803,2804],"arduino","java","/rbrubaker/2012-06/img/arduino1.jpg","content:rbrubaker:2012-06:arduino-thermometer.md",{"user":2808,"name":2809},"rbrubaker","Ryan Brubaker",{"_path":2811,"title":2812,"description":2813,"publishDate":2814,"tags":2815,"_id":2818,"author":2819},"/rbrubaker/2012-06/coffe-backbone-1","Fun with CoffeeScript and Backbone.js : Part 1","CoffeeScript has been all the rage lately and I've been wanting to hop on board the bandwagon. I've also seen Backbone.js mentioned quite a bit and was even more intrigued after listening to this .NET Rocks podcast. I decided to convert some plain JavaScript code I had in a side project to use both CoffeeScript and Backbone.js and see how things went.","2012-06-06",[2816,2817,2181,2004],"backbone-js","coffeescript","content:rbrubaker:2012-06:coffe-backbone-1.md",{"user":2808,"name":2809},{"_path":2821,"title":2822,"description":2823,"publishDate":2824,"tags":2825,"_id":2826,"author":2827},"/rbrubaker/2012-06/coffee-backbone-2","Fun with CoffeeScript and Backbone.js : Part 2","In this post I’ll discuss the code that handles updating the UI.","2012-06-07",[2816,2817,2181,2004],"content:rbrubaker:2012-06:coffee-backbone-2.md",{"user":2808,"name":2809},{"_path":2829,"title":2830,"description":2831,"publishDate":2832,"tags":2833,"_id":2834,"author":2835},"/rbrubaker/2012-06/coffee-backbone-3","Fun with CoffeeScript and Backbone.js : Part 3","In this post I’ll discuss my thoughts on CoffeeScript and Backbone.js.","2012-06-08",[2816,2817,2181,2004],"content:rbrubaker:2012-06:coffee-backbone-3.md",{"user":2808,"name":2809},{"_path":2837,"title":2838,"description":2839,"publishDate":2840,"tags":2841,"_id":2842,"author":2843},"/rbrubaker/2012-07/prototypal-js","Prototypal vs. Functional Inheritance in JavaScript","If you ever found JavaScript's prototypal inheritance confusing, do yourself a favor and open this article, open a JavaScript console and code each example in the article. You will definitely come away with a better understanding of how prototypal inheritance works in JavaScript.","2012-07-11",[2817,2156],"content:rbrubaker:2012-07:prototypal-js.md",{"user":2808,"name":2809},{"_path":2845,"title":2846,"description":2847,"publishDate":2848,"tags":2849,"_id":2850,"author":2851},"/rbrubaker/2012-07/whither-pm","Whither Project Management?","When I was first asked to manage a project at Art & Logic, I had my reservations. Did I really want to start down a career path that led to less development? Would my skills as a developer go stale? My first few projects as a manager were solo projects so I still had plenty of development work and fortunately, I found myself to be a pretty easy person to manage. As time went on I started managing larger projects and with them came the responsibility to manage other developers. To my surprise I found project management to be rewarding and dare I say, even fun. It's very satisfying to work with clients, helping them define their visions and seeing those visions come to life.","2012-07-25",[2607],"content:rbrubaker:2012-07:whither-pm.md",{"user":2808,"name":2809},{"_path":2853,"title":2854,"description":2855,"tags":2856,"image":2859,"publishDate":2125,"_id":2860,"author":2861},"/scharette/2019-4/discover_machine_learning","Discover Machine Learning","Computers have been around for less than 100 years.  In that short period of time, some incredible things have happened:  they've been universally adopted so quickly that we have them in our houses.  In our cars.  Even in our pockets.  In the last 40 years, there have been many significant events when it comes to computers:",[2857,2858,2117],"machine-learning","neural-networks","/scharette/2019-4/img/discover_machine_learning.png","content:scharette:2019-4:discover_machine_learning.md",{"user":2862,"name":2863},"scharette","Stéphane Charette",{"_path":2865,"title":2866,"description":2867,"publishDate":2868,"image":2869,"tags":2870,"_id":2872,"author":2873},"/shuey/2012-05/baas","BaaS Offerings Continue to Grow","The makers of Simplenote recently introduced their Backend as a Service (BaaS) offering called Simperium that looks to compete in an increasingly crowded space with services like CloudMine, Kinvey, and Parse and to some extent with iCloud for iOS and OS X only apps. So just how crowded is this space? Back in February, Kinvey published their own map of the BaaS ecosystem that highlights different tiers of the ecosystem and various relationships between them.","2012-05-10","/shuey/2012-05/img/header.png",[2871],"baas","content:shuey:2012-05:baas.md",{"user":2874,"name":2875},"shuey","Steven Huey",{"_path":2877,"title":2878,"description":2879,"publishDate":2880,"tags":2881,"image":2883,"_id":2884,"author":2885},"/shuey/2012-05/cloud","Under the Sheets with iCloud and Core Data","Drew McCormack is writing a great series (Part 1, Part 2, Part 3) of posts about using iCloud for syncing Core Data managed data. It's harder than Apple lets on and Drew has done a great job of uncovering how this actually works.","2012-05-28",[2040,2882],"icloud","/shuey/2012-05/img/icloud.jpg","content:shuey:2012-05:cloud.md",{"user":2874,"name":2875},{"_path":2887,"title":2888,"description":2889,"publishDate":2890,"tags":2891,"_id":2893,"author":2894},"/shuey/2012-05/economics-android","The Economics of Android","If you haven't already do yourself a favor and head over to asymco.com to catch Horace Deidu's multi-post series on \"The Economics of Android\". Horace and Dan Benjamin discuss the series during this week's Critical Path podcast as well. Horace is a former analyst for Nokia and has been writing Asymco for a few years now. His analysis of the mobile industry and Apple's place within it in particular has been featured in publications such as Bloomberg and Forbes.","2012-05-17",[2892],"android","content:shuey:2012-05:economics-android.md",{"user":2874,"name":2875},{"_path":2896,"title":2897,"description":2898,"publishDate":2482,"tags":2899,"_id":2902,"author":2903},"/shuey/2012-05/iot","The Internet of Things and Big Data","I've been following the developments in the \"Internet of Things\" and Big Data / Open Data markets as new apps and tools are released and they look to be two exciting technologies on a collision course. With the advent of internet connected home appliances like Wattvision and Nest that provide real utility to the average home owner at reasonable prices along with crowd funded projects like Air Quality Egg or Twine we should see an explosion in the kinds and amount of useful and real-time or near real-time data that is available to anyone with a smartphone. Health metric or \"quantitative self\" tracking devices such as Fitbit, Jawbone Up, and the Pebble watch will fuel this data explosion as well.",[2900,2901],"big-data","iot","content:shuey:2012-05:iot.md",{"user":2874,"name":2875},{"_path":2905,"title":2906,"description":2907,"publishDate":2908,"tags":2909,"image":2911,"_id":2912,"author":2913},"/shuey/2012-05/rubymotion","RubyMotion Brings Ruby to iOS","RubyMotion is a new development toolchain that allows you to build iOS apps using Ruby created by Laurent Sansonetti, a former Apple engineer and contributor to the MacRuby project. It has garnered a lot of attention the past few weeks and some detailed reviews have already been written:","2012-05-14",[2039,2910],"ruby","/shuey/2012-05/img/logotype-icon.png","content:shuey:2012-05:rubymotion.md",{"user":2874,"name":2875},{"_path":2915,"title":2916,"description":2917,"publishDate":2918,"tags":2919,"image":2920,"_id":2921,"author":2922},"/shuey/2012-06/thoughts-ios6","A few thoughts on iOS 6","Apple made their session videos from WWDC 2012 available earlier this week in record time. It's nice to see since tickets for this years event sold out in under two hours. Apple has an iOS 6 Preview page touting some of the new features such as Siri's new abilities, tighter integration with Facebook, Photo Stream sharing, and things like iCloud tabs for Safari all of which look great.","2012-06-21",[2040,2039],"/shuey/2012-06/img/ios6.jpg","content:shuey:2012-06:thoughts-ios6.md",{"user":2874,"name":2875},{"_path":2924,"title":2925,"description":2926,"publishDate":2927,"tags":2928,"image":2930,"_id":2931,"author":2932},"/shuey/2012-07/mixer","A Simple Mixer Using AVFoundation","In iOS 4.0 Apple introduced the AV Foundation APIs that made working with audio and video media much easier than it had been in previous versions of iOS. Apple then brought these APIs to Mac OS X in OS X 10.7 \"Lion\". In this post I'll show how to use some of the APIs to create a simple four track mixer.","2012-07-02",[2040,2929,2039],"cocoa","/shuey/2012-07/img/mixer-screenshot.jpg","content:shuey:2012-07:mixer.md",{"user":2874,"name":2875},{"_path":2934,"title":2935,"description":2936,"publishDate":2937,"tags":2938,"image":2939,"_id":2940,"author":2941},"/shuey/2012-07/reset-button","The Reset Button","Horace Dediu of Asymco has been publishing some fantastic insights and analysis of the mobile market in the past few weeks. I linked to some of Dediu's analysis of the Economics of Android in an earlier post, and since then he's updated his work with the latest data and is studying RIM and Microsoft's efforts in the space as well.","2012-07-19",[2892,2040,2039],"/shuey/2012-07/img/kevin.jpg","content:shuey:2012-07:reset-button.md",{"user":2874,"name":2875},{"_path":2943,"title":2944,"description":2945,"publishDate":2946,"tags":2947,"image":2949,"_id":2950,"author":2951},"/tfarrel/2012-07","Looking at Steganography","With the help of one of my favorite news aggregators, I discovered this article on using JavaScript and the canvas element to hide information inside images. I've long been fascinated by steganography and this article and demonstration makes it even more accessible. If you can't be bothered to read the article, it describes a method of using the HTML5 File API and the canvas element to embed a message in images.","2012-07-24",[2948],"steganography","/tfarrel/2012-07/img/white.png","content:tfarrel:2012-07:index.md",{"user":2952,"name":2953},"tfarrel","Troy Farrel",1783408212213]