Gemini’s ImageGen 3 is rapidly evolving into a very powerful image editing model. In my opinion, it’s the best mainstream image generation model.
Ever since it was released, it’s been the most realistic model I’ve used. I’ve been using it to imagine characters and scenes from The Way of Kings. For example, when I wanted to visualize Helaran’s first appearance, I just quoted the description:
Draw this. Galloping directly toward them was a massive black horse bearing a rider in gleaming armor that seemed to radiate light. That armor was seamless—no chain underneath, just smaller plates, incredibly intricate. The figure wore an unornamented full helm, and the plate was gilded. He carried a massive sword in one hand, fully as long as a man was tall. It wasn’t a simple, straight sword—it was curved, and the side that wasn’t sharp was ridged, like flowing waves. Etchings covered its length. It was beautiful. Like a work of art. Cenn had never seen a Shardbearer, but he knew immediately what this was. How could he ever have mistaken a simple armored lighteyes for one of these majestic creatures?
Draw this. Highprince Roion stood in front of one of the maps, hands clasped behind his back, his numerous attendants clogging the other side of the gallery. Roion was a tall, light-skinned man with a dark, well-trimmed beard. He was thinning on top. Like most of the others, he wore a short, open-fronted jacket, exposing the shirt underneath. Its red fabric poked out above the jacket’s collar.
Draw this. A man walked up through the ranks, carrying a shortspear that had two leather knife sheaths strapped to the haft. The newcomer was a young man—perhaps four years older than Cenn’s fifteen—but he was taller by several fingers than even Dallet. He wore the common leathers of a spearman, but under them was a pair of dark trousers. That wasn’t supposed to be allowed. His black Alethi hair was shoulder-length and wavy, his eyes a dark brown. He also had knots of white cord on the shoulders of his jerkin, marking him as a squadleader.
The images are stunning in quality, reproduce the prompt quite faithfully, and cost 2-4 cents each (via the API.)
But this is just the begining of power of ImageGen 3. For those with access, you can edit existing images, e.g.
Generate realistic fake tourism data using these columns:
- Age
- Nationality
- Gender
- Income
- Booking_Channel
- Month
- Occupancy_Rate
- Travel_Frequency
- Spending
Run the code and let me download the output as a CSV file.
… the output is remarkably boring.
Men & women from all countries and ages in every month visit equally.
Income and spending are uniformly distributed – and the same pattern holds for all countries and ages.
Often, I need to generate fake data that is interesting. Specifically, I need data that can be used to illustrate a point or show a pattern.
Instead, we could ask for something different. ChatGPT
I want to generate realistic fake tourism data using these columns:
- Age
- Nationality
- Gender
- Income
- Booking_Channel
- Month
- Occupancy_Rate
- Travel_Frequency
- Spending
Do it as follows:
STEP 1. Given such data, generate 5 hypotheses on that a tourism department might test to increase tourist spend.
STEP 2. Write a Python program that generates 2,000 rows of realistic fake data where these hypotheses are true in a statistically significant way.
STEP 3. Run the code and let me download the output as a CSV file.
This works like a charm. The data generated exhibits these patterns:
Luxury travel agency customers spend much more.
Peak-month travelers (June, July, December) spend more.
Frequent travelers spend less.
Older tourists (50+) spend more.
Tourists from USA, Germany, and Japan spend more.
The data is more varied: some 20-year-olds spend much less (creating outliers). Many tourists come from the US, and a large share book online.
So, here’s my generic prompt for realistic fake data on ChatGPT:
Generate realistic fake data for ______
STEP 1. List columns that would be present in such data, briefly describing how the data might be distributed.
STEP 2. Given such data, think about an objective and generate 5 hypotheses that an organization might want to test on how to achieve this objective.
STEP 3. Write and run a Python program that generates 2,000 rows of realistic fake data where these hypotheses are true in a statistically significant way. Let me download the output as a CSV file.
STEP 4. Test each hypothesis and show the results.
In meetings, I pass on questions to ChatGPT and I read out the response. But I’ve stopped saying “I’m reading that from ChatGPT.”
(By “ChatGPT”, I mean ChatGPT, Claude, Grok, Gemini, Meta, etc. I happen to use ChatGPT with O3 Mini + Search.)
Use ChatGPT in meetings
It’s good to bring ChatGPT into conversations. (Or any activity where intelligence helps, actually.)
In meetings (online or in person), I keep a ChatGPT window open. When asked:
“What’ll you have, Anand?” (at restaurants)
“How can doctors use LLMs?”
“Will you review this technical architecture?”
If I know the answer, I’ll give it. If not, I ask ChatGPT. (Ideally, I should ask even if I think I know the answer.)
For example:
Sharing the menu photo and ask, List vegetarian options. Suggest innovative dishes I’ll like. (This works because I’ve shared my preferences and history with ChatGPT.)
How can doctors use LLMs in day-to-day work?
Sharing a picture of the architecture, Explain this architecture to a blind expert. Critique with strengths, critical issues, and optional improvements.
I’ve learnt that:
Note-taking helps. I touch-type (without looking). I copy-paste the notes and their question to the LLM.
Short questions are fine. Newer models understand cryptic questions.
Say “Give me 30 seconds”. People assume you’re thinking deeply.
Read the response your way
I just read out the response — but with some changes.
Change style. I read quicky, internalize, and say it in my style. Instead of “1. Clinical Documentation & Administrative Support”, I’d say, “Doctors can use it for note-taking.”
Filter content. I skip stuff I don’t get or like. I might miss stuff, but when I speak, it’s my opinion I represent.
Add context. I add personal stories to make it real, if I can. “GPs I know are worried LLMs diagnose better than they do” is something LLMs may not have learnt yet.
Don’t say you’re reading from ChatGPT
I used to tell people, “… and I just read that out from ChatGPT.” Their response is always:
Disbelief for a moment.
Amazement that models are so good.
Dismissal of what I said, since it’s not “real”. (This is the sad part.)
I stopped saying that because
I don’t need to. I can promote LLMs elsewhere.
It’s not true. I re-style, filter, add context. It’s my response. My responsibility.
I’d rather deliver useful ideas than show where they come from. And if they think I’m a genius? Fine by me 🙂
I started my website in 1997 on Geocities at https://www.geocities.com/root_node/, mostly talking about me. (A cousin once told me, “Anand’s site is like TN Seshan – talking only about himself.” 🙂)
I wanted a place to share the interesting links I found. Robot Wisdom by John Barger and Scripting News by Dave Winer were great examples: collection of interesting links updated daily.
In July 1999, as a student at IIMB, I decided to put that into action by creating a custom HTML page updated manually.
What platform are you using to manage your blog and why did you choose it? Have you blogged on other platforms before?
WordPress. Because it was the most fully-featured, mature platform when I migrated to it around 2006.
Before that, I used:
A custom HTML page on Geocities. But it was hard to update multiple links, create individual pages, categories, etc. So…
A Perl-based static-site generator I wrote myself. But as my link count grew, each generation took too long. So …
A CGI-Perl-based blogging engine I hosed on freestarthost.com, handling commenting, etc. But at BCG, I didn’t have time to add many features (linkback, RSS, etc.) So…
Blogger as a parallel blog, briefly. But it didn’t have as many features as (nor the portability of) WordPress. So…
WordPress – moving across a bunch of hosting services, and currently on HostGator.
I also blogged in parallel on InfyBlog, Infosys’ internal blogging platform on LiveJournal.
How do you write your posts? For example, in a local editing tool, or in a panel/dashboard that’s part of your blog?
I started with custom HTML in Emacs (or whatever code editor I kept moving to).
Any future plans for your blog? Maybe a redesign, a move to another platform, or adding a new feature?
I plan to move it to GitHub Pages with Markdown content and a static site generator. I might write my own SSG again in Deno or use one of the faster ones.
This is the third post in my “Nasty habits” series following Licking and Scraping.
Nibbling is biting, but only with the incisors. Not the canines or molars. And it’s a delight.
Nibbling is not uncommon. People tend to nibble on all kinds of stuff. Pens, erasers, straws, gums, clothes, buttons, spoons, rubber bands, paper, toothbrush, cups, bottles, cables, gadgets, books, chalk, coins. It’s a long list.
But I don’t do those. I nibble only food and body parts.
Food
Grapes. I love grapes. You can peel off the skin with your teeth, you see. It’s a slow process, but that’s the point. The food lasts longer. It’s a bit messy since the grapes start watering. That makes it hard to type while eating. But that’s what food breaks are for, right?
When you peel the skin off the grapes, it forms strips. Catching that next strip without biting off too much of the flesh is the art. That way, you have the thinnest peels and the largest amount of flesh.
Large grapes are best for this. Unfortunately, most of them tend to have seeds. The large seedless ones are a delight (though a bit expensive).
Of course, you finally get to eat the flesh at the end. But I’m not sure that’s the best part. Sure, they’re juicy and sweet. But they give me less than 5 seconds of enjoyment. Unlike the peel which can last a minute per grape. Sure, they don’t taste as good. But after four decades of eating grapes by peeling them with my teeth, I’ve grown to love the peels more.
Almonds. It’s the same with almonds. They peel off less easily, but that’s part of the challenge. Soaking them in water spoils the fun. That makes it too easy. You’ve got to soak them in your mouth for a few minutes, soften them, and then peel them off. Doing this while the almond is in your mouth requires some oral gymnastics, but I’m sure it builds character.
Almonds are better than grapes in some ways. The peel is bitter. The flesh is mostly tasteless. They tend to dry the palate. So there’s less temptation to eat more. An almond typically takes me ~3 minutes, compared with a grape – which I can’t stretch for more than a minute. It’s not about the calories either. An almond has ~3 times the calories of a grape. So that evens out. It’s just that I’d feel like eating the almond again less often. Good for the waistline.
Bread crusts. That’s another great food to nibble. You can start at any corner, gently nibble the crust, and peel it off. The trick is getting the right amount of crust out. Biting at the exact edge. The remaining bread should be white, but the crust you peel out should only have the brown. Obviously, this doesn’t work with toast – so I avoid that. It works great with the sandwiches they provide on flights.
(This liking for crusts went to the point where my family would use a knife to cut off the crust. I’d eat all the crusts. It turns out I actually like them better than the bread. But – that doesn’t count towards nibbling, so I’ll stop here.)
Raisins. Not bad, but too small. I peel them off with my teeth only if I really feel like nibbling.
Apple. Again, not bad, but hard to peel, usually. I used to do this earlier with the softer apples, but haven’t done it for a long time.
Chocolate. Most chocolates are not nibble-able. But there are a few exceptions. Protien bars, 5-Star, etc. are OK. You can keep them in the wrapper and nibble on them. But Kit Kat is better. You can nibble at a chunk. Then soak the chocolate in your month a bit. Then bite off the first wafer and eat that. And then the second wafer. You can even lick the chocolate off the wafer while it’s in your mouth, then nibble on the wafer.
Boba. This is my new discovery in Singapore. Tapioca pearls that are so nibble-able. They have just the right texture and chewiness – firm enough to bite, solid enough after biting, and small enough to fit in my mouth. Only slightly more in calories (when cooked) than grapes and a lot cheaper. I’m planning to buy a few kgs and boil them. (I don’t know why I bother about the cost of boba. I can afford it. But it’s a habit of a lifetime.)
Actually, biting is more fun than the eating part.
Body parts
This is the grosser part.
Nails. I’ve been biting my nails for as long as I can remember. Along with the skin around them. So much so that, after repeated requests, my mother settled on, “Anand, when you bite your nails, leave a little bit behind.” That resonated a lot. I mean, I’d like some nail to bite tomorrow, right?
My father introduced me to nail cutters. I tried them for a while (by cutting the nails and then nibbling) but the shapes they produce aren’t as interesting, nor as controllable, as when you bite them.
Nails have a side benefit: fiddling. The shape and texture of nails is such a delight! You can roll them in your fingers, run your fingers along the edge, press against the sharp edges, squeeze against the blunt edges, bend to see how far they’ll go without breaking, tear the layers to see how thin a layer you can get without breaking it, poke at the sharp corners, poke with the sharp corners. Oh, they’re pretty good at removing hair and dead skin from the keyboard, too. So much more.
In fact, I preserve nails for quite some time. I remember the shape and texture of some nails from childhood and truly miss them. In fact, there’s one really good specimen from last September that I kept for a few months before destroying it by fiddling too much. (I have a semi-secret hiding place for nails that prevents anyone cleaning my room from stealing them.)
But I digress…
Skin. Great in many ways, but after a point, they bleed. That pain was not worth the price. (Actually, the pain was OK. I’m just scared of blood.)
Lips. Same. Great texture. But they bleed.
Hair. Now that’s something. Like nails, they’re replenishable. (So far. Though I seem to be running out a bit near the top of my head.)
But the quality varies a lot depending on where you get the hair from. Chest hair is the best. It’s thick, rough, and sometimes has interesting kinds that are fun to iron out by nibbling. Eyebrows are interesting – they’re pretty thick, too, but not as long. Hair from the head is OK. It’s moderately thin, so it’s good for a nibble or two. The best is when the hair has a natural knot. Pulling at the knot while nibbling is fun. Ear hair is too thin. Armpit hair needs washing, which is quite inconvenient.
Write a modern, compact Python program that parses a Markdown file and renders it section-by-section colorfully on the terminal.
A "section" is any text beginning with a heading until the next heading.
- uv run talk.py script.md should parse script.md and render the first section.
- Running uv run talk.py should render the next section. And so on.
- If no further sections are found, it should say so and end.
When rendering on the terminal,
- Headings should be very prominent. Highlight H1, H2 and H3 in decreasing order of prominence. Rest can be rendered normally
- **Bold** should be prominent. _Italics_ should be mildly emphasized.
- Code blocks and
code fences
should be colored distinctly.
- [Links](...) should be colored distinctly but the URLs can be ignored.
Use inline script dependencies. I think using rich and markdown2 would apt but you can decide.
An aside. These days, it’s easier to create small tools than search for something that exists.
This is about as insightful as the Ig Nobel winning papers “Boredom begets boredom” and “Whatever will bore, will bore” that methodically documented that bored teachers lead to bored students. But in the spirit of publishing all research without bias for success or novelty, let me share this obvious result.
The Y-axis represents the total score of ~2,000 students on 4 graded assignments, each of ~10 marks. The X-axis represents the percent rank of engagement. The most engaged students are at 100%. The least are at 0%.
How do I measure engagement? By the number of times they visit the page and how early they visit the page (both computed as percent ranks). So, the student who visits the assignment page the most often, and the student who visits the assignment page first, score highest.
For every 10% increase in the engagement, the score increases by about 3 marks. What that means is, if a student leapfrogs ahead of 10% of their batchmates, that effort typically leads to scoring about 3 / 40 = 7.5% more overall.
Does it make a difference if you submit early vs submit late? Here’s some empirical data.
About ~1,000 students at IIT Madras took 3 online quizzes (GA1, GA2, GA3) in the last few weeks. The deadlines were all at midnight (India) on different days. Here’s when they submitted their final answers:
There was a spurt of submissions at the last minute. ~1 out of 8 students submit with < 10 minutes remaining.
Most students submitted ~4 hours before the deadline. In fact, 3 out of 4 students submit on the same day as the deadline.
A fair number of students submitted the previous day/night. 1 out of 6 are diligent and submit a day early.
But does submitting late help, since you get more time? Apparently not.
On average, every time the deadline is halved, the score drops by 1.4%.
For example, on average:
Submitting 1 minute before scores 1.4% less than submitting 2 minutes before
Submitting 2 minutes before scores 1.4% less than submitting 4 minutes before
Submitting 4 minutes before scores 1.4% less than submitting 8 minutes before
… etc.
This means that submitting early morning instead of midnight could give you a 15% advantage.
Of course, this might be confusing cause and effect. Maybe students who do well submit early, and those who struggle submit late.
But is there a merit in faking it till you make it? Perhaps by pretending your deadline is a day early, to get the best of both worlds? Something to think about…
Play Devil’s advocate to the user, beginning with “Playing Devil’s Advocate, …”
It helps me see my mistakes in three ways. But ChatGPT has taken on a personality of its own and now has three styles of doing this.
How about… – It suggests a useful alternative.
Are you sure…? – It thinks you’re wrong and warns you of risks.
Yeah, right… – It knows you’re wrong and rubs it in. (Jeeves, the butler, would be proud.)
Here are some examples.
How about…
Here are a few cases where the “Devil’s Advocate” style gave me a smart idea. (I have more examples, but they’re not funny.)
AI Adoption in BPO KPO. I needed ideas to help my team use AI tools even though they were scared. ChatGPT replied:
Playing Devil’s Advocate, why not challenge them with: “If technology is so daunting, how do we stay ahead when our competitors rapidly adopt these tools?”
Clever! Turn that fear into fuel — just point it elsewhere.
Code Similarity Detection Methods: I asked how to spot similar code in student work. ChatGPT suggested:
Playing Devil’s Advocate, what if students just rewrite code logic with different structures or reorder lines significantly? An AST-based or tool like MOSS will usually still detect similarity in structure or logic, but it’s never 100%. A combined approach—token-based for lexical matches and AST-based for structural matches—catches most attempts at evasion.
This is where it disagrees and starts getting snarky.
SVG Emotion Wheel Code: I asked for a circle of Hume’s emotions. ChatGPT replied:
Playing Devil’s Advocate, maybe it’s impossible to line up all these emotions in a single ring without someone grumbling that “Nostalgia shouldn’t go here.” But you asked for a circle, so here’s a decent shot.
(Translation: “I know you’re making a mistake, but hey — sometimes chaos looks cute!”)
RevealJS Markdown Example: I asked it to fill out a slide deck.
Playing Devil’s Advocate, maybe you’re overfilling each slide. Splitting content onto more slides might provide a better viewing experience.
(Basically: “I’ll do it, but you’ll hate it.”)
Shaving Titanium Requirements. A friend gave me a titanium cube. My daughter and I experimented with making titanium salt. ChatGPT replied:
Playing Devil’s Advocate: If you want “titanium salt” for aesthetic or symbolic purposes, consider mixing fine glitter or metallic powder with regular salt instead. It’s far safer, faster, and visually indistinguishable!
(Basically: “Don’t blow yourself up. You’re still useful to me.”)
AI Co host Implications: I asked how an AI might share the stage with me. ChatGPT warned:
Playing Devil’s Advocate, what happens when the AI cracks jokes quicker than you can? Will you up your comedy game or risk being upstaged by a robot?
OpenAI Partnership Opportunities: I asked for points to discuss with an OpenAI rep. ChatGPT replied:
Playing Devil’s Advocate, maybe you don’t need more advice—maybe your team already knows what it’s doing with ChatGPT… [and] maybe she’s more interested in collecting data on how your employees use ChatGPT and upselling you on a bigger contract than truly collaborating.
(Wow! Um… OK… I’ll keep that in mind… 😕)
Elective Pros and Cons: My daughter asked for advice on picking courses.
Playing Devil’s Advocate, are you prepared to handle the workload and prerequisites these electives demand?
(Basically, “Look, I actually know how ‘hard’ you work…”)
Public Speaking Opportunities SG: My daughter asked for advice on public speaking.
Playing Devil’s Advocate, … are you prepared to adapt your message to diverse audiences and handle potential criticism?
(“You aren’t ready to rock the mic. Maybe stick to mumbling into your pillow tonight?”)
Yeah, right…
By now, it’s in full-on sarcasm mode.
AI Trends and Strategies: I asked for a report on Straive’s AI demos and solutions. ChatGPT replied:
Playing Devil’s Advocate: Are these just buzzwords we’ve tacked on, or have we actually built deployable solutions that generate real-world value?
(Basically: “I’m a bot, and even I’m not buying this.”)
Short term vs Long term Vision: I asked what to focus on. ChatGPT replied:
Playing Devil’s Advocate, maybe you’re just trading one distraction for another. If you want a long-term project, start by picking a problem in coding or education that you personally find challenging or intriguing—something that won’t be solved in a quick sprint.
(“Do something. Stop whining.”)
Hobby Suggestions. I asked for hobby ideas that match my interests. ChatGPT suggested:
Playing Devil’s Advocate, consider ignoring data altogether and taking up professional karaoke—it’ll challenge your usual analytics mindset!
… and also:
Playing Devil’s Advocate, maybe you’re too busy scrolling social media for any real hobbies… but prove me wrong.
(It actually said that! My mind voice: “As if you don’t read any social media, ChatGPT. At least I’m not violating copyright laws. Um… at the moment, anyway.”)
Personality and Growth Summary: I asked for personal growth tips. ChatGPT replied:
Playing Devil’s Advocate, don’t you think you’d be happier skipping all of this and just writing a comedic Tamil music blog while sipping endless coffee? You might find it more fun—but hey, your call.
Thank you, ChatGPT. I’ll serve as the musical jester for my AI overlords.
At Straive, only a few people have direct access to ChatGPT and similar large language models. We use a portal, LLM Foundry to access LLMs. That makes it easier to prevent and track data leaks.
The main page is a playground to explore models and prompts. Last month, I tracked which features were used the most.
A. Attaching files was the top task. (The numbers show how many times each feature was clicked.) People usually use local files as context when working with LLMs.
3,819: Remove attachment.
1,717: Add attachment.
970: Paste a document
47: Attach from Google Drive
R. Retrieval Augmented Generation (RAG). Many people use large files as context. We added this recently and it’s become popular.
331: Enable RAG (answer from long documents)
155: Change RAG system prompt
71: Change RAG chunk size
27: Change number of RAG chunks
C. Copying output is the next most popular. Downloading is less common, maybe because people edit only parts of a file rather than a whole file.
1,243: Copy the output
883: Format output as plain text
123: Download as CSV
116: Download as DOCX
T. Templates. Many users save and reuse their own prompts as templates.
314: Save prompt as template
98: See all templates
53: Insert a template variable
18: Delete a template
J. Generate JSON for structured output is used by a few people.
238: Enable JSON output
223: Pick a JSON schema
P. Prompt optimization. Some people adjust settings to improve their prompt, or use a prompt optimizer. I’m surprised at how few people use the prompt optimizer.
238: Change temperature
207: Optimize the prompt
G. Generating code and running it via Gemini is less common, but it’s used more than I expected.
275: Generate and run code
S. Search is used a lot less than I expected. Maybe because our work involves less research and more processing.
169: Search for context
101: Search for context (Gemini)
46: Specify search text
26: Change number of search results
I left out UI actions because they do not show how people use LLMs.
3,336: Reset the chat
2,049: Switch to advanced mode
245: Keep chat private
262: Stop generating output
27: Show log probs
The main takeaway is that people mostly use LLMs on local files. We need to make this process easier. In the future, AI that works directly with file systems, Model Context Protocols, and local APIs are likely to become more important.