The Blog Production Line (Part 1): I Built an AI Production Line for Blogging, Then the First Article Taught Me a Lesson
What you are reading is the second post of the production line, written after it finished its first real article. The subject is the production line itself: how the skills were chosen, how they were orchestrated, how the first live run got schooled by reality, and how the lessons were grown back into the line. What the Production Line Looks LikeFirst, the structure. An article’s lifeline is four steps: research, writing, polishing, publishing. The first three each have a dedicated skill. co...
A Mystery Game Platform (Part 1): From a Pot of Turtle Soup to Murder-Mystery Scripts Where the AI Lies
Turtle Soup is a party deduction game. The puzzle setter throws out a bizarre surface story — say, “he eats penguin meat every day, and cries after eating” — and players can only ask questions answerable with “yes” or “no”, closing in on the hidden truth bit by bit. The whole fun of this game rests on the puzzle setter: they know the entire truth, and they have to keep it. I figured this is something AI is naturally good at. It has read more mystery stories than any human setter could, it nev...
Querying Linux System Info: Commands Better Than the cat /proc Era
In 2024 I wrote “Common CentOS System Info Queries” on CSDN. Looking back two years later, the commands in that post still run, but most of them take the long way around: cat /proc/cpuinfo piped through grep and wc to count lines, awk arithmetic to convert uptime seconds, digging version numbers out of /etc/centos-release. Since then CentOS 7 has gone end-of-life (June 2024), but the commands themselves work across distributions—whether you’re still on legacy CentOS or have migrated to Rocky...
Hello World — The Blog Is Live
My personal blog is officially live: https://mrzhangkris.github.io Hosting: GitHub Pages (free) Framework: Hexo + the Butterfly theme Build: GitHub Actions auto-deploys; zero dependencies locally Workflow: finish writing the Markdown → git push → published automatically How Posts Get Written From Now OnCreate a new title.md in the source/_posts/ directory, starting with front matter: 123456---title: Post Titledate: 2026-09-11 11:00:00tags: [Tag One, Tag Two]categories: [Category]--- Write ...
Setting Up BIND DNS on Rocky Linux 9: Forward and Reverse Resolution (with CentOS 7 Differences)
If you want to reach machines on your internal network by domain name, or need to resolve IPs back into domain names, you can install BIND on Rocky Linux 9 and run your own DNS server. This post walks through the complete configuration process for forward resolution (domain to IP) and reverse resolution (IP to domain): installation, the main configuration, zone files, syntax checks, startup, and firewall — every step comes with a verification point. All commands were actually run inside a roc...
Setting Up a DHCP Server on Rocky Linux 9: MAC-Based Fixed IP Bindings (with CentOS 7 Differences)
When machines on an intranet need IP addresses handed out automatically, or when a particular device should get the same address every time (bound by MAC), you need a DHCP server. This post uses Rocky Linux 9 to record the complete flow — install, configure, syntax check, start, and client-side verification. Every step was actually run inside a Rocky Linux 9 container, including making dhclient and dhcpd complete the four-step negotiation within the same container and confirming that the boun...
ORA-01439: Three Ways to Change the Data Type of a Non-Empty Column in Oracle
Changing a column’s data type while adjusting table structure is an operation both ops engineers and developers run into. But Oracle imposes a hard restriction on columns that already hold data—modifying it directly raises an error: 1ORA-01439: 要更改数据类型, 则要修改的列必须为空 (The error text in an English environment: ORA-01439: column to be modified must be empty to change datatype) The Symptom and When It TriggersThe trigger condition is clear-cut: running ALTER TABLE ... MODIFY column_name new_type a...
Oracle Network Transport Encryption: sqlnet.ora Server-Side and JDBC Client Configuration
The most valuable data lives in the database, yet the transport link between client and server is often running naked — being on the same intranet does not mean being safe. With a packet-capture tool sitting on the link, plaintext SQL statements and result sets are fully exposed. Oracle ships with native network encryption and data integrity checking: the server side is configured in sqlnet.ora, the client side in JDBC connection properties, and once both sides line up, encrypted transport is...
Oracle Read-Only Views and Synonyms: The Complete Create, Grant, and Revoke Workflow
Suppose you want a user to be able to query data but never modify it, while also keeping sensitive columns out of reach. In Oracle, the handiest combination is “view + read-only grant”: collect the columns you want to expose into a view, then grant SELECT on the view, and the base tables stay completely invisible to that user. On top of that, synonyms add an aliasing layer that makes cross-schema access painless. This post is organized by scenario: how to give a user read-only access, how to ...
Oracle Password Complexity Policy: Locking Down Weak Passwords with a Profile and a Verification Function
Database accounts opened through weak passwords are one of the most common entry points in security incidents. Oracle ships a configurable password policy mechanism that lets the database itself reject passwords that are too weak, without relying on users’ self-discipline. The mechanism has two halves: the Profile holds the policy parameters (lockout duration, expiration), and the verification function holds the complexity rules (length, character classes). This post walks through the complet...
