[{"content":"20 Years of R\u0026amp;D Leadership I am a results-oriented Director of Software and Firmware with over 20 years of experience in the technology industry. Throughout my career, I have specialized in building and scaling multidisciplinary engineering teams from \u0026ldquo;Zero to One.\u0026rdquo;\nCurrently, I serve as the Director of Software and Firmware at Ubiquiti Inc., where I manage an organization of 250+ professionals spanning BSP, Firmware, Cloud, AI, and Mobile Applications.\nMy Journey Ubiquiti Inc.: 14 years of growth, leading technical milestones across the UniFi ecosystem, including the development of an end-to-end AI Closed-Loop Architecture (Data → Data Labeling → Model Training → AIOps → AIQA → Edge Devices). Robert Bosch: Team Leader for surveillance camera software and system architecture. Dynacolor: Deputy Manager, coordinating product lifecycles for complex security solutions. More than an Engineer As an ICF Associate Certified Coach (ACC), I am committed to building a leadership culture grounded in trust and driven by empowerment. I don\u0026rsquo;t aim to be the smartest person in the room — I aim to make every team the autonomous owner of its own domain. I deliberately replace directives with coaching conversations, and micromanagement with minimal intervention, allowing engineers to grow through ownership. At the same time, I champion a Fabric-style matrix culture that enables cross-functional teams (AI, Firmware, Cloud, QA, Mobile) to connect laterally, share knowledge and capabilities, and generate collective impact that breaks down the Silo Effect.\nAll in AI: A Hands-On Philosophy After two decades of navigating and leading through various technological shifts, I have chosen to fully embrace the AI revolution—not just as a strategic manager, but as an active builder. I firmly believe in being \u0026ldquo;hands-on and getting my hands dirty.\u0026rdquo; To truly leverage AI, one must build with it directly. My approach is to dive deep into the technology, write code, experiment relentlessly, and continuously learn. This hands-on mindset ensures that my leadership strategies remain grounded in technical reality, allowing me to fully grasp AI\u0026rsquo;s potential and practical limitations.\nThe AI Core Development Division I lead has built a complete closed-loop architecture—from data collection, labeling, and model training, through AIOps and AIQA, to Camera and AI Key hardware delivery—forming a self-reinforcing AI flywheel that continuously accelerates capability and product impact.\nFuture Horizons Looking ahead, my passion lies at the intersection of emerging technologies and meaningful, real-world impact. My core areas of interest for future endeavors include:\nArtificial Intelligence \u0026amp; Robotics Embedded Systems Blockchain Technology Cyber-Physical Systems (虛實整合) Applications that drive positive impact and contribute to human society Education Master’s Degree, Aeronautics and Astronautics | National Cheng Kung University Bachelor’s Degree, Aeronautics and Astronautics | National Cheng Kung University Let\u0026rsquo;s Connect Whether it\u0026rsquo;s discussing R\u0026amp;D leadership, exploring new tech horizons, or collaborating on impactful projects, I\u0026rsquo;d love to connect:\nEmail: kuochenfu88@gmail.com GitHub: kuochenfu LinkedIn: Fran Kuo ","permalink":"https://chenfu.ai/en/about/","summary":"\u003ch2 id=\"20-years-of-rd-leadership\"\u003e20 Years of R\u0026amp;D Leadership\u003c/h2\u003e\n\u003cp\u003eI am a results-oriented Director of Software and Firmware with over 20 years of experience in the technology industry. Throughout my career, I have specialized in building and scaling multidisciplinary engineering teams from \u0026ldquo;Zero to One.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eCurrently, I serve as the \u003cstrong\u003eDirector of Software and Firmware at Ubiquiti Inc.\u003c/strong\u003e, where I manage an organization of \u003cstrong\u003e250+ professionals\u003c/strong\u003e spanning BSP, Firmware, Cloud, AI, and Mobile Applications.\u003c/p\u003e","title":"About Fran Kuo"},{"content":"It Started with a Complaint Day three.\nThis little dev board is seriously tough. Claude Code\u0026rsquo;s free-tier generosity let me sprint hard, but I still hit the usage limit. I went to a conference that morning, and the whole time one thought kept looping in my head:\nHow much time have I spent copy-pasting?\nJTAG call stack, SWD register dumps, Serial Console logs — paste a chunk over, AI gives a suggestion, I tweak the code, rebuild, flash, grab the logs, paste them back. Over and over. Sometimes I paste into the wrong window. Sometimes I miss the critical three lines.\nCompared to debugging purely on my own, it\u0026rsquo;s unquestionably faster. But not fast enough. The bugs are like Russian nesting dolls — pull one out, there\u0026rsquo;s another inside. Every \u0026ldquo;this should fix it\u0026rdquo; → \u0026ldquo;why is it hanging again\u0026rdquo; cycle makes you want to shove the keyboard away.\nSo I started wondering: what if we could eliminate the human factor entirely?\nAn Idea: Give AI Eyes and Hands Once the problem is stated clearly, the solution becomes obvious.\nWhat I need isn\u0026rsquo;t a smarter AI. I need an AI that can see, act, and verify — by itself.\nInstead of me acting as a \u0026ldquo;human data pipe\u0026rdquo; — reading hardware signals with my eyes, then transcribing them for the AI — I want the AI to connect directly to the hardware\u0026rsquo;s sensing interfaces, receive first-hand signals, make decisions, and then drive the toolchain itself: build, flash, reset, confirm.\nThat idea became AI-HIL (AI Hardware-in-the-Loop).\nGiving hardware the soul of AI, realizing automated closed-loop development in the physical world.\nWhat Is AI-HIL? AI-HIL upgrades Claude Code from a \u0026ldquo;code generator\u0026rdquo; to a \u0026ldquo;system-level engineer.\u0026rdquo;\nThrough the Model Context Protocol (MCP), Claude Code connects to physical hardware and gains three capabilities:\nPerception: Reading serial logs, JTAG call stacks, power waveforms, camera frames Action: Build/flash firmware, hard reset, power control Closed-Loop Validation: Automatically verify fixes, record bug patterns In other words, the AI is no longer just sitting next to me offering suggestions — it\u0026rsquo;s an AI Employee that can get to work on its own.\nSystem Architecture ┌─────────────────────────────────────────────┐ │ Decision Brain │ │ Claude Code CLI + CLAUDE.md │ └───────────────────┬─────────────────────────┘ │ MCP ┌───────────────────▼─────────────────────────┐ │ Nervous System — FastMCP │ └──────┬──────────────────────────┬───────────┘ │ │ ┌──────▼──────────┐ ┌───────────▼────────────┐ │ Perception │ │ Action Plane │ │ Serial / SSH │ │ Build / Flash │ │ JTAG / SWD │ │ Hard Reset │ │ Webcam / CV │ │ GPIO / Sim │ │ PPK2 Power │ └────────────────────────┘ │ SDR / RF │ │ Thermal / Mic │ ┌────────────────────────┐ └─────────────────┘ │ Context Plane │ │ Datasheets / PDFs │ │ Golden Samples │ └────────────────────────┘ All MCP Servers are built with FastMCP (Python). Each server encapsulates one hardware dimension and returns semantic diagnostic conclusions — not raw binary data.\nThe AI sees Stack overflow detected in task foo, not 0xE000ED28 = 0x0400.\nHow the Closed Loop Works Triage Diagnosis Remediation (anomaly) → (JTAG + PPK2 → (Claude Code detected + Vision) fixes code) │ │ └───────────────────────────────────────┘ ▼ Verification PASS ──► Record bug → next Triage FAIL ──► Diagnosis (retry) Five steps form the automated closed loop:\nTriage — Perception plane detects anomaly (current spike, log error) Diagnosis — AI simultaneously checks JTAG stack, thermal image, power waveform Remediation — Claude Code modifies the C/Zig/Rust source Build \u0026amp; Flash — Auto-compile and flash to the target board Verification — Serial log + PPK2 confirm the fix; result recorded in CLAUDE.md Every successfully resolved bug becomes knowledge. The next time the AI encounters a similar pattern, it converges faster.\nStandard Diagnostic SOP When Claude Code hits a hardware issue, the standard sequence is:\nread_serial_log() # check for obvious log errors read_call_stack() # if HardFault or hang suspected measure_current(5000) # if power anomaly suspected capture_frame() # if physical state unclear build_firmware() → flash_firmware() → read_serial_log() # confirm clean boot Why This Is Worth Building To be honest, this project is still firmly in the \u0026ldquo;Ideally?\u0026rdquo; phase — some tasks require physical hardware and are being added incrementally. But the underlying logic is clear:\nGive AI cleaner, more precise data, and it will do the job better.\nWhen I\u0026rsquo;m manually copy-pasting logs, I\u0026rsquo;m a high-overhead human pipe. I get distracted, I paste wrong, I drop critical signals. When the AI can read JTAG directly, measure current itself, flash a new build, and verify the result — it\u0026rsquo;s working from complete, high-fidelity, real-time signals. Less noise in, better reasoning out.\nThis isn\u0026rsquo;t just about \u0026ldquo;automating debugging.\u0026rdquo; It\u0026rsquo;s about freeing embedded engineers from the repetitive perceive-transmit-instruct loop, letting humans focus on what actually requires genuine judgment.\nAs for \u0026ldquo;lying back and counting $$ 💰\u0026rdquo; — that\u0026rsquo;s still a long way off. First, let\u0026rsquo;s finish the closed loop.\nThe Project If you work on embedded systems or are curious about MCP + hardware integration, check it out:\n👉 github.com/kuochenfu/ai-hil-mcp\nQuick start:\ngit clone https://github.com/kuochenfu/ai-hil-mcp.git ~/ai-hil-mcp cd ~/my-firmware-project bash ~/ai-hil-mcp/setup.sh Once set up, Claude Code auto-connects to the MCP servers when you open any firmware project.\nclaude mcp list # serial-mcp: ... ✓ Connected Closing Thought Sometimes the best engineering solutions start with a complaint.\n\u0026ldquo;Why do I keep pasting logs manually?\u0026rdquo;\nState the problem clearly enough, and the answer is right there: let the AI go look for itself.\nThe road ahead is long. But the direction is right.\nProject repo: kuochenfu/ai-hil-mcp\n","permalink":"https://chenfu.ai/en/posts/ai-hil-hardware-in-the-loop/","summary":"\u003ch2 id=\"it-started-with-a-complaint\"\u003eIt Started with a Complaint\u003c/h2\u003e\n\u003cp\u003eDay three.\u003c/p\u003e\n\u003cp\u003eThis little dev board is seriously tough. Claude Code\u0026rsquo;s free-tier generosity let me sprint hard, but I still hit the usage limit. I went to a conference that morning, and the whole time one thought kept looping in my head:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eHow much time have I spent copy-pasting?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eJTAG call stack, SWD register dumps, Serial Console logs — paste a chunk over, AI gives a suggestion, I tweak the code, rebuild, flash, grab the logs, paste them back. Over and over. Sometimes I paste into the wrong window. Sometimes I miss the critical three lines.\u003c/p\u003e","title":"AI-HIL: Giving Hardware Eyes and Hands — Closed-Loop Automation for Embedded Development"},{"content":" \u0026ldquo;Face the sunshine, and forge a path in the uncharted wilderness.\u0026rdquo;\nThis manual is designed to reduce communication friction and help us collaborate effectively. After the crucible of leading 250+ person enterprise engineering teams, I am embracing an open-minded approach toward my next career chapter, seeking a team with aligned values and a shared desire to drive real-world impact through emerging technologies. Even as my context may evolve, my underlying engineer\u0026rsquo;s soul remains unchanged. This is a living document based on my 20+ years of experience, reflecting my current operational state and expectations.\n🌟 Core Philosophy \u0026amp; Vision Embracing Ambiguity \u0026amp; Action Speaks: When exploring the frontiers of emerging tech (like AI, Robotics, and Cyber-Physical Systems), the map is rarely drawn out. I deeply value resilience and tangible execution when facing the unknown. Tell me what we can do, rather than just pointing out what\u0026rsquo;s broken. Fairness Cares: I deeply value fairness. I will intervene if team members are treated unfairly or if actions negatively impact the collective good. Empowerment \u0026amp; Psychological Safety: I detest micromanagement. I provide context and expect you to take the steering wheel. We are navigating the unknown together; honest mistakes are an acceptable part of exploring the frontier. Watching you take ownership and grow is my greatest satisfaction. ⚙️ Technical Philosophy \u0026amp; Dev Culture Architectural Thinking (DDD): I have a strong bias toward Domain-Driven Design (DDD). I appreciate systems that are structured, loosely coupled, and accurately reflect real-world business realities. Exploring Technical Frontiers: Shipping the feature is only the baseline; pushing boundaries is the goal. I encourage deep curiosity and practical exploration of edge tech (e.g., Zig, Zenoh, DePIN, IoT). AI-Driven Workflows: I actively embrace AI. Don\u0026rsquo;t cling to traditional, tedious processes; I expect teams to leverage AI tools to multiply their productivity, reserving human brainpower for problem prevention and the hardest architectural judgments. 💬 Communication \u0026amp; Working Preferences Async \u0026amp; Efficiency First: Much like my preference for self-hosted infrastructure, I prefer crisp documentation over lengthy, inefficient meetings. However, for urgent matters, a direct Slack Huddle or Face-to-Face conversation is always preferred over lengthy emails. Be Straight \u0026amp; Open Minded: I prefer difficult, honest conversations over unspoken issues. I view all feedback as a learning opportunity; please be direct and offer specific suggestions. Deep Processing \u0026amp; Quiet Concentration: As an introvert, I work best in quiet environments for solving complex problems. If I am silent in a meeting, it rarely means I disagree—it means my brain is compiling in the background to find the optimal solution. My calendar is open; book time whenever you need to collaborate. ⚠️ My Struggles Elegant Architecture vs. Speed to Market: My engineer\u0026rsquo;s instinct constantly craves the \u0026ldquo;most elegant architecture,\u0026rdquo; but driving meaningful real-world impact often demands rapid iteration and speed to market. I battle this trade-off frequently. If you notice me over-engineering when we just need a quick MVP, please call me out directly. Impatience with Inefficiency: I have a very short fuse for illogical discussions or administrative friction. If I come across as cold or rushed, please bear with me—or better yet, propose a much more efficient resolution right on the spot. The Poker Face: I don\u0026rsquo;t wear my emotions visibly, which can sometimes be misread as negative. Rule of thumb: if I’m unhappy, I will say so directly; otherwise, assume the system is running smoothly! 🗂 Collaboration Deep Dive (Detailed content for the following sections will be progressively updated)\nInput \u0026amp; Output How I receive information, how long I need to react, and how I give feedback.\nMeeting Manifesto What an efficient and effective meeting looks like to me.\nAsynchronous First Why I value documentation over verbal instructions.\nHuman Sensor Acknowledging my blind spots in emotional perception and inviting partners to complement me.\nTechnical Standards My bottom line for Code Quality and DDD (Domain-Driven Design) practices.\n","permalink":"https://chenfu.ai/en/leadership-manual/","summary":"\u003cblockquote\u003e\n\u003cp\u003e\u0026ldquo;Face the sunshine, and forge a path in the uncharted wilderness.\u0026rdquo;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis manual is designed to reduce communication friction and help us collaborate effectively. After the crucible of leading 250+ person enterprise engineering teams, I am embracing an open-minded approach toward my next career chapter, seeking a team with aligned values and a shared desire to drive real-world impact through emerging technologies. Even as my context may evolve, my underlying engineer\u0026rsquo;s soul remains unchanged. This is a living document based on my 20+ years of experience, reflecting my current operational state and expectations.\u003c/p\u003e","title":"Leadership User Manual: How to Work with Me"},{"content":"14 Years at Ubiquiti: A Legacy of Scaling At Ubiquiti, my journey has been about more than technical delivery; it\u0026rsquo;s about building the human and technical infrastructure that powers a global networking leader.\n🚀 Organizational Scaling (0 to 1) I have built and scaled multidisciplinary organizations from scratch to mature, high-performing entities:\nBSP Team: Scaled from 0 to 26+ members. Cloud Services: Built the Taipei cloud organization from 0 to 30 engineers. Mobile/Apps: Established a unified team of 20+ developers. AI Core Development Team: Built from 0 to 15, spanning data engineering, model training, AIOps, AIQA, and edge device delivery — forming a complete AI closed-loop force. Factory Automation Software Team: Built from 0 to 10, focused on intelligent manufacturing software that bridges hardware mass production workflows with digital management, improving yield rates and production efficiency. Total Management: Currently overseeing 250+ professionals across Firmware, Cloud, AI, and QA. 🕸️ Fabric/Matrix: Cross-Functional Synergy I believe the true strength of an organization lies not in siloed excellence, but in the multiplier effect of cross-team collaboration. I deliberately cultivate a Fabric-style matrix culture — where AI, Firmware, Cloud, QA, and Mobile App teams interweave like the warp and weft of fabric, reinforcing each other precisely when it matters most, and actively preventing the Silo Effect:\nCross-team knowledge flow: Regular cross-functional Tech Talks and Design Reviews ensure insights flow horizontally across disciplines. Shared foundational capabilities: AI inference infrastructure, cloud data platforms, and QA automation frameworks are offered as shared services to all teams, eliminating redundant work. Proactively eliminating friction: Regularly mapping cross-team dependencies and integration touchpoints to identify collaboration opportunities and maximize overall effectiveness. 🎯 Coach Leadership: Empower, Don\u0026rsquo;t Command As an ICF Associate Certified Coach (ACC), I don\u0026rsquo;t aim to be the smartest person in the room — I aim to make every team member and every team the autonomous owner of their own domain:\nTrust and delegation: Giving engineers true ownership and accountability over their work without micromanagement. Coaching conversations: Asking questions instead of giving answers, guiding team members to discover solutions themselves and build decision-making confidence. Minimizing over-intervention: Resisting the urge to step in unless a critical risk demands it — allowing teams to learn through execution and grow through challenge. The highest achievement is enabling others: When every team can independently carry a critical role in the organization — even beyond my own capabilities — that is when leadership has fulfilled its purpose. ☁️ Cloud Platform Scale \u0026amp; Growth Transformed and managed the core Central Cloud Services powering the entire hardware ecosystem globally:\nSSO Identity Platform: Scaled the identity platform to 10 Million registrations (9 Million verified users). Sustained a remarkable 3,400× growth factor since launch, achieving a recent processing peak of ~157k new users/month with a 19% YoY 2025 growth engine. IoT Ecosystem Scale (NCA): Expanded global console orchestration to manage 3.5 Million active online consoles (+150% over 3 years) along with 30 Million total managed application devices. Mastercrafted the architectural transition through an explosive 85× early adoption multiplier to sustained 30%+ YoY market maturity. High Availability (SRE/SLA): Built robust SRE practices and achieved consistent 99.5% monthly availability across all major cloud services in the past 2 years. Dramatically bound global downtime (limiting critical incident durations to less than 10-12 aggregate hours globally per year out of 8,760 hours). Critical Service Expansions: Oversaw the mass-scaling of the Firmware Update Service and active subscription platforms. 🤖 AI Core Development Division: End-to-End Closed-Loop Architecture We have established a complete AI Closed-Loop Architecture — a self-reinforcing, continuously evolving system that spans from raw data ingestion all the way to edge device delivery. Each stage is tightly integrated, enabling rapid AI iteration and real-world deployment at scale.\nRaw Data → Data Labeling → Model Training → AIOps → AIQA → Edge Device Delivery ↑ | └─────────────────────── Feedback Loop ────────────────────────────────┘ 📊 Data (Data Infrastructure) Built diverse data ingestion pipelines spanning camera streams, IoT sensor events, and user behavior logs. Designed a data warehouse architecture with strong emphasis on data quality, traceability, and compliance (GDPR/privacy standards). Introduced data versioning to ensure every model training run maps to a complete and reproducible dataset snapshot. 🏷️ Data Labeling Built an in-house labeling platform and workflow covering image classification, object detection (bounding boxes), and semantic segmentation. Applied Active Learning strategies to prioritize labeling of the most model-impactful hard samples, reducing labeling costs by 40%+. Established QA Audit processes to ensure labeling consistency and accuracy are maintained to a high standard. 🧠 AI Model Training Led the full training lifecycle from research prototype to production-ready models, spanning Computer Vision (detection, tracking, recognition) and multi-modal LLM integration. Built MLOps training infrastructure supporting distributed training, hyperparameter optimization (HPO), and experiment tracking (MLflow/W\u0026amp;B). Achieved model compression optimized for edge hardware via Quantization, Pruning, and Knowledge Distillation — significantly reducing inference latency and power consumption without sacrificing accuracy. ⚙️ AIOps (AI Operations) Built a full model lifecycle management platform covering model versioning, A/B deployment, canary releases, and automated rollback. Implemented Model Drift Detection to monitor live inference quality and trigger automated retraining pipelines. Designed a dual-layer cloud + edge AI inference architecture that dynamically routes workloads based on latency and accuracy requirements. ✅ AIQA (AI Quality Assurance) Established a systematic AI evaluation framework covering functional metrics (mAP, Recall, Precision), edge case testing, and adversarial stress tests. Defined AI Product Launch Criteria to ensure every AI-enabled product passes rigorous quality gates before shipment. Integrated a CI/CD for AI pipeline, embedding model evaluation into the development loop to accelerate iteration velocity. 📦 Edge Device Delivery (Camera \u0026amp; AI Key) Led end-to-end development of the UniFi Camera Gen2/3/4/5/6 series, embedding AI capabilities (face recognition, vehicle detection, anomaly analysis) directly on-device for real-time, low-latency inference. Drove the development and mass production delivery of the AI Key (dedicated AI accelerator hardware), enabling an AI compute upgrade path for existing devices without hardware replacement. Established an AI model OTA update mechanism allowing model-only upgrades independent of system firmware, shortening AI feature iteration cycles to days. Managed the complete production lifecycle from RD → DVT → PVT → MP, ensuring shipping quality targets and delivery commitments for AI hardware are met. 🧩 LLM Internal Services: AI-Powered Intelligent Workflows Beyond edge AI product R\u0026amp;D and delivery, our AI team simultaneously leads multiple LLM core services targeting both internal operations and external user experiences — translating the power of language models into real, deployable business value.\n📣 Social Hearing Built an automated social media data crawling and analysis pipeline covering major platforms (Reddit, Twitter/X, community forums) for user reviews and feedback. Applied LLM-based semantic understanding and sentiment analysis to precisely extract real user pain points regarding features, quality, and service, automatically categorizing them into Actionable Insights. Fed analysis results directly into Product Team iteration prioritization decisions, shortening the cycle from \u0026ldquo;user voice\u0026rdquo; to \u0026ldquo;product improvement.\u0026rdquo; 💥 Device Crash Analysis Built an LLM-powered crash log semantic analysis system that automatically parses Crash Reports, Stack Traces, and system logs to identify Root Cause patterns. Automatically clusters and aggregates crash events into a ranked hotspot list, enabling Product Teams and firmware engineers to precisely target high-frequency issues and significantly improve bug fix efficiency. Integrated with the CI/CD pipeline to automatically monitor crash trends after new releases, enabling early warning detection. 📋 Product Support File Analysis Built an automated Support File parsing engine that uses LLM to analyze device support files (logs, config snapshots, status reports) returned by users, extracting key anomaly signals. Automatically generates issue summaries and resolution recommendations, helping the Technical Support team quickly pinpoint problems and reducing manual analysis time by 60%+. Accumulated analysis results build a knowledge base that empowers the Product Team to precisely understand real user pain points, driving continuous optimization of product design and firmware. 🌐 Company Website \u0026amp; App LLM Backend (Intelligent Support Bot) Led the development of the LLM backend services for the company website and mobile apps, providing a one-stop intelligent conversational interface covering product information queries, feature usage guidance, and troubleshooting diagnostics. Adopted a RAG (Retrieval-Augmented Generation) architecture, integrating product documentation, knowledge bases, and FAQs to ensure Chat Bot response accuracy and timeliness. Designed multi-turn conversation management to support complex scenario context tracking, enabling users to complete configuration, troubleshooting, and service requests without human agent intervention. Continuously optimizes models and the knowledge base through user conversation data, forming a positive cycle of \u0026ldquo;user interaction → knowledge refinement → service quality improvement.\u0026rdquo; ","permalink":"https://chenfu.ai/en/impact/","summary":"\u003ch2 id=\"14-years-at-ubiquiti-a-legacy-of-scaling\"\u003e14 Years at Ubiquiti: A Legacy of Scaling\u003c/h2\u003e\n\u003cp\u003eAt Ubiquiti, my journey has been about more than technical delivery; it\u0026rsquo;s about building the human and technical infrastructure that powers a global networking leader.\u003c/p\u003e\n\u003ch3 id=\"-organizational-scaling-0-to-1\"\u003e🚀 Organizational Scaling (0 to 1)\u003c/h3\u003e\n\u003cp\u003eI have built and scaled multidisciplinary organizations from scratch to mature, high-performing entities:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eBSP Team\u003c/strong\u003e: Scaled from \u003cstrong\u003e0 to 26+\u003c/strong\u003e members.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCloud Services\u003c/strong\u003e: Built the Taipei cloud organization from \u003cstrong\u003e0 to 30\u003c/strong\u003e engineers.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMobile/Apps\u003c/strong\u003e: Established a unified team of \u003cstrong\u003e20+\u003c/strong\u003e developers.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAI Core Development Team\u003c/strong\u003e: Built from \u003cstrong\u003e0 to 15\u003c/strong\u003e, spanning data engineering, model training, AIOps, AIQA, and edge device delivery — forming a complete AI closed-loop force.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFactory Automation Software Team\u003c/strong\u003e: Built from \u003cstrong\u003e0 to 10\u003c/strong\u003e, focused on intelligent manufacturing software that bridges hardware mass production workflows with digital management, improving yield rates and production efficiency.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTotal Management\u003c/strong\u003e: Currently overseeing \u003cstrong\u003e250+\u003c/strong\u003e professionals across Firmware, Cloud, AI, and QA.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"-fabricmatrix-cross-functional-synergy\"\u003e🕸️ Fabric/Matrix: Cross-Functional Synergy\u003c/h3\u003e\n\u003cp\u003eI believe the true strength of an organization lies not in siloed excellence, but in \u003cstrong\u003ethe multiplier effect of cross-team collaboration\u003c/strong\u003e. I deliberately cultivate a \u003cstrong\u003eFabric-style matrix culture\u003c/strong\u003e — where AI, Firmware, Cloud, QA, and Mobile App teams interweave like the warp and weft of fabric, reinforcing each other precisely when it matters most, and actively preventing the Silo Effect:\u003c/p\u003e","title":"Product Impact \u0026 Organizational Scaling"},{"content":"Introduction In our pursuit of the \u0026ldquo;All in AI\u0026rdquo; philosophy, the process of internalizing and producing knowledge shouldn\u0026rsquo;t be hindered by complex toolchains. By deeply integrating Obsidian with the chenfu.ai project, I have successfully achieved a seamless \u0026ldquo;edit-to-publish\u0026rdquo; experience. By incorporating AI-assisted analysis, every note I take now resonates with my historical technical expertise.\nPhase 1: Basic Connection and Path Optimization First, we set up Obsidian as the dedicated editor for the Hugo project, linking local files directly to the Vault.\nOpen Project: Launch Obsidian and select Open folder as vault. Path Configuration: Navigate to the local project path /Users/chenfu/Labs/chenfu.ai. Optimize Directory View: Primary Creation Zone: content/posts/ (Blog posts). Core Pages: content/ (About, Projects, etc.). Phase 2: Git Integration for Automated Publishing To achieve a \u0026ldquo;write-and-publish\u0026rdquo; workflow, we use the Obsidian Git plugin to connect the editor with GitHub.\nInstall Plugin: Search for and install Obsidian Git (by Vinzent03) in Community plugins. Sync Settings: Manual Trigger (Recommended): Use the shortcut Cmd + P and type Git: Push to send updates to GitHub. Automated Backup: You can set a Vault backup interval (e.g., every 60 minutes) for automatic synchronization. Deployment Flow: Once the push is successful, Cloudflare Pages automatically detects the update and completes the deployment within 3 minutes. Phase 3: AI Enhancement—Activating the Digital Twin This is the core of AI-ifying our knowledge system: using Smart Connections to enable notes to \u0026ldquo;talk\u0026rdquo; across different time periods.\nEmbedding: The plugin reads all historical articles and notes, building a vector model of your personal knowledge base. Smart Correlation: While writing, a side window automatically suggests: \u0026ldquo;In your 2018 notes, you mentioned a similar technical logic\u0026hellip;\u0026rdquo; Knowledge Q\u0026amp;A: You can directly ask the AI: \u0026ldquo;Based on my past records, what are my core values regarding the integration of embedded systems and AI?\u0026rdquo; Phase 4: Hugo Writing Templatization To avoid the hassle of manually writing Frontmatter (YAML), standardized templates are pre-configured in the project:\nTemplate Path: doc/templates/ in the project directory. Quick Recall: Configure the template path in Obsidian settings to point to this folder. When creating a new post, use Templates: Insert template to call up hugo-post-template. Default Logic: git-settings.json is configured with the Commit message format to ensure a clean Git history. Phase 5: Social Interaction (Giscus) To increase engagement, the site integrates a comment system based on GitHub Discussions:\nComment Management: All comment data is synchronized with Discussions in the GitHub Repo, allowing for direct management via the GitHub web interface. Feature Highlights: Supports reactions (+1/-1) and a multi-language interface. Checkpoint: Ensure the Discussions feature is enabled in the GitHub Repository\u0026rsquo;s General settings. 💡 Daily Workflow Summary Capture Inspiration: Open Obsidian and use the template to quickly create a new article. AI Assistance: Use Smart Connections to link technical and management insights from over 14 years. Write and Preview: Write in Markdown (images are stored in static/img/, with reference paths as /img/xxx.png). One-Click Publish: Cmd + P \u0026gt; Git: Commit-and-sync. Live Instantly: Wait 3 minutes, and chenfu.ai is automatically updated. Conclusion Combining writing tools with publishing channels not only lowers the barrier to sharing but, more importantly, allows me to engage in a \u0026ldquo;technical dialogue with my past self\u0026rdquo; via AI plugins. This is not just a blog; it is an extension of my personal digital brainpower.\n","permalink":"https://chenfu.ai/en/posts/obsidian-digital-brain/","summary":"\u003ch2 id=\"introduction\"\u003eIntroduction\u003c/h2\u003e\n\u003cp\u003eIn our pursuit of the \u0026ldquo;All in AI\u0026rdquo; philosophy, the process of internalizing and producing knowledge shouldn\u0026rsquo;t be hindered by complex toolchains. By deeply integrating \u003cstrong\u003eObsidian\u003c/strong\u003e with the \u003cstrong\u003echenfu.ai\u003c/strong\u003e project, I have successfully achieved a seamless \u0026ldquo;edit-to-publish\u0026rdquo; experience. By incorporating AI-assisted analysis, every note I take now resonates with my historical technical expertise.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"phase-1-basic-connection-and-path-optimization\"\u003ePhase 1: Basic Connection and Path Optimization\u003c/h2\u003e\n\u003cp\u003eFirst, we set up Obsidian as the dedicated editor for the Hugo project, linking local files directly to the Vault.\u003c/p\u003e","title":"Obsidian Digital Brain: Building the 'Edit-to-Publish' Workflow for chenfu.ai"},{"content":"No more words to say. Farewell my little angel\u0026hellip;\n","permalink":"https://chenfu.ai/en/posts/%E5%BF%83%E6%83%85%E9%9A%A8%E7%AD%86-farewell-my-ange/","summary":"\u003cp\u003eNo more words to say. Farewell my little angel\u0026hellip;\u003c/p\u003e","title":"[Personal Reflections] Farewell My Angel"},{"content":"Weeks ago, my colleague saw a very interesting video on Ted. He sent me the link and I\u0026rsquo;m really excited. The reason why he sent me was because we ever discussed the future of the video system month ago. Everyone raised different ideas of the device and my idea is the quadcopters with camera on it.\nWhy I wanna do such kind of device is oriented from my study in university. I\u0026rsquo;ve been studied the mechanics in Aeronautics and Astronautics department, bachelor plus master are total 6 years. There is less such kind of career opportunity in Taiwan because of the environment. Lots of my classmates join the semiconductor industry to be equipment engineers in the company like TSMC, CMO\u0026hellip;etc. A little part including me choose different road to be R\u0026amp;D engineer in other industry.\nMy first resume is to apply a mechanical engineer but my destiny lead me to be a software engineer in surveillance system. Fortunately, I witness the most important period of surveillance. It\u0026rsquo;s from the close system to open system, then open system to smart system. An significant change is the infrastructure of IP network growing rapidly. The network technology overcome the bubble in 2000 and reform the play rules in lots of industry. The open system gradually become mature and we head the future for smart one.\nThe quadcopter is one example of such kind of devices. The link: http://www.ted.com/speakers/raffaello_d_andrea.html\nI was impressed for the first demo of the inverted pendulum, this is the basic control experiment when in school. Now it was realized on a quadcopter, what amazing! My original thinking is just patrolling from one base station to another but now is far beyond my imagination. Both M2M and H2M are totally implemented in this video. Machines can self-repaired, catch ball, even co-work with each other to finish task and interactive with people. This is a new era of the smart devices not only on smart phone. The time frame from network bubble to now is 10 years and I thought the smart network/device is another 10 years at least. Let\u0026rsquo;s keep our pace on it.\n","permalink":"https://chenfu.ai/en/posts/%E7%A7%91%E6%8A%80%E6%96%B0%E7%9F%A5-the-astounding-athletic-power-of-quadcopters/","summary":"\u003cp\u003eWeeks ago, my colleague saw a very interesting video on Ted. He sent me the link and I\u0026rsquo;m really excited. The reason why he sent me was because we ever discussed the future of the video system month ago. Everyone raised different ideas of the device and my idea is the quadcopters with camera on it.\u003c/p\u003e\n\u003cp\u003eWhy I wanna do such kind of device is oriented from my study in university. I\u0026rsquo;ve been studied the mechanics in Aeronautics and Astronautics department, bachelor plus master are total 6 years. There is less such kind of career opportunity in Taiwan because of the environment. Lots of my classmates join the semiconductor industry to be equipment engineers in the company like TSMC, CMO\u0026hellip;etc. A little part including me choose different road to be R\u0026amp;D engineer in other industry.\u003c/p\u003e","title":"[Tech Insights] The Astounding Athletic Power of Quadcopters"},{"content":"Weeks ago, my colleague saw a very interesting video on Ted. He sent me the link and I\u0026rsquo;m really excited. The reason why he sent me was because we ever discussed the future of the video system month ago. Everyone raised different ideas of the device and my idea is the quadcopters with camera on it.\nWhy I wanna do such kind of device is oriented from my study in university. I\u0026rsquo;ve been studied the mechanics in Aeronautics and Astronautics department, bachelor plus master are total 6 years. There is less such kind of career opportunity in Taiwan because of the environment. Lots of my classmates join the semiconductor industry to be equipment engineers in the company like TSMC, CMO\u0026hellip;etc. A little part including me choose different road to be R\u0026amp;D engineer in other industry.\nMy first resume is to apply a mechanical engineer but my destiny lead me to be a software engineer in surveillance system. Fortunately, I witness the most important period of surveillance. It\u0026rsquo;s from the close system to open system, then open system to smart system. An significant change is the infrastructure of IP network growing rapidly. The network technology overcome the bubble in 2000 and reform the play rules in lots of industry. The open system gradually become mature and we head the future for smart one.\nThe quadcopter is one example of such kind of devices. The link: http://www.ted.com/speakers/raffaello_d_andrea.html\nI was impressed for the first demo of the inverted pendulum, this is the basic control experiment when in school. Now it was realized on a quadcopter, what amazing! My original thinking is just patrolling from one base station to another but now is far beyond my imagination.\n","permalink":"https://chenfu.ai/en/posts/the-astounding-athletic-power-of-quadcopters/","summary":"\u003cp\u003eWeeks ago, my colleague saw a very interesting video on Ted. He sent me the link and I\u0026rsquo;m really excited. The reason why he sent me was because we ever discussed the future of the video system month ago. Everyone raised different ideas of the device and my idea is the quadcopters with camera on it.\u003c/p\u003e\n\u003cp\u003eWhy I wanna do such kind of device is oriented from my study in university. I\u0026rsquo;ve been studied the mechanics in Aeronautics and Astronautics department, bachelor plus master are total 6 years. There is less such kind of career opportunity in Taiwan because of the environment. Lots of my classmates join the semiconductor industry to be equipment engineers in the company like TSMC, CMO\u0026hellip;etc. A little part including me choose different road to be R\u0026amp;D engineer in other industry.\u003c/p\u003e","title":"The astounding athletic power of quadcopters"},{"content":"Recently, I\u0026rsquo;ve become very busy due to taking over tasks from another site. The original coding work is still there, so I started looking for an outstanding developer to join us. In the first month, I tried to draw from my colleagues\u0026rsquo; and my own networks — but in vain. Now I\u0026rsquo;ve shifted the search to a headhunter and started conducting interviews.\nI\u0026rsquo;ve interviewed a lot of people at my first and second jobs. Interviewing candidates through a headhunter is a very different experience. Why? Many factors influence what kind of developer you\u0026rsquo;re actually looking for.\nTake my first job as an example: the company didn\u0026rsquo;t want to pay much for experienced engineers due to uncertainty and a poor historical track record. So we preferred to hire fresh graduates. The strategy was simpler: first, check the academic record to see if they\u0026rsquo;d been doing their student responsibilities well. Second, give an aptitude test to assess logic, patience, etc. Based on the results, we\u0026rsquo;d also talk with them on various topics to gauge attitude, communication, expression — and most importantly, potential. Add it all up and you could make a reasonable judgment. Much easier and simpler, right?\nNow, back to my current experience. We are looking for someone very experienced and excellent. No academic record or aptitude test. Instead, we have to judge the body of work they\u0026rsquo;ve built across their career. Headhunters should in theory filter resumes for you, but some headhunters are like real estate agents — quantity over quality. So we still have to work hard to gather information from multiple channels, to make sure the applicants are who we think they are.\nBeyond that, I\u0026rsquo;ve had to design different kinds of assessment tasks — 30-minute coding challenges, difficult technical questions, etc. It\u0026rsquo;s become far more complex to judge whether someone is truly a fit, because we don\u0026rsquo;t have the luxury of time to try someone like with a rookie hire. It\u0026rsquo;s challenging and interesting. Here\u0026rsquo;s hoping we find our \u0026ldquo;Rambo\u0026rdquo; soon.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-looking-for-solid-developer/","summary":"\u003cp\u003eRecently, I\u0026rsquo;ve become very busy due to taking over tasks from another site. The original coding work is still there, so I started looking for an outstanding developer to join us. In the first month, I tried to draw from my colleagues\u0026rsquo; and my own networks — but in vain. Now I\u0026rsquo;ve shifted the search to a headhunter and started conducting interviews.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve interviewed a lot of people at my first and second jobs. Interviewing candidates through a headhunter is a very different experience. Why? Many factors influence what kind of developer you\u0026rsquo;re actually looking for.\u003c/p\u003e","title":"[Work Notes] Looking for a Solid Developer"},{"content":"Recently, my workload has surged significantly as I’ve taken over tasks from other sites. Between managing original coding responsibilities and new oversight, I’ve started a serious search for outstanding talent to join the team. During the first month, I tried sourcing candidates through internal referrals and my personal network, but without luck. I’ve now moved this search to headhunters and have begun the interview process.\nI interviewed many people in my first two roles, but interviewing candidates recommended by headhunters at this stage of my career feels different and much more interesting. The criteria for what kind of developer you need are heavily influenced by the organization\u0026rsquo;s current goals and history.\nTake my first job, for example. The company was hesitant to pay a premium for experienced engineers due to past negative experiences and general uncertainty. Consequently, we focused exclusively on hiring fresh graduates. The strategy for finding \u0026ldquo;new blood\u0026rdquo; was straightforward:\nCheck academic records to ensure they performed well during their studies. Administer aptitude tests to gauge logic, patience, and problem-solving skills. Conduct personal interviews to assess attitude, communication, and, most importantly, potential. Today, the requirements are vastly different. We are looking for highly experienced, elite developers. Academic records and basic aptitude tests are no longer the primary indicators. Instead, we must rigorously judge the complexity and impact of the work they’ve done throughout their careers. While headhunters are supposed to filter resumes, some operate more like aggressive sales reps, so we still must do our own due diligence across different channels to verify a candidate\u0026rsquo;s pedigree. I’ve also implemented more technical assessments, such as 30-minute coding challenges and deep-dive technical inquiries.\nJudging a seasoned pro is more complicated than hiring a rookie because there’s no luxury of \u0026ldquo;trial and error\u0026rdquo; time. We need \u0026ldquo;Rambos\u0026rdquo; who can jump in and deliver immediate value. It’s a challenging but fascinating process. Hopefully, we’ll find our Rambo soon.\n","permalink":"https://chenfu.ai/en/posts/looking-for-solid-developer/","summary":"\u003cp\u003eRecently, my workload has surged significantly as I’ve taken over tasks from other sites. Between managing original coding responsibilities and new oversight, I’ve started a serious search for outstanding talent to join the team. During the first month, I tried sourcing candidates through internal referrals and my personal network, but without luck. I’ve now moved this search to headhunters and have begun the interview process.\u003c/p\u003e\n\u003cp\u003eI interviewed many people in my first two roles, but interviewing candidates recommended by headhunters at this stage of my career feels different and much more interesting. The criteria for what kind of developer you need are heavily influenced by the organization\u0026rsquo;s current goals and history.\u003c/p\u003e","title":"Looking for a Solid Developer"},{"content":"The PoC is power over cable and it\u0026rsquo;s just like the PoE on IP camera. I met a supplier that they can provide the PoC solution on the ccHDtv system. Originally, I thought it\u0026rsquo;s a useful and necessary function but it\u0026rsquo;s not at all now. Why?\nThe CCTV is always starting from system point of view but not just the device only like the cellphone. The first factor is that the analog CCTV infrastructure has already built over there for a long time. That means the power cable is existing and reliable. So it is not necessary to equip the PoC except the project a brand new installation. The second, the strategy of the ccHDtv alliance is to replace the traditional analog surveillance system from VGA to HD but not to compete with the existing IP surveillance system. We can totally confirm that it\u0026rsquo;s not necessary to equip PoC on DTV camera. The others factor like the cost increase, design complexity increase and regulation to pass.\nTo sum up, even if we want to create a ccHDtv product line, the PoC function should be put as the option instead of the must one on specification.\n","permalink":"https://chenfu.ai/en/posts/%E7%94%A2%E6%A5%AD%E8%A7%80%E5%AF%9F-the-necessity-of-poc-on-cchdtv/","summary":"\u003cp\u003eThe PoC is power over cable and it\u0026rsquo;s just like the PoE on IP camera. I met a supplier that they can provide the PoC solution on the ccHDtv system. Originally, I thought it\u0026rsquo;s a useful and necessary function but it\u0026rsquo;s not at all now. Why?\u003c/p\u003e\n\u003cp\u003eThe CCTV is always starting from system point of view but not just the device only like the cellphone. The first factor is that the analog CCTV infrastructure has already built over there for a long time. That means the power cable is existing and reliable. So it is not necessary to equip the PoC except the project a brand new installation. The second, the strategy of the ccHDtv alliance is to replace the traditional analog surveillance system from VGA to HD but not to compete with the existing IP surveillance system. We can totally confirm that it\u0026rsquo;s not necessary to equip PoC on DTV camera. The others factor like the cost increase, design complexity increase and regulation to pass.\u003c/p\u003e","title":"[Industry Observation] The Necessity of PoC on ccHDtv"},{"content":"What is ccHDtv? Closed Circuit HD TV (ccHDtv) is a newly developed solution for transmitting full HD digital video in a surveillance system. The core concept of ccHDtv is to deliver high-definition video using digital TV (DTV) transmission. With ccHDtv, high-definition digital video can be transmitted easily over coaxial cables, twisted pairs, or simply over the air. Multiple 1080p30 and 1080p60 video streams can be easily transmitted using ccHDtv over a single 3C2V/RG59 cable up to 500 meters without any repeater.\nIn the world of analog TV, the Composite Video Baseband Signal (CVBS) is the most commonly used format. Its popularity, ease of use, and robustness made it integral to surveillance. As worldwide analog switch-off (ASO) transitioned us to digital TV, technologies like DVB-T, ISDB-T, and ATSC became important. ccHDtv leverages DTV\u0026rsquo;s robust AV transmission to seamlessly upgrade analog CCTV to digital full HD. It is expected to become a de facto standard for digital surveillance in the future.\nccHDtv is pioneered by ITE Tech. Inc. ITE has developed key enabling products, reference system designs, and applications for ccHDtv — enabling seamless upgrade from analog to digital surveillance.\nCore Technology: COFDM Transmitter / Receiver\nMore information on OFDM: http://en.wikipedia.org/wiki/Orthogonal_frequency-division_multiplexing\nFeatures of ccHDtv Reuse existing coaxial cable deployment without any upgrade Same planning, deployment and debugging processes as traditional CCTV Any iDTV set with DVB-T feature can receive ccHDtv signal without an HD DVR Return channels supported: Full duplex communication PTZ control, camera configuration, I/O settings, return audio, remote firmware update Eavesdropping Prevention — supports encrypted signals No frame drops and real-time delivery Quasi-zero latency; quasi-real-time preview for 9x, 16x, 32x\u0026hellip; Long distance transmission: 3c2v/RG-59 up to 500M+ without repeater 5c2v/RG-6 up to 1,000M+ without repeater Digital repeater for infinite extension High bandwidth: Multiple full HD camera streams over a single coaxial cable ccHDtv Full HD Surveillance System Star Topology: Same as traditional CCTV deployment — same cable and connectors. Cable medium requirements for DTV CAM are actually less than for analog cameras.\nBus Topology: Similar to cable TV deployment. Allows multiple DTV CAMs on a single cable using coaxial cables, connectors, mixers and amplifiers.\nRing Topology — Failure-Safe (Redundant) Cable Deployment: Ring and multi-path connections are allowed, enabling failure-safe redundancy. Worst recovery time: \u0026lt;500ms.\nSource: http://www.cchdtv.com.tw/en/intro.php | FAQ: http://www.cchdtv.com.tw/en/faq/index.php\nSpecification Highlights Full duplex communication (two-way audio and control) Multiple streams supported; max data rate per channel: 32Mbps Wireless transmission is technically possible (regulations vary) Power over cable supported (both AC/DC) Crypto supported Pros vs. HDcctv Media is compressed — ccHDtv can achieve much longer distances Supports bus and star topology — easier installation and lower cable cost Supports multiple stream transmission (HDcctv cannot) Supports crypto (HDcctv struggles with this) Uses TV standard — stronger backend support Cons vs. HDcctv None — unless you count that the media is compressed Pros vs. IP Camera Ethernet bandwidth is limited and degrades with multiple IP cameras. ccHDtv gives each camera its own proprietary data channel (up to 32Mbps) with guaranteed no frame drop Video quality is quasi-equivalent to lossless compression Latency is more stable than IP (IP can only define best-case latency) Cons vs. IP Camera Theoretically supports 120+ DTV CAMs, but 32–48 cameras recommended to minimize adjacent channel interference. Better suited for small/medium projects (though it can co-work with IP via gateway) Conclusion Large-scale replacement of existing infrastructure to pure IP is unlikely. Only brand-new large projects will go all-IP ccHDtv creates a much simpler path for upgrading traditional VGA systems to HD ccHDtv can co-exist with IP systems IP NVR systems can be leveraged to support DTV cameras — a DTV camera is essentially an IP camera with a different interface ccHDtv uses proven TV standards — it\u0026rsquo;s robust My view: ccHDtv poses a real threat to IP cameras and could significantly slow down the transition to IP-based surveillance.\n","permalink":"https://chenfu.ai/en/posts/%E7%A7%91%E6%8A%80%E6%96%B0%E7%9F%A5-cchdtv-study/","summary":"\u003ch2 id=\"what-is-cchdtv\"\u003eWhat is ccHDtv?\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"/img/Blogger/cchdtv_01.jpg\"\u003e\u003cimg loading=\"lazy\" src=\"/img/Blogger/cchdtv_01.jpg\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eClosed Circuit HD TV (ccHDtv) is a newly developed solution for transmitting full HD digital video in a surveillance system. The core concept of ccHDtv is to deliver high-definition video using digital TV (DTV) transmission. With ccHDtv, high-definition digital video can be transmitted easily over coaxial cables, twisted pairs, or simply over the air. Multiple 1080p30 and 1080p60 video streams can be easily transmitted using ccHDtv over a single 3C2V/RG59 cable up to 500 meters without any repeater.\u003c/p\u003e","title":"[Tech Insights] ccHDtv Study"},{"content":"What is ccHDtv? Closed Circuit HD TV (ccHDtv) is a newly developed solution for transmitting full HD digital video in a surveillance system. The core concept of ccHDtv is to deliver high definition video using digital TV (DTV) transmission. With ccHDtv, high definition digital video can be transmitted easily over coaxial cables, twisted pairs, or simply over the air. Multiple 1080p30 and 1080p60 video streams can be easily transmitted using ccHDtv over a single 3C2V/RG59 cable up to a length of 500 meters without any repeater.\nIn the world of analog TV, The composite video baseband signal (CVBS) is the most commonly used signal format. Its popularity, ease of use, and robustness have made it an integral part of our lives. CVBS is in fact a de facto signal standard for analog video surveillance systems. As we bid farewell to analog TV with worldwide analog switch-off (ASO) and move on to the age of digital TV, digital technologies, such as DVB-T, ISDB-T, and ATSC, became popular and indispensable much like CVBS in the analog age. ccHDtv leverages the extremely robust AV transmission capability of DTV to easily and seamlessly upgrade an analog cctv surveillance system to digital full HD. It is expected ccHDtv to become a de facto standard for digital video surveillance systems in the future.\n","permalink":"https://chenfu.ai/en/posts/cchdtv-study/","summary":"\u003cp\u003eWhat is ccHDtv?\nClosed Circuit HD TV (ccHDtv) is a newly developed solution for transmitting full HD digital video in a surveillance system. The core concept of ccHDtv is to deliver high definition video using digital TV (DTV) transmission. With ccHDtv, high definition digital video can be transmitted easily over coaxial cables, twisted pairs, or simply over the air. Multiple 1080p30 and 1080p60 video streams can be easily transmitted using ccHDtv over a single 3C2V/RG59 cable up to a length of 500 meters without any repeater.\u003c/p\u003e","title":"ccHDtv study"},{"content":"I\u0026rsquo;ve started collecting the information around the end of 2010 because the wireless technology advanced to much higher bandwidth for multimedia streaming.\nThere are two conditions of the development that I thought.\n1. To develop the whole wireless part by ourselves.\n2. To buy the module directly from the supplier.\nBut some important factors that make me just \u0026lsquo;collect information\u0026rsquo; at that moment.\nFor 1, the expense is very horrible.\n- We have to pay chip vendor for NRE.\n- We are new to be the player and we have no credit to the chip vendor.\n- We have no equipment and we have to invest a lot to do it.\n- There are lots of tasks need for the regulation.\nTo sum up, this is a money game for surveillance company and we see no market at that moment.\nFor 2, we could leverage a lot tasks to supplier but we still have to prepare equipment to verify the whole system and get the experience of the regulation. However, the module cost and performance ratio could not meet our requirement. It is quite challenge for me to persuade my boss to do it.\nSo what I can do is just keep attention on wireless technology.\nUntil now, I have the chance to do the development finally.\nAlthough I\u0026rsquo;m newbie for wireless, it\u0026rsquo;s not too hard to enter this area. The reason is the technology become much mature and we can make it work even we do not know much about wireless. So, let\u0026rsquo;s just do it.\nThe module I use is based on Atheros AR6103 and AR6003. The driver of these two chips are similar.\nThe documents I study is are mainly from Atheros. I also reference the IEEE specification and search on Google.\nThe equipment and wireless module board\n- Power meter is Agilent E4416A EPM-P single channel power meter.\nThis equipment can only measure the power from the wireless module from 50MHz~6GHz.\nWe could not know the power is generated om which frequency.\n- Attenuator to avoid the large power.\n- The AR6003 module board\n- To connect the module board to evaluation board and power meter.\n- Without power output.\n- With power output.\nIf we want to know the power is contribute from which frequency channel and band. We need Spectrum Analyzer to check further. But for quick check the driver is working or not, this is already enough.\nThe tools from Atheros \u0026lsquo;athtestcmd\u0026rsquo;.\nAtheros test tool \u0026lsquo;athtestcmd\u0026rsquo;: We have to insmod the driver with parameter \u0026rsquo;testmode=1\u0026rsquo; or we could not use this command.\n\u0026lsquo;-i device\u0026rsquo;: example, \u0026lsquo;-i eth1\u0026rsquo;, \u0026lsquo;-i wlan0\u0026rsquo;.\n\u0026lsquo;\u0026ndash;tx frame\u0026rsquo;: Continuous modulated Tx, AIFS(arbitration interframe space) can be set with the option \u0026ndash;aifsn.\n\u0026lsquo;\u0026ndash;tx tx99\u0026rsquo;: Continuous modulated Tx, AIFS is fixed to 0.\n\u0026lsquo;\u0026ndash;tx tx100\u0026rsquo;: Continuous modulated but unframed Tx.\n\u0026lsquo;\u0026ndash;tx off\u0026rsquo;: Disable continuous Tx.\n\u0026lsquo;\u0026ndash;tx freq\u0026rsquo;: Channel frequency in MHz, but this frequency does not mean center frequency.\nSee: \u0026lt;http://en.wikipedia.org/wiki/List_of_WLAN_channels\u0026gt; \u0026lsquo;\u0026ndash;txrate \u0026rsquo;: Reference as below.\n\u0026lsquo;\u0026ndash;txpwr\u0026rsquo;: tx power.\n\u0026lsquo;\u0026ndash;txantenna\u0026rsquo;: 1 for antenna 1, 2 for antenna 2, 0 is auto. default is auto.\n\u0026lsquo;\u0026ndash;txpktsz\u0026rsquo;: tx packet size.\n\u0026lsquo;\u0026ndash;txpattern\u0026rsquo;: Tx frame bits pattern. The pattern of PN7/PN9/PN15 stands for pseudo noise code of length 2^7/2^9/2^15 bits.\nBecause the length of PN15 is large than max packet size, it's sent by 4 continuous packets. The '--txpktsz' option is ignored when setting pattern to PN15. \u0026lsquo;\u0026ndash;ani\u0026rsquo;: Enable ANI. The ANI is disabled if this option is not specified.\n\u0026lsquo;\u0026ndash;scrambleroff\u0026rsquo;: When set, the frames cannot be sniffered.\n\u0026lsquo;\u0026ndash;aifsn\u0026rsquo;: AIFS slots number. For \u0026lsquo;\u0026ndash;tx frame\u0026rsquo; mode only.\n\u0026lsquo;\u0026ndash;shortguard\u0026rsquo;: Short guard interval 400ns, the guard interval is 800ns if this option is not specified.\n\u0026lsquo;\u0026ndash;mode\u0026rsquo;: the \u0026ndash;tx\n\u0026lsquo;\u0026ndash;setlongpreamble\u0026rsquo;:\n\u0026lsquo;\u0026ndash;numpackets\u0026rsquo;: the total number of the packet.\nPlease make sure you use the correct board data from the supplier and replace it in the driver.\nMore task like the porting the driver for specific SoC interface, driver hacking, script setup tool and configuration application like wpa_supplicant\u0026hellip;etc, these will be discuss later.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-wireless-module-development-newbie/","summary":"\u003cp\u003eI\u0026rsquo;ve started collecting the information around the end of 2010 because the wireless technology advanced to much higher bandwidth for multimedia streaming.\u003cbr\u003e\nThere are two conditions of the development that I thought.\u003cbr\u003e\n1. To develop the whole wireless part by ourselves.\u003cbr\u003e\n2. To buy the module directly from the supplier.\u003cbr\u003e\nBut some important factors that make me just \u0026lsquo;collect information\u0026rsquo; at that moment.\u003cbr\u003e\nFor 1, the expense is very horrible.\u003cbr\u003e\n- We have to pay chip vendor for NRE.\u003cbr\u003e\n- We are new to be the player and we have no credit to the chip vendor.\u003cbr\u003e\n- We have no equipment and we have to invest a lot to do it.\u003cbr\u003e\n- There are lots of tasks need for the regulation.\u003cbr\u003e\nTo sum up, this is a money game for surveillance company and we see no market at that moment.\u003cbr\u003e\nFor 2, we could leverage a lot tasks to supplier but we still have to prepare equipment to verify the whole system and get the experience of the regulation. However, the module cost and performance ratio could not meet our requirement. It is quite challenge for me to persuade my boss to do it.\u003cbr\u003e\nSo what I can do is just keep attention on wireless technology.\u003cbr\u003e\nUntil now, I have the chance to do the development finally.\u003cbr\u003e\nAlthough I\u0026rsquo;m newbie for wireless, it\u0026rsquo;s not too hard to enter this area. The reason is the technology become much mature and we can make it work even we do not know much about wireless. So, let\u0026rsquo;s just do it.\u003cbr\u003e\nThe module I use is based on Atheros AR6103 and AR6003. The driver of these two chips are similar.\u003cbr\u003e\nThe documents I study is are mainly from Atheros. I also reference the IEEE specification and search on Google.\u003c/p\u003e","title":"[工作點滴] wireless module development newbie"},{"content":"I found an interesting comic that made by Gavin Aung Than. The philosophy is suitable for every creative work.\nhttp://zenpencils.com/comic/90-ira-glass-advice-for-beginners/\n","permalink":"https://chenfu.ai/en/posts/%E9%9B%9C%E4%B8%83%E9%9B%9C%E5%85%AB-growth-road/","summary":"\u003cp\u003eI found an interesting comic that made by Gavin Aung Than. The philosophy is suitable for every creative work.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://zenpencils.com/comic/90-ira-glass-advice-for-beginners/\"\u003ehttp://zenpencils.com/comic/90-ira-glass-advice-for-beginners/\u003c/a\u003e\u003c/p\u003e","title":"[Miscellaneous] Growth Road"},{"content":"There is a very hot TV program which name is \u0026ldquo;I\u0026rsquo;m a singer\u0026rdquo; in China. I never saw this program before because there are already lots of similar program in the world. At the first, I could not understand why this program catch so many eye balls. My memory was stay at the program that is made by Taiwan\u0026rsquo;s media years ago. Even it\u0026rsquo;s hot at season one, it become colder and colder till now. At least, I do not have that passion to see this kind of show again. So it cause my curiosity why it success at this moment in China. After searching the information on the internet and spent hours to see the last episode of season one last weekend, I start to know why it become so famous.\nHunan TV bought the copyright from Korea and the success story is not only just bought the copyright. The factor that make it [content continued from original\u0026hellip;]\n","permalink":"https://chenfu.ai/en/posts/%E9%9B%9C%E4%B8%83%E9%9B%9C%E5%85%AB-im-a-singer/","summary":"\u003cp\u003eThere is a very hot TV program which name is \u0026ldquo;I\u0026rsquo;m a singer\u0026rdquo; in China. I never saw this program before because there are already lots of similar program in the world. At the first, I could not understand why this program catch so many eye balls. My memory was stay at the program that is made by Taiwan\u0026rsquo;s media years ago. Even it\u0026rsquo;s hot at season one, it become colder and colder till now. At least, I do not have that passion to see this kind of show again. So it cause my curiosity why it success at this moment in China. After searching the information on the internet and spent hours to see the last episode of season one last weekend, I start to know why it become so famous.\u003c/p\u003e","title":"[Miscellaneous] I'm a Singer"},{"content":"I started to pay attention on the Bitcoin that is from a news that discussed why bitcoin become strengthening. After weeks study and observation, I thought the bitcoin could be one of the real monetary in future.\nMore links are as following.\nBitcoin official site → http://bitcoin.org/en/\nBitcoin wiki → http://en.wikipedia.org/wiki/Bitcoin\nBitcoin howto in Chinese → http://saving.cc/bitcoin/\nThe following article is quite earlier in Taiwan\u0026rsquo;s news and it is also interesting.\nhttp://techorange.com/2011/05/22/bitcoin-p2p-curenncy-dangerous/\nTwo years later today, the bitcoin\u0026rsquo;s currency rush to 1BT:90USD because of the crisis of Cyprus.\nWe can understand the nature of the monetary and the pros/cons of the bitcoin from those articles. So I need not to talk more. What I wanna do is to study and share from the source code.\nThe code is managed by git and host on github and we can get it by git client tool.\nThe link → https://github.com/bitcoin/bitcoin\nThe code structure of the bitcoin. We can get the information in the README.md. Build bitcoin on Ubuntu 12.04 # sudo apt-get install libboost-all-dev Go to https://launchpad.net/~bitcoin/+archive/bitcoin\nWe have to use the ppa to install the package we need.\n# sudo add-apt-repository ppa:bitcoin/bitcoin If the error occurs, we have to reinstall the ca-certificates package.\n# sudo apt-get install --reinstall ca-certificates If we add the repository successfully, we can see following information.\n# sudo apt-get update Then we could install the db4.8 package on Ubuntu 12.04\n# sudo apt-get install libdb4.8-dev # sudo apt-get install libdb4.8++-dev The default enable the USE_UNPN compile flag, and we have to install the upnp package.\n# sudo apt-get install libminiupnpc-dev Go to bitcoin/src folder and make the bitcoin package.\n# make -f makefile.unix The bitcoind is generated and we can start using the tool.\n# ./bitcoind --help Done!\n","permalink":"https://chenfu.ai/en/posts/%E9%9B%9C%E4%B8%83%E9%9B%9C%E5%85%AB-bitcoin-build-on-ubuntu-1204/","summary":"\u003cp\u003eI started to pay attention on the Bitcoin that is from a news that discussed why bitcoin become strengthening. After weeks study and observation, I thought the bitcoin could be one of the real monetary in future.\u003c/p\u003e\n\u003cp\u003eMore links are as following.\u003c/p\u003e\n\u003cp\u003eBitcoin official site → \u003ca href=\"http://bitcoin.org/en/\"\u003ehttp://bitcoin.org/en/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eBitcoin wiki → \u003ca href=\"http://en.wikipedia.org/wiki/Bitcoin\"\u003ehttp://en.wikipedia.org/wiki/Bitcoin\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eBitcoin howto in Chinese → \u003ca href=\"http://saving.cc/bitcoin/\"\u003ehttp://saving.cc/bitcoin/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe following article is quite earlier in Taiwan\u0026rsquo;s news and it is also interesting.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://techorange.com/2011/05/22/bitcoin-p2p-curenncy-dangerous/\"\u003ehttp://techorange.com/2011/05/22/bitcoin-p2p-curenncy-dangerous/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eTwo years later today, the bitcoin\u0026rsquo;s currency rush to 1BT:90USD because of the crisis of Cyprus.\u003c/p\u003e","title":"[Miscellaneous] Bitcoin Build on Ubuntu 12.04"},{"content":"Some recommended readings:\nhttp://wired.tw/2013/03/05/startup-road/index.html\nhttp://wired.tw/2013/03/05/marketing-age/index.html\nhttp://wired.tw/2013/02/26/internet-is-eating-the-world/index.html\n","permalink":"https://chenfu.ai/en/posts/%E6%96%87%E7%AB%A0%E8%BD%89%E8%BC%89/","summary":"\u003cp\u003eSome recommended readings:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"http://wired.tw/2013/03/05/startup-road/index.html\"\u003ehttp://wired.tw/2013/03/05/startup-road/index.html\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"http://wired.tw/2013/03/05/marketing-age/index.html\"\u003ehttp://wired.tw/2013/03/05/marketing-age/index.html\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"http://wired.tw/2013/02/26/internet-is-eating-the-world/index.html\"\u003ehttp://wired.tw/2013/02/26/internet-is-eating-the-world/index.html\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"[Reprinted Articles] Selected Readings"},{"content":"Reference\nhttp://mrjamie.cc/2013/01/31/kickstarter-angellist/ ","permalink":"https://chenfu.ai/en/posts/%E7%A7%91%E6%8A%80%E6%96%B0%E7%9F%A5-kickstarter/","summary":"\u003cp\u003eReference\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://mrjamie.cc/2013/01/31/kickstarter-angellist/\"\u003ehttp://mrjamie.cc/2013/01/31/kickstarter-angellist/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"[Tech Insights] Kickstarter"},{"content":"[This post is a placeholder — content was incomplete in the original.]\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-the-study-of-webrtc-and-sip/","summary":"\u003cp\u003e\u003cem\u003e[This post is a placeholder — content was incomplete in the original.]\u003c/em\u003e\u003c/p\u003e","title":"[Work Notes] The Study of WebRTC and SIP"},{"content":"There is a new sensor structure that introduce by Panasonic to replace color filter by color splitter. This kind of sensor remove general color filter and add the color deflector before the diode. The conventional color filter would cause 50%~70% light loss and new sensor reduce lots of the light loss. The following pictures show how it works.\nThe device can also be manufactured using current semiconductor fabrication processes. It doesn\u0026rsquo;t use special materials or processes. It\u0026rsquo;s a great news to bring this sensor to realization.\nThe comparison between the color splitter sensor and color filter sensor.\nPanasonic demo with only two-deflector method but various combinations are possible. That means, it could be adjusted by different application.\nAlthough it could provide much better sensitivity, I still have some question about it.\nWould the resolution be sacrificed? The diode of different pixel is not balanced, is there any side-effect occurred? Would it be much more complicated for the image processing processor supported? Anyway, I\u0026rsquo;m still interesting with this sensor and I\u0026rsquo;ll keep eye on it.\n","permalink":"https://chenfu.ai/en/posts/%E7%A7%91%E6%8A%80%E6%96%B0%E7%9F%A5-panasonic-color-spliter-sensor/","summary":"\u003cp\u003eThere is a new sensor structure that introduce by Panasonic to replace color filter by color splitter. This kind of sensor remove general color filter and add the color deflector before the diode. The conventional color filter would cause 50%~70% light loss and new sensor reduce lots of the light loss. The following pictures show how it works.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/img/Blogger/pana_sensor_01.png\"\u003e\u003cimg loading=\"lazy\" src=\"/img/Blogger/pana_sensor_01.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/img/Blogger/pana_sensor_02.png\"\u003e\u003cimg loading=\"lazy\" src=\"/img/Blogger/pana_sensor_02.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe device can also be manufactured using current semiconductor fabrication processes. It doesn\u0026rsquo;t use special materials or processes. It\u0026rsquo;s a great news to bring this sensor to realization.\u003c/p\u003e","title":"[Tech Insights] Panasonic Color Splitter Sensor"},{"content":"Evostream server\u0026rsquo;s configuration for rtmps test\nAdd the following content in the acceptors part in config.lua.\nThis is for Win7 configuration and remember that we have to use double \u0026lsquo;' instead of single for path.\nThe cipherSuite parameter, we could reference http://www.openssl.org/docs/apps/ciphers.html#CIPHER_SUITE_NAMES\nRTMP library\nThe library is main from rtmpdump. The webpage is http://rtmpdump.mplayerhq.hu.\nThe libssl library - SSLv23 method is used in the RTMPdump.\n- SSLv23 method\nA TLS/SSL connection established with these methods will understand the SSLv2, SSLv3, and TLSv1 protocol.\nA client will send out SSLv2 client hello messages and will indicate that it also understands SSLv3 and TLSv1.\nA server will understand SSLv2, SSLv3, and TLSv1 client hello messages.\nThis is the best choice when compatibility is a concern.\n- SSLv23 related files in the openssl/ssl/ folder\ns23_clnt.c s23_lib.c\nthe ssl23_connect() function handle the hello message between client and server.\nthe client\u0026rsquo;s related method will be created according to the server\u0026rsquo;s hello message.\nwe can look into the ssl23_get_server_hello() function for more detailed.\nwe can compare with the network packet by Wireshark. We use the TLSv1_client_method().\ns23_meth.c\ns23_pkt.c\ns23_srvr.c\nssl_locl.h -\u0026gt; the marco and function were defined in this header file. - the client hello information by Wireshark.\nthe server hello information by Wireshark. - According the Wireshark packet, let\u0026rsquo;s dig into TLSv1_client_method() function.\nthe TLSv1_client_method() define in the t1_clnt.c file. the TLS method is define in the ssl_locl.h file. - TLSv1_enc_data(), this is a SSL3_ENC_METHOD structure define in ssl_locl.h and instantiate in t1_lib.c.\n- ENGINE_setup_bsd_cryptodev(), this should be called to enable the \u0026lsquo;cryptodev\u0026rsquo; engine support.\n- ENGINE_load_builtin_engines is related to OPENSSL_NO_HW and it is define in crypto/opensslconf.h.\nHowever, this is not called to load the cryptodev by default.\n- we have to add the ENGINE_setup_bsd_cryptodev() in rtmp library.\ncryptodev-linux package http://cryptodev-linux.org/index.html\n- cryptodev, call iotcl() in cryptodev-linux/ioctl.c to access the crypto hardware engine.\nCIOCGSESSION: to do crypto_create_session()-\u0026gt;crypto_cipher_init()-\u0026gt;crypto_alloc_ablkcipher(). CIOCCRYPT: the crypto_run() is in the cryptodev-linux/main.c. crypto_run()-\u0026gt;__crypto_run_zc() or __crypto_run_std()-\u0026gt;hash_n_crypt(), this function would call directly to kernel crypto driver. cryptodev_cipher_encrypt() is in the cryptlib.c. The function ablkcipher_request_set_crypt()\nand crypto_ablkcipher_encrypt() are in kernel.\nKernel crypto driver support\n- crypto algorithm structure\n- Asynchronous block cipher algorithm structue.\n- Synchronous block cipher.\n- crypto TFM(transform) structure\n* asynchronous block cipher transform structure synchronous block cipher transform structure - The cryptodev-linux is using the asynchronous block cipher method. We can create a kernel driver.\nThere are example in the linux/drivers/crypto/ folder.\nI assume that the kernel driver we create is abc_crypto.ko. We can insmod both the abc_crypto.ko and cryptodev.ko. Then the rtmp library support the rtmps through OpenSSL with hardware crypto engine.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-rtmps-in-rtmpdump-with-hardware-engine-development/","summary":"\u003cp\u003eEvostream server\u0026rsquo;s configuration for rtmps test\u003c/p\u003e\n\u003cp\u003eAdd the following content in the acceptors part in config.lua.\u003c/p\u003e\n\u003cp\u003eThis is for Win7 configuration and remember that we have to use double \u0026lsquo;' instead of single for path.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/img/Blogger/rtmp_openssl_01.png\"\u003e\u003cimg loading=\"lazy\" src=\"/img/Blogger/rtmp_openssl_01.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe cipherSuite parameter, we could reference \u003ca href=\"http://www.openssl.org/docs/apps/ciphers.html#CIPHER_SUITE_NAMES\"\u003ehttp://www.openssl.org/docs/apps/ciphers.html#CIPHER_SUITE_NAMES\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/img/Blogger/rtmp_openssl_02.png\"\u003e\u003cimg loading=\"lazy\" src=\"/img/Blogger/rtmp_openssl_02.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eRTMP library\u003c/p\u003e\n\u003cp\u003eThe library is main from rtmpdump. The webpage is \u003ca href=\"http://rtmpdump.mplayerhq.hu/\"\u003ehttp://rtmpdump.mplayerhq.hu\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe libssl library - SSLv23 method is used in the RTMPdump.\u003c/p\u003e\n\u003cp\u003e- SSLv23 method\u003c/p\u003e\n\u003cp\u003eA TLS/SSL connection established with these methods will understand the SSLv2, SSLv3, and TLSv1 protocol.\u003c/p\u003e","title":"[工作點滴] rtmps in rtmpdump with hardware engine development"},{"content":"Quick reference for generating a Makefile using the Autotools workflow:\n# autoscan . // Scan the folder to generate configure.scan # cp configure.scan configure.ac // Copy configure.scan to configure.ac # vi configure.ac // Edit configure.ac // Add: AM_INIT_AUTOMAKE(hello,1.0) // This is the required marco for automake # aclocal // Execute aclocal to generate aclocal.m4 # autoconf // Execute autoconf to generate configure # autoheader # automake --add-missing // Run automake # touch NEWS; touch README; touch AUTHORS; touch ChangeLog // Create required documents # automake --add-missing // Run automake again # ./configure // Execute configure to generate Makefile # make // Execute make Following these steps provides a good template to modify the related files for my specific target project.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-process-to-generate-makefile-by-autotools-with-makefileam/","summary":"\u003cp\u003eQuick reference for generating a Makefile using the Autotools workflow:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# autoscan .                      // Scan the folder to generate configure.scan\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# cp configure.scan configure.ac  // Copy configure.scan to configure.ac\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# vi configure.ac                 // Edit configure.ac\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                  // Add: AM_INIT_AUTOMAKE\u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003ehello,1.0\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                  // This is the required marco \u003cspan style=\"color:#66d9ef\"\u003efor\u003c/span\u003e automake\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# aclocal                         // Execute aclocal to generate aclocal.m4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# autoconf                        // Execute autoconf to generate configure\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# autoheader\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# automake --add-missing          // Run automake\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# touch NEWS; touch README; touch AUTHORS; touch ChangeLog  // Create required documents\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# automake --add-missing          // Run automake again\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# ./configure                     // Execute configure to generate Makefile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# make                            // Execute make\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFollowing these steps provides a good template to modify the related files for my specific target project.\u003c/p\u003e","title":"[Work Notes] Generating Makefile with Autotools and Makefile.am"},{"content":"I start to move the gstreamer version from 0.10.x to 1.0.x in openwrt. Two purpose, one is to get much more familiar with the gstreamer applications and plugins development, another one is to assist my colleagues for next schedule. Just make a quick note here.\nOfficial gstreamer packages version I use is 1.0.5:\ngstreamer core → Modify Makefile and patch, compile ok. gst-plugins-base → Modify Makefile and patch, compile ok. gst-plugins-good → Modify Makefile and patch, compile ok. gst-plugins-ugly → To be check if required. gst-plugins-bad → Modify Makefile and patch, compile ok. gst-libav → To be check if required. Proprietary plugins:\npackage folder → Modify the Makefile. gst-plugin folder → Modify the configure.ac gst-plugin/src folder → Modify the Makefile.am plugin source: GST_BOILERPLATE_FULL is gone, replace by G_DEFINE_TYPE_WITH_CODE Add the parent_class definition. init function parameters have changed. Remove the deprecated functions. audio: Needs lots of work. buffer size: replace GST_BUFFER_SIZE() with gst_buffer_get_size(). buffer data: replace GST_BUFFER_DATA() by using gst_buffer_map to access the data. Audio plugins:\nGstRingBufferSpec → GstAudioRingBufferSpec The GstAudioRingBufferSpec has big changes. Lots of parameters are re-factored in GstAudioInfo. Change audio/x-raw-int to audio/x-raw for pad template. Applications:\ngst-rtsp-server:\nExecute autogen.sh and install the required tools. Add AC_PROG_CXX in configure.ac (for C++ examples). Create patch for gst-libs/gst/rtsp to use latest master version. gst_debug_add_log_function() parameters changed from 2 to 3. buffer size: replace GST_BUFFER_SIZE() with gst_buffer_get_size(). buffer data: replace GST_BUFFER_DATA() using gst_buffer_map. g_thread_create removed; use g_thread_new. gst_app_sink_set_callbacks() — callbacks structure changed. GstRTSPMediaMapping renamed to GstRTSPMountPoints. gst_rtsp_server_get_media_mapping() → gst_rtsp_server_get_mount_points() gst_rtsp_media_mapping_add_factory() → gst_rtsp_mount_points_add_factory() In configure.ac, remove WARNING_CFLAGS to prevent warnings from becoming errors. ","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-gstreamer-from-010x-to-10x-in-openwrt/","summary":"\u003cp\u003eI start to move the gstreamer version from 0.10.x to 1.0.x in openwrt. Two purpose, one is to get much more familiar with the gstreamer applications and plugins development, another one is to assist my colleagues for next schedule. Just make a quick note here.\u003c/p\u003e\n\u003cp\u003eOfficial gstreamer packages version I use is 1.0.5:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003egstreamer core → Modify Makefile and patch, compile ok.\u003c/li\u003e\n\u003cli\u003egst-plugins-base → Modify Makefile and patch, compile ok.\u003c/li\u003e\n\u003cli\u003egst-plugins-good → Modify Makefile and patch, compile ok.\u003c/li\u003e\n\u003cli\u003egst-plugins-ugly → To be check if required.\u003c/li\u003e\n\u003cli\u003egst-plugins-bad → Modify Makefile and patch, compile ok.\u003c/li\u003e\n\u003cli\u003egst-libav → To be check if required.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eProprietary plugins:\u003c/p\u003e","title":"[Work Notes] GStreamer: Migrating from 0.10.x to 1.0.x in OpenWrt"},{"content":"In previous articles, I tried to build the pjsip package, but it\u0026rsquo;s hard to verify that the package works correctly without a solid understanding of SIP. So I decided to get more familiar with how SIP works by setting up a switch. There are two popular choices: Asterisk and FreeSwitch. I chose FreeSwitch because pre-compiled binaries for Windows 7 are already available.\nhttp://wiki.freeswitch.org/wiki/Installation_Guide\nAfter installation, remember to allow the application through the firewall. Since this is just for testing, I ran FreeSwitch with the default configuration.\nWhen the switch is ready, we can choose a softphone for testing. Here are the available softphones:\nhttp://wiki.freeswitch.org/wiki/Softphones\nI chose FSClient on Windows 7.\nSet the device configuration:\nAdd a test account and register to FreeSwitch:\nThen we can use FSClient to do the test. More information in the getting started guide: http://wiki.freeswitch.org/wiki/Getting_Started_Guide\nSome common extensions for testing:\n1000, 1001, ..., 1019 — Generic SIP extensions 5000 — Demo IVR (requires sounds and music files to be installed) 9195 — Five second delay echo test 9196 — Standard echo test 9197 — Milliwatt extension 9198 — Tetris extension for demo TGML generation 9664 — Music on hold (requires music files to be installed) It\u0026rsquo;s easy — just dial it.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-sip-test-of-freeswitch-by-fsclient/","summary":"\u003cp\u003eIn previous articles, I tried to build the pjsip package, but it\u0026rsquo;s hard to verify that the package works correctly without a solid understanding of SIP. So I decided to get more familiar with how SIP works by setting up a switch. There are two popular choices: \u003cstrong\u003eAsterisk\u003c/strong\u003e and \u003cstrong\u003eFreeSwitch\u003c/strong\u003e. I chose FreeSwitch because pre-compiled binaries for Windows 7 are already available.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://wiki.freeswitch.org/wiki/Installation_Guide\"\u003ehttp://wiki.freeswitch.org/wiki/Installation_Guide\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAfter installation, remember to allow the application through the firewall. Since this is just for testing, I ran FreeSwitch with the default configuration.\u003c/p\u003e","title":"[Work Notes] SIP Test of FreeSwitch by FSClient"},{"content":"In previous posts, I documented my attempts to build the pjsip package. However, verifying its correctness was challenging due to my limited foundational knowledge of the SIP (Session Initiation Protocol) stack. To rectify this, I decided to set up a controlled environment to better understand the protocol\u0026rsquo;s mechanics.\nThe first step was setting up a SIP server (Switch) on a PC. My two primary contenders were Asterisk and FreeSWITCH. I ultimately chose FreeSWITCH because it offered precompiled binaries for Windows 7, which significantly lowered the barrier to entry for initial testing.\nDetailed installation instructions can be found in the FreeSWITCH Wiki. After installation, it is crucial to ensure the application is white-listed in your firewall. For these tests, I ran FreeSWITCH with its default configuration.\nOnce the server was operational, I needed a \u0026ldquo;Softphone\u0026rdquo; to act as a client. The FreeSWITCH Softphones Wiki provides an excellent list of compatible software. I settled on FSClient for Windows 7.\nThe setup process involved:\nConfiguring the audio device options within FSClient. Adding a test extension account and registering it with the local FreeSWITCH server. With registration successful, I could utilize the built-in testing extensions provided by FreeSWITCH:\n1000 – 1019: Generic SIP test extensions. 5000: Demo IVR (Interactive Voice Response). 9195: Five-second delay echo test. 9196: Standard real-time echo test. 9664: Music on hold. Simplicity is key here; once the server is up and the client is registered, you just dial and listen. This sandbox has been invaluable for bridging the gap between theoretical protocol specs and practical, packet-level behavior.\n","permalink":"https://chenfu.ai/en/posts/sip-test-of-freeswitch-by-fsclient/","summary":"\u003cp\u003eIn previous posts, I documented my attempts to build the \u003ccode\u003epjsip\u003c/code\u003e package. However, verifying its correctness was challenging due to my limited foundational knowledge of the SIP (Session Initiation Protocol) stack. To rectify this, I decided to set up a controlled environment to better understand the protocol\u0026rsquo;s mechanics.\u003c/p\u003e\n\u003cp\u003eThe first step was setting up a SIP server (Switch) on a PC. My two primary contenders were \u003cstrong\u003eAsterisk\u003c/strong\u003e and \u003cstrong\u003eFreeSWITCH\u003c/strong\u003e. I ultimately chose FreeSWITCH because it offered precompiled binaries for Windows 7, which significantly lowered the barrier to entry for initial testing.\u003c/p\u003e","title":"SIP Testing: FreeSWITCH with FSClient"},{"content":"Before trying to make the pjsip work on my embedded device, I build the related libraries on PC as the reference. My environment is based Ubuntu 10.04. See the following guide.\nhttp://trac.pjsip.org/repos/wiki/Getting-Started/Autoconf\nThe notes of packages building:\nALSA and OpenSSL libraries are optional and I do not install for first. SDL: download version 2.0 and do ./configure, make; make install to install. Add sudo if encountering privilege problems. FFMPEG: reference the official FFMPEG documentation at https://ffmpeg.org/trac/ffmpeg/wiki/UbuntuCompilationGuide. Follow the guide to build yasm, x264 and ffmpeg. The ffmpeg version (0.10.6) and building process follow the pjsip guide. PJSIP: follow the guide to add #define PJMEDIA_HAS_VIDEO 1 in config_site.h and run ./configure. The weird thing is that the package can still be built whether or not the definition exists. Then run make dep, make, and optionally make install. It\u0026rsquo;s not hard to build the packages but there are some uncertainties. Now let\u0026rsquo;s quickly build an application with GNU tools.\nThe guide is at http://trac.pjsip.org/repos/wiki/Getting_Started_Using.\nThere is an error when running make:\ncc -o myapp myapp.cpp `pkg-config --cflags --libs libpjproject` /tmp/cczRrbTp.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0\u0026#39; collect2: ld returned 1 exit status make: *** [myapp] Error 1 There are two ways to solve this: either rename myapp.cpp to myapp.c, or add -lstdc++ in the Makefile:\n# Makefile all: myapp myapp: myapp.cpp $(CC) -o $@ $\u0026lt; `pkg-config --cflags --libs libpjproject` -lstdc++ clean: rm -f myapp.o myapp The myapp.cpp code:\n/* pjsip application */ #include \u0026lt;pjlib.h\u0026gt; #include \u0026lt;pjlib-util.h\u0026gt; #include \u0026lt;pjmedia.h\u0026gt; #include \u0026lt;pjmedia-codec.h\u0026gt; #include \u0026lt;pjsip.h\u0026gt; #include \u0026lt;pjsip_simple.h\u0026gt; #include \u0026lt;pjsip_ua.h\u0026gt; #include \u0026lt;pjsua-lib/pjsua.h\u0026gt; int main() { printf(\u0026#34;hello pjsip\\n\u0026#34;); return 0; } Okay, that\u0026rsquo;s all and we could start our application.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-pjsip-on-ubuntu/","summary":"\u003cp\u003eBefore trying to make the pjsip work on my embedded device, I build the related libraries on PC as the reference. My environment is based Ubuntu 10.04. See the following guide.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://trac.pjsip.org/repos/wiki/Getting-Started/Autoconf\"\u003ehttp://trac.pjsip.org/repos/wiki/Getting-Started/Autoconf\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe notes of packages building:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eALSA and OpenSSL libraries are optional and I do not install for first.\u003c/li\u003e\n\u003cli\u003eSDL: download version 2.0 and do \u003ccode\u003e./configure\u003c/code\u003e, \u003ccode\u003emake; make install\u003c/code\u003e to install. Add \u003ccode\u003esudo\u003c/code\u003e if encountering privilege problems.\u003c/li\u003e\n\u003cli\u003eFFMPEG: reference the official FFMPEG documentation at \u003ca href=\"https://ffmpeg.org/trac/ffmpeg/wiki/UbuntuCompilationGuide\"\u003ehttps://ffmpeg.org/trac/ffmpeg/wiki/UbuntuCompilationGuide\u003c/a\u003e. Follow the guide to build yasm, x264 and ffmpeg. The ffmpeg version (0.10.6) and building process follow the pjsip guide.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"/img/Blogger/pjsip_ffmpeg.png\"\u003e\u003cimg loading=\"lazy\" src=\"/img/Blogger/pjsip_ffmpeg.png\"\u003e\u003c/a\u003e\u003c/p\u003e","title":"[Work Notes] PJSIP on Ubuntu"},{"content":"There is a default pjsip package in the openwrt but it links to the extension package of ltq-tapi and oss. What I need first is the package without extra packages. So I try to create the libraries using the latest version 2.1 for the experiment.\nFirst, the Makefile of the package:\ninclude $(TOPDIR)/rules.mk PKG_NAME:=pjsip2 PKG_VERSION:=2.1 PKG_RELEASE:=0 PKG_SOURCE:=pjproject-$(PKG_VERSION).tar.bz2 PKG_SOURCE_URL:=http://www.pjsip.org/release/$(PKG_VERSION)/ PKG_MD5SUM:=310eb63638dac93095f6a1fc8ee1f578 PKG_INSTALL:=1 PKG_BUILD_PARALLEL:=1 PKG_BUILD_DIR:=$(BUILD_DIR)/pjproject-$(PKG_VERSION).$(PKG_RELEASE) include $(INCLUDE_DIR)/package.mk define Package/pjsip2 SECTION:=lib CATEGORY:=Libraries URL:=http://www.pjsip.org/ MAINTAINER:=John Crispin \u0026lt;blogic@openwrt.org\u0026gt; TITLE:=pjsip2 DEPENDS:=+libuuid endef CONFIGURE_ARGS += \\ --disable-floating-point \\ --disable-g711-codec \\ --disable-l16-codec \\ --disable-g722-codec \\ --disable-g7221-codec \\ --disable-gsm-codec \\ --disable-ilbc-coder \\ --disable-libsamplerate \\ --disable-ipp \\ --disable-ssl \\ --disable-oss \\ --disable-sound define Build/Configure (cd $(PKG_BUILD_DIR); autoconf aconfigure.ac \u0026gt; aconfigure) $(call Build/Configure/Default) endef define Build/Compile CFLAGS=\u0026#34;$(TARGET_CFLAGS) $(EXTRA_CFLAGS) $(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS)\u0026#34; \\ CXXFLAGS=\u0026#34;$(TARGET_CFLAGS) $(EXTRA_CFLAGS) $(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS)\u0026#34; \\ LDFLAGS=\u0026#34;$(TARGET_LDFLAGS) -lc $(LIBGCC_S) -lm\u0026#34; \\ $(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) endef define Build/InstallDev $(INSTALL_DIR) $(1)/usr/pjsip2 $(CP) $(PKG_INSTALL_DIR)/usr $(1)/usr/pjsip2 endef $(eval $(call BuildPackage,pjsip2)) We encounter the following problem:\narm-openwrt-linux-uclibcgnueabi-ar: supported targets: elf32-littlearm elf32-bigarm elf32-little elf32-big srec symbolsrec verilog tekhex binary ihex make[5]: *** [../lib/libpj-arm-openwrt-linux-gnu.a] Error 1 We need to patch aconfigure.ac as follows:\n--- pjproject-2.1.0.orig/aconfigure.ac +++ pjproject-2.1.0/aconfigure.ac @@ -48,9 +48,8 @@ CROSS_COMPILE=`echo ${CC} | sed \u0026#39;s/gcc//\u0026#39;` fi -if test \u0026#34;$AR\u0026#34; = \u0026#34;\u0026#34;; then AR=\u0026#34;${CROSS_COMPILE}ar rv\u0026#34;; fi +AR=\u0026#34;${AR} rv\u0026#34; AC_SUBST(AR) -if test \u0026#34;$LD\u0026#34; = \u0026#34;\u0026#34;; then LD=\u0026#34;$CC\u0026#34;; fi AC_SUBST(LD) A new error then occurs:\narm-openwrt-linux-uclibcgnueabi-ld: cannot find libgcc.a Check the toolchain build_dir in OpenWrt and copy libgcc.a into staging_dir/toolchain/lib. The error is resolved and the package can then be successfully built.\nThere are additional tasks to be done if we want to integrate with private audio and video modules.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-pjsip-package-build-in-openwrt/","summary":"\u003cp\u003eThere is a default pjsip package in the openwrt but it links to the extension package of ltq-tapi and oss. What I need first is the package without extra packages. So I try to create the libraries using the latest version 2.1 for the experiment.\u003c/p\u003e\n\u003cp\u003eFirst, the Makefile of the package:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-makefile\" data-lang=\"makefile\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003einclude\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eTOPDIR\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e/rules.mk\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePKG_NAME\u003cspan style=\"color:#f92672\"\u003e:=\u003c/span\u003epjsip2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePKG_VERSION\u003cspan style=\"color:#f92672\"\u003e:=\u003c/span\u003e2.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePKG_RELEASE\u003cspan style=\"color:#f92672\"\u003e:=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePKG_SOURCE\u003cspan style=\"color:#f92672\"\u003e:=\u003c/span\u003epjproject-\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003ePKG_VERSION\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e.tar.bz2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePKG_SOURCE_URL\u003cspan style=\"color:#f92672\"\u003e:=\u003c/span\u003ehttp://www.pjsip.org/release/\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003ePKG_VERSION\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePKG_MD5SUM\u003cspan style=\"color:#f92672\"\u003e:=\u003c/span\u003e310eb63638dac93095f6a1fc8ee1f578\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePKG_INSTALL\u003cspan style=\"color:#f92672\"\u003e:=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePKG_BUILD_PARALLEL\u003cspan style=\"color:#f92672\"\u003e:=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePKG_BUILD_DIR\u003cspan style=\"color:#f92672\"\u003e:=\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eBUILD_DIR\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e/pjproject-\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003ePKG_VERSION\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e.\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003ePKG_RELEASE\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003einclude\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eINCLUDE_DIR\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e/package.mk\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003edefine\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003ePackage/pjsip2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  SECTION\u003cspan style=\"color:#f92672\"\u003e:=\u003c/span\u003elib\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  CATEGORY:\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003eLibraries\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  URL:\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003ehttp://www.pjsip.org/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  MAINTAINER:\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003eJohn Crispin \u0026lt;blogic@openwrt.org\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  TITLE:\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003epjsip2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  DEPENDS:\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e+libuuid\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003eendef\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCONFIGURE_ARGS \u003cspan style=\"color:#f92672\"\u003e+=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  --disable-floating-point \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  --disable-g711-codec \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  --disable-l16-codec \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  --disable-g722-codec \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  --disable-g7221-codec \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  --disable-gsm-codec \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  --disable-ilbc-coder \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  --disable-libsamplerate \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  --disable-ipp \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  --disable-ssl \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  --disable-oss \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  --disable-sound\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003edefine\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003eBuild/Configure\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e(cd\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003ePKG_BUILD_DIR\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e;\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003eautoconf\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003eaconfigure.ac\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003eaconfigure)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003ecall Build/Configure/Default\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003eendef\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003edefine\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003eBuild/Compile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCFLAGS\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eTARGET_CFLAGS\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e \u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eEXTRA_CFLAGS\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e \u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eTARGET_CPPFLAGS\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e \u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eEXTRA_CPPFLAGS\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCXXFLAGS\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eTARGET_CFLAGS\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e \u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eEXTRA_CFLAGS\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e \u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eTARGET_CPPFLAGS\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e \u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eEXTRA_CPPFLAGS\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLDFLAGS\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eTARGET_LDFLAGS\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e -lc \u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eLIBGCC_S\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e -lm\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eMAKE\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003ePKG_JOBS\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e-C\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003ePKG_BUILD_DIR\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003eendef\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003edefine\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003eBuild/InstallDev\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eINSTALL_DIR\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003e1\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e/usr/pjsip2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eCP\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003ePKG_INSTALL_DIR\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e/usr\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003e1\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e/usr/pjsip2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003eendef\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eeval \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003ecall BuildPackage,pjsip2\u003cspan style=\"color:#66d9ef\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe encounter the following problem:\u003c/p\u003e","title":"[Work Notes] PJSIP Package Build in OpenWrt"},{"content":"I\u0026rsquo;ve already change my tool from the notepad++ or Microsoft\u0026rsquo;s word to Evernote to make a quick note for several months. It\u0026rsquo;s quite simple to use and the data can be synchronize to cloud and I could access my notes through network everywhere anytime. There is a news that Samsung\u0026rsquo;s refrigerator built in Evernote for food management and Samsung show this device in the CES show. The story at this moment, I think Evernote make his products go into a new era. However, the morning sun never lasts a day. Evernote was hacked and the customers information were possibly stolen last week.\nThis news remind me again about the security and reliability of the cloud service. Evernote build his own cloud service server but the security problem is still happen. However, I do not worry about it because when everyone notice, it will be fixed in near future. But it makes me feel that it may not worth to invest on building own cloud service server on public place especially when we do not have enough security people to maintain it. I\u0026rsquo;ve ever attended the CSSLP class and I learned that the security question is very complicated. Maybe it is much better for us to host our cloud service on famous 3rd party provider like AWS.\n","permalink":"https://chenfu.ai/en/posts/%E7%94%A2%E6%A5%AD%E8%A7%80%E5%AF%9F-evernote-was-hacked/","summary":"\u003cp\u003eI\u0026rsquo;ve already change my tool from the notepad++ or Microsoft\u0026rsquo;s word to Evernote to make a quick note for several months. It\u0026rsquo;s quite simple to use and the data can be synchronize to cloud and I could access my notes through network everywhere anytime. There is a news that Samsung\u0026rsquo;s refrigerator built in Evernote for food management and Samsung show this device in the CES show. The story at this moment, I think Evernote make his products go into a new era. However, the morning sun never lasts a day. Evernote was hacked and the customers information were possibly stolen last week.\u003c/p\u003e","title":"[Industry Observation] Evernote Was Hacked"},{"content":"Several months ago, I switched my primary note-taking tool from Notepad++ and Microsoft Word to Evernote. Its simplicity, cloud synchronization, and universal accessibility through the network made it indispensable. There was a buzz recently about Samsung\u0026rsquo;s new refrigerator featuring an integrated Evernote app for food management, showcased at CES. At that moment, it felt like Evernote was ushering in a new era for its ecosystem. However, as the saying goes, \u0026ldquo;the morning sun never lasts a day.\u0026rdquo; Evernote was hacked last week, and customer information was potentially compromised.\nThis incident serves as a stark reminder of the security and reliability challenges inherent in cloud services. Even though Evernote maintains its own cloud infrastructure, security breaches still occur. While I\u0026rsquo;m not overly worried—as public awareness usually leads to rapid fixes—it does make me reconsider the value of self-hosting cloud services in public-facing environments, especially without a dedicated security team. My experience in CSSLP training taught me that security is incredibly nuanced and complex. Perhaps it\u0026rsquo;s far wiser to host cloud services on reputable third-party platforms like AWS, which offer mature, robust security frameworks.\n","permalink":"https://chenfu.ai/en/posts/evernote-was-hacked/","summary":"\u003cp\u003eSeveral months ago, I switched my primary note-taking tool from Notepad++ and Microsoft Word to Evernote. Its simplicity, cloud synchronization, and universal accessibility through the network made it indispensable. There was a buzz recently about Samsung\u0026rsquo;s new refrigerator featuring an integrated Evernote app for food management, showcased at CES. At that moment, it felt like Evernote was ushering in a new era for its ecosystem. However, as the saying goes, \u0026ldquo;the morning sun never lasts a day.\u0026rdquo; Evernote was hacked last week, and customer information was potentially compromised.\u003c/p\u003e","title":"Evernote Was Hacked"},{"content":"There is a company that we discuss recently because of their elegant embedded NVR device.\nI just talk about the private cloud and public cloud roles in the surveillance system in previous article.\nhttp://frankuo.blogspot.tw/2013/02/pure-public-or-hybrid-cloud-for.html\nSmartvue\u0026rsquo;s product architecture is a case of the hybrid cloud. Let\u0026rsquo;s see the whole system they define.\nWe can take S9 server as the private cloud server for local storage and playback. If we remove this part, the total system become a pure public cloud type. Although the pure cloud system is simpler, there are still some limitations at this moment. Smartvue let the high resolution video to be stored on the local server and high or low resolution video can optionally be put on the secure cloud. The reason is obvious that the network environment of LAN is still much clean and fast than WAN and all high resolution video can be saved totally without any loss.\nSomeday, we do not need this kind of device when the public network become solid on bandwidth, however, it\u0026rsquo;s not now.\n","permalink":"https://chenfu.ai/en/posts/%E7%94%A2%E6%A5%AD%E8%A7%80%E5%AF%9F-smartvue-cloud-architecture/","summary":"\u003cp\u003eThere is a company that we discuss recently because of their elegant embedded NVR device.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHFouxONm22DolSrlvGfM3fRu1xteSdwoHYOH-Bi7YU808KPkpPZ_2dpqnYzmi0hnc9NhGDEXJT9H8PKNJ8itKMIpx5m2vBnByKRC-rRUhVNK2dU4AWBv8RPe5PUaxfO40A-yTDgsj7z_j/s1600/private_cloud_server.png\"\u003e\u003cimg loading=\"lazy\" src=\"/img/Blogger/private_cloud_server.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI just talk about the private cloud and public cloud roles in the surveillance system in previous article.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://frankuo.blogspot.tw/2013/02/pure-public-or-hybrid-cloud-for.html\"\u003ehttp://frankuo.blogspot.tw/2013/02/pure-public-or-hybrid-cloud-for.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eSmartvue\u0026rsquo;s product architecture is a case of the hybrid cloud. Let\u0026rsquo;s see the whole system they define.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyZpDsqVAin2ZyOPIyDUutd0yq3ejlX92AwrRgq-02XHJl4ZNpP-XlpeqG-CsDUBXyp0ffS9a-naomBb8OZAFiM_D1vobsm_7yT7QTBkUuO0jlKReUwPOXMHQZRR0z-AaKc11bZh_5UvTC/s1600/smartvue_system_arch.png\"\u003e\u003cimg loading=\"lazy\" src=\"/img/Blogger/smartvue_system_arch.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eWe can take S9 server as the private cloud server for local storage and playback. If we remove this part, the total system become a pure public cloud type. Although the pure cloud system is simpler, there are still some limitations at this moment. Smartvue let the high resolution video to be stored on the local server and high or low resolution video can optionally be put on the secure cloud. The reason is obvious that the network environment of LAN is still much clean and fast than WAN and all high resolution video can be saved totally without any loss.\u003c/p\u003e","title":"[Industry Observation] Smartvue Cloud Architecture"},{"content":"I saw a news on TV today that about Firefox OS for mobile phone and it got my curiosity. So I go Mozilla\u0026rsquo;s web site to see what\u0026rsquo;s that about. See the link: http://www.mozilla.org/en-US/firefox/partners/#\nThe first page have the overview of the Firefox OS. The point to me is following picture. Some of telecommunication operators and device manufacturer get involved in the Firefox OS. It shows that the operators and manufacturer want to liberate the apps stores from the providers like Apple, Google.\nHere is a picture that from the Mozilla Taiwan site. It describe the difference the operation mode between original and new Open Web App operation mode.\nI think the telecommunication operators would be very interesting with it. Because when more requirements are created for consumers to access the web, the operators can earn more. Developers could have one more option to provide their apps and could dealing with customers directly. For manufacturer, I do not see what they can get except the ODM from operators but they still play an important roles here because variety of devices are required. Would Apple and Google agree this?\n","permalink":"https://chenfu.ai/en/posts/%E7%A7%91%E6%8A%80%E6%96%B0%E7%9F%A5-firefox-os---liberate-the-app-stores/","summary":"\u003cp\u003eI saw a news on TV today that about Firefox OS for mobile phone and it got my curiosity. So I go Mozilla\u0026rsquo;s web site to see what\u0026rsquo;s that about. See the link: \u003ca href=\"http://www.mozilla.org/en-US/firefox/partners/\"\u003ehttp://www.mozilla.org/en-US/firefox/partners/#\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdX9EUOzMFh_kM1KlEJOd7BckOI6WEDCMXQvimm-VsIaexHEt85nRUq-5XSe4UzEv8N8BEK7_IYB7sWFyAiuI-5t4W2XelsWOVv_Jph7sFUrf7e2eyAd__RqxcJg7uQoNVe-Bgtr2XnAsQ/s1600/ScreenClip+%5B3%5D.png\"\u003e\u003c/p\u003e\n\u003cp\u003eThe first page have the overview of the Firefox OS. The point to me is following picture. Some of telecommunication operators and device manufacturer get involved in the Firefox OS. It shows that the operators and manufacturer want to liberate the apps stores from the providers like Apple, Google.\u003c/p\u003e","title":"[Tech Insights] Firefox OS - Liberate the App Stores"},{"content":"Our company updated the homepage to a brand new look. There is the word \u0026ldquo;Liberated\u0026rdquo; used to describe the new networking technology we implemented.\nAccording to the dictionary, I\u0026rsquo;m most likely aligned with the description \u0026ldquo;free from traditional social restraints\u0026rdquo; — because we are trying to make fundamental changes in every domain we enter. It\u0026rsquo;s an interesting journey.\nAlthough it\u0026rsquo;s not 100% correct, I still want to record what I saw. I plotted the company\u0026rsquo;s product map based on personal observation from the webpage:\nIt looks quite simple and most of the items are not new concepts. If we can execute well on every point described here, we have a big chance to succeed. So we have to work harder to liberate them all.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-liberated-networking-technology/","summary":"\u003cp\u003eOur company updated the homepage to a brand new look. There is the word \u0026ldquo;Liberated\u0026rdquo; used to describe the new networking technology we implemented.\u003c/p\u003e\n\u003cp\u003eAccording to the dictionary, I\u0026rsquo;m most likely aligned with the description \u0026ldquo;free from traditional social restraints\u0026rdquo; — because we are trying to make fundamental changes in every domain we enter. It\u0026rsquo;s an interesting journey.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgqAbndB9kFBBtcnF4lTp3zRQbxMo1YJybLuYSDNq1GirN1besN8V4t4CUHdg1iq1xeOls3eqNU2CyFAv7RLB0kGkmLILv4vgEyEbG1ej_V6hHVHkCgnc_LIxdU2lyHt_QCqhGVLRc7WuB/s1600/ubnt_liberated.jpg\"\u003e\u003cimg loading=\"lazy\" src=\"/img/Blogger/ubnt_liberated.jpg\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAlthough it\u0026rsquo;s not 100% correct, I still want to record what I saw. I plotted the company\u0026rsquo;s product map based on personal observation from the webpage:\u003c/p\u003e","title":"[Work Notes] Liberated Networking Technology"},{"content":"Our company update the home page to a brand new picture. There is a name \u0026lsquo;Liberated\u0026rsquo; to describe the new networking technology we implemented.\nAccording to the dictionary, I\u0026rsquo;m most likely the description \u0026ldquo;free from traditional social restraints\u0026rdquo; because we are trying to make the fundamental change in different area that we enter. It\u0026rsquo;s an interesting journey to me.\nAlthough it\u0026rsquo;s not 100% correct, I still want to record what I saw here. I plot the company\u0026rsquo;s product map simply by personal thinking as follow from the webpage.\n","permalink":"https://chenfu.ai/en/posts/liberated-networking-technology/","summary":"\u003cp\u003eOur company update the home page to a brand new picture. There is a name \u0026lsquo;Liberated\u0026rsquo; to describe the new networking technology we implemented.\u003c/p\u003e\n\u003cp\u003eAccording to the dictionary, I\u0026rsquo;m most likely the description \u0026ldquo;free from traditional social restraints\u0026rdquo; because we are trying to make the fundamental change in different area that we enter. It\u0026rsquo;s an interesting journey to me.\u003c/p\u003e\n\u003cp\u003eAlthough it\u0026rsquo;s not 100% correct, I still want to record what I saw here. I plot the company\u0026rsquo;s product map simply by personal thinking as follow from the webpage.\u003c/p\u003e","title":"Liberated networking technology"},{"content":"There is a message post on Facebook by my former boss that talk about a guy in China who help people to order the ticket before important holidays. He is a Peking University student whose name is Ji-Yang Pei (裴濟洋), 23 years old. There is a report from China\u0026rsquo;s TV station and the link is as following.\nhttp://dailynews.sina.com/bg/chn/chnlocal/phoenixtv/20130222/01194273327.html\nIn China, people who left home for working would go home every Chinese Lunar New Year. It is the biggest human migration period in the world and it\u0026rsquo;s quite hard to get a ticket to go home. Pei provide more opportunity for those people to get a ticket especially the underprivileged ones in past three years. Later, he did not just provide the fish but also teach us how to fish. Pei post a thousand words of article on the internet to let us know how to do it. Because of this, he become a famous person, lots of people call him the Ticket King of Peking University.\nWhy does Pei can do this? He said he has the train network and timetable is his head. Besides, we have to notice the dynamic message and have mentally prepared that it is a difficulty task to go home. We can not just cut diamond by diamond because the direct route for home is also the most popular one. The target is there, we can use our brain on the route to reach it. The thinking also can be the philosophy on business. When we encounter troubles on one way, we could have different way to reach the target.\nThis event make my thinking of the situation in Taiwan. We also encounter the same situation but we do not have that strong feeling before because there is only one train route there and another choice is bus. Besides, the distance from the most northern to southern is 400~500 kilometers and we always have direct thinking in our life. Is that why we become a person as stubborn as a mule? Just kidding.\nI quite admire this young man because he observe the the society and help people with his ability. Even though he is a Peiking University student, he never think himself above business. Let\u0026rsquo;s learn from him and have a hand clap to him.\n","permalink":"https://chenfu.ai/en/posts/%E9%9B%9C%E4%B8%83%E9%9B%9C%E5%85%AB-peking-university-tickets-king---%E8%A3%B4%E6%BF%9F%E6%B4%8B/","summary":"\u003cp\u003eThere is a message post on Facebook by my former boss that talk about a guy in China who help people to order the ticket before important holidays. He is a Peking University student whose name is Ji-Yang Pei (裴濟洋), 23 years old. There is a report from China\u0026rsquo;s TV station and the link is as following.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://dailynews.sina.com/bg/chn/chnlocal/phoenixtv/20130222/01194273327.html\"\u003ehttp://dailynews.sina.com/bg/chn/chnlocal/phoenixtv/20130222/01194273327.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eIn China, people who left home for working would go home every Chinese Lunar New Year. It is the biggest human migration period in the world and it\u0026rsquo;s quite hard to get a ticket to go home. Pei provide more opportunity for those people to get a ticket especially the underprivileged ones in past three years. Later, he did not just provide the fish but also teach us how to fish. Pei post a thousand words of article on the internet to let us know how to do it. Because of this, he become a famous person, lots of people call him the Ticket King of Peking University.\u003c/p\u003e","title":"[Miscellaneous] Peking University Tickets King — Ji-Yang Pei"},{"content":"3D image and video has been booming in recent years due to the entertainment industry — movies and gaming. Many kinds of 3D devices have appeared, including 3D cameras and 3D TVs. The early approach to capturing 3D images was simply to strap two cameras together and post-process the two photos into one.\nGoPro had a similar structure for their Hero camera — you\u0026rsquo;d buy two cameras with some accessories to create it.\nSome devices have embedded two lenses and sensors natively for 3D capture, like Sony\u0026rsquo;s camcorders.\nI saw a news article on Tech-on today: Panasonic developed a 2.1-Mpixel CMOS image sensor capable of capturing 3D video with a single lens, announced at ISSCC 2013.\nhttp://big5.nikkeibp.com.cn/news/semi/64837-20130222.html\nFor capturing 3D video, it is necessary to separate light entering the left eye from light entering the right eye, and direct each to different pixels of the CMOS sensor. Panasonic employs a structure combining a lenticular lens and mirror elements (digital micro lenses: DMLs), formed by patterns whose size is smaller than light wavelength using lithography technology.\nThe lights separated by the lenticular lens are focused by the DMLs to increase intensity. They then enter the corresponding pixels of the CMOS sensor. Because the left-eye and right-eye lights don\u0026rsquo;t interfere with each other much, signal intensity is high enough. The received signals are then processed via line memory to create 3D video.\nPanasonic is planning to apply this CMOS sensor to industrial and mobile devices, with products expected to debut in 2014.\nThis could enable much lower-cost 3D camera systems using just a single lens — though there are still open questions about sensitivity, resolution, optical format requirements, backend processor support, and of course the sensor price. I\u0026rsquo;m very excited about this sensor because it could dramatically simplify 3D device design — with many interesting applications especially in imaging systems.\n","permalink":"https://chenfu.ai/en/posts/%E7%A7%91%E6%8A%80%E6%96%B0%E7%9F%A5-panasonics-3d-cmos-image-sensor/","summary":"\u003cp\u003e3D image and video has been booming in recent years due to the entertainment industry — movies and gaming. Many kinds of 3D devices have appeared, including 3D cameras and 3D TVs. The early approach to capturing 3D images was simply to strap two cameras together and post-process the two photos into one.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/img/Blogger/dslr_3d_handmade.jpg\"\u003e\u003cimg loading=\"lazy\" src=\"/img/Blogger/dslr_3d_handmade.jpg\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eGoPro had a similar structure for their Hero camera — you\u0026rsquo;d buy two cameras with some accessories to create it.\u003c/p\u003e","title":"[Tech Insights] Panasonic's 3D CMOS Image Sensor"},{"content":"After the RabbitMQ server and client are set up, I started learning more about the RabbitMQ system. The core of RabbitMQ is based on the AMQP protocol. There\u0026rsquo;s lots of information on Wikipedia:\nhttp://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol\nAMQP originated in the banking industry — which is why terminology like \u0026ldquo;broker\u0026rdquo; is used in the AMQP specification. Here is the model of AMQP.\nIf we want to make an application with two-way communication, we have to make the application act as both publisher and consumer.\nThere are definitions in the specifications we can reference directly.\nHere is the packet sequence diagram captured by Wireshark.\nThe application plays two roles of clients in different threads.\nWe can define a private header and body in the content body for custom functions.\nThere is an important terminology called Routing Key — it\u0026rsquo;s like the \u0026ldquo;To:\u0026rdquo;, \u0026ldquo;Cc:\u0026rdquo;, and \u0026ldquo;Bcc:\u0026rdquo; in email. We have to synchronize the routing key name to ensure the message gets sent to the correct device. The definition in the spec:\nThe first step of the application is basically done. Next we will implement more functions on top of it.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-rabbitmq---amqp-protocol-note/","summary":"\u003cp\u003eAfter the RabbitMQ server and client are set up, I started learning more about the RabbitMQ system. The core of RabbitMQ is based on the AMQP protocol. There\u0026rsquo;s lots of information on Wikipedia:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol\"\u003ehttp://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAMQP originated in the banking industry — which is why terminology like \u0026ldquo;broker\u0026rdquo; is used in the AMQP specification. Here is the model of AMQP.\u003c/p\u003e\n\u003cp\u003eIf we want to make an application with two-way communication, we have to make the application act as both publisher and consumer.\u003c/p\u003e","title":"[Work Notes] RabbitMQ — AMQP Protocol Notes"},{"content":"3D imagery and video have seen massive growth in recent years, driven largely by the movie and gaming industries. This has spurred a wave of 3D-capable devices like cameras and TVs. In the early stages, capturing 3D content typically required bulky \u0026ldquo;two-camera\u0026rdquo; setups where two separate lenses and sensors were bonded together, with the resulting photos processed into a single 3D file.\nCompanies like GoPro followed this modular path, requiring users to buy two cameras and a dedicated housing to achieve 3D effects. Some higher-end devices, like Sony’s 3D camcorders, began embedding two lenses and sensors into a single integrated chassis.\nHowever, I saw an exciting announcement from Panasonic at ISSCC 2013 regarding a new 2.1-megapixel CMOS image sensor capable of capturing 3D video through a single lens.\nTo achieve this, Panasonic engineered a sophisticated structure combining a lenticular lens with digital micro lenses (DMLs). These micro-mirrors are patterned at scales smaller than the wavelength of light using advanced lithography. This architecture effectively separates incoming light into left-eye and right-eye components, ensuring they hit distinct pixels on the CMOS sensor without significant interference. The signals are then processed via line memory to render a cohesive 3D video stream.\nPanasonic plans to roll this sensor out to industrial and mobile devices, with commercial products expected by 2014. This innovation could drastically lower the cost of 3D systems by eliminating the need for dual-lens/dual-sensor arrays. I am particularly excited about this because it simplifies system design significantly while maintaining high optical performance. This kind of hardware-level innovation allows us to push 3D applications into much smaller, more affordable form factors.\n","permalink":"https://chenfu.ai/en/posts/panasonics-3d-cmos-image-sensor/","summary":"\u003cp\u003e3D imagery and video have seen massive growth in recent years, driven largely by the movie and gaming industries. This has spurred a wave of 3D-capable devices like cameras and TVs. In the early stages, capturing 3D content typically required bulky \u0026ldquo;two-camera\u0026rdquo; setups where two separate lenses and sensors were bonded together, with the resulting photos processed into a single 3D file.\u003c/p\u003e\n\u003cp\u003eCompanies like GoPro followed this modular path, requiring users to buy two cameras and a dedicated housing to achieve 3D effects. Some higher-end devices, like Sony’s 3D camcorders, began embedding two lenses and sensors into a single integrated chassis.\u003c/p\u003e","title":"Panasonic's 3D CMOS Image Sensor"},{"content":"After the RabbitMQ server and client are setup, I start to learn more about the RabbitMQ system. The core of RabbitMQ is based AMQP protocol. There are lots of information we can get on wiki: http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol\nThe AMQP is basically start from bank industry and that\u0026rsquo;s why some related terminology like broker are used in AMQP specification. Here is model of the AMQP. If we want to make the application to be two way communication, we have to make the application with publisher and consumer characteristics.\nThere are definitions in the specifications and we can check directly on it. Here is the packet sequence diagram that collect by the Wireshark.\n","permalink":"https://chenfu.ai/en/posts/rabbitmq-amqp-protocol-note/","summary":"\u003cp\u003eAfter the RabbitMQ server and client are setup, I start to learn more about the RabbitMQ system. The core of RabbitMQ is based AMQP protocol. There are lots of information we can get on wiki: \u003ca href=\"http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol\"\u003ehttp://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe AMQP is basically start from bank industry and that\u0026rsquo;s why some related terminology like broker are used in AMQP specification. Here is model of the AMQP. If we want to make the application to be two way communication, we have to make the application with publisher and consumer characteristics.\u003c/p\u003e","title":"RabbitMQ - amqp protocol note"},{"content":"I saw a news recently that talk about the national policy on electronics 2012 of India. Kapil Sibal, the Minister for Communications and Information Technology says the government approve the policy and plan to invest 100 billion for electronics industry fostering before 2020. It\u0026rsquo;s natural trend for India to extend from their famous software industrial to hardware.\nKapil visit Japan\u0026rsquo;s recently and says it\u0026rsquo;s very important to have strategy cooperation with Japan electronics company. The most important one is to build first semiconductor factory. The plan will kick-off before October 2013 and start to production around 2015~2016. Then based on the plenty of software engineer, Japan company can have much progress in India on embedded system.\nAccording the news, I think India have the right strategy to do this. Japan\u0026rsquo;s electronics industry gradually lose their competitive since years ago because their thinking do not keep up with the trend. India have a lots of advantages to help Japan\u0026rsquo;s company reverse this situation including the software industry, low cost man power, big market\u0026hellip;etc. Besides the economic view point, the political strategy in Asia, it is inevitable for Japan to keep more relations with China\u0026rsquo;s neighbor union.\nLet\u0026rsquo;s keep observing how the things going.\n","permalink":"https://chenfu.ai/en/posts/%E7%94%A2%E6%A5%AD%E8%A7%80%E5%AF%9F-india-electronic-policy/","summary":"\u003cp\u003eI saw a news recently that talk about the national policy on electronics 2012 of India. Kapil Sibal, the Minister for Communications and Information Technology says the government approve the policy and plan to invest 100 billion for electronics industry fostering before 2020. It\u0026rsquo;s natural trend for India to extend from their famous software industrial to hardware.\u003c/p\u003e\n\u003cp\u003eKapil visit Japan\u0026rsquo;s recently and says it\u0026rsquo;s very important to have strategy cooperation with Japan electronics company. The most important one is to build first semiconductor factory. The plan will kick-off before October 2013 and start to production around 2015~2016. Then based on the plenty of software engineer, Japan company can have much progress in India on embedded system.\u003c/p\u003e","title":"[Industry Observation] India Electronic Policy"},{"content":"After I wrote the Vuzix Smart glasses for just hours, Google launched their glass and built a new web site for this product. Maybe google do not want to be left behind when Vuzix award from CES. http://www.google.com/glass/start/\nThe page is simple and clear. We could see a video in the link to sense how it feels. All the functions that describe in what it does are totally from audio, video and gesture recognition. We can take the photo, record the video, translation, search the information, navigation\u0026hellip;etc in real-time. All of the recognition technology have to link with the requirements of people and that\u0026rsquo;s why google raise a competition for people to write down \u0026ldquo;what would you do if you had Glass\u0026rdquo;. Once the idea is adopted, we could become the Glass Explorer and buy Glass with USD $1500.\nHowever, this activity is for 18+ years old and live in the US. Anyway, I could not wait to see what\u0026rsquo;s happen next.\n","permalink":"https://chenfu.ai/en/posts/%E7%A7%91%E6%8A%80%E6%96%B0%E7%9F%A5-google-glass-launch/","summary":"\u003cp\u003eAfter I wrote the \u003ca href=\"http://frankuo.blogspot.tw/2013/02/vuzix-smart-glasses-m100.html\"\u003eVuzix Smart glasses\u003c/a\u003e for just hours, Google launched their glass and built a new web site for this product. Maybe google do not want to be left behind when Vuzix award from CES.\n\u003ca href=\"http://www.google.com/glass/start/\"\u003ehttp://www.google.com/glass/start/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/img/Blogger/glass_page.png\"\u003e\u003cimg loading=\"lazy\" src=\"/img/Blogger/glass_page.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe page is simple and clear. We could see a video in the link to sense how it feels. All the functions that describe in what it does are totally from audio, video and gesture recognition. We can take the photo, record the video, translation, search the information, navigation\u0026hellip;etc in real-time.\nAll of the recognition technology have to link with the requirements of people and that\u0026rsquo;s why google raise a competition for people to write down \u0026ldquo;what would you do if you had Glass\u0026rdquo;. Once the idea is adopted, we could become the Glass Explorer and buy Glass with USD $1500.\u003c/p\u003e","title":"[Tech Insights] Google Glass Launch"},{"content":"I like to play basketball since I was a high school student and I still play around one to twice a week now. Although I love this sport, I do not have too much passion to see the games like NBA after MJ retired. In past year, I started to pay attention on it. One reason is Jeremy Lin and the other is the CEO of my company bought Memphis Grizzlies last year. I start to realize this is not just only a game but also contain a lot of things in it.\nThere are two trades that I noticed in recently. One is no doubt Grizzlies because it\u0026rsquo;s much more related to my life. But I\u0026rsquo;m more interesting on Houston Rocket\u0026rsquo;s trade. There is an article that wrote by blog in Taiwan and I learn a lot from this article.\nhttp://www.isay.tw/?p=2443\nThis guy \u0026lsquo;isay\u0026rsquo; observe the unusual dispatch of the McHale before the all star game. He analysis the position, salary\u0026hellip;etc of all players and provide a list of 5 players on 2/17. The news disclosed early today, 4 players in the list are traded. I\u0026rsquo;m amazing that he have the high accurate prediction. Maybe this author have the business sense too. After this, I may have a different view to see the sports not only NBA but also MLB\u0026hellip;etc.\n","permalink":"https://chenfu.ai/en/posts/%E4%BC%91%E9%96%92%E9%81%8B%E5%8B%95-the-trade-of-houston-rockets/","summary":"\u003cp\u003eI like to play basketball since I was a high school student and I still play around one to twice a week now. Although I love this sport, I do not have too much passion to see the games like NBA after MJ retired. In past year, I started to pay attention on it. One reason is Jeremy Lin and the other is the CEO of my company bought Memphis Grizzlies last year. I start to realize this is not just only a game but also contain a lot of things in it.\u003c/p\u003e","title":"[Leisure \u0026 Sports] The Trade of Houston Rockets"},{"content":"I saw a news that about the Vuzix Smart Glasses M100 and it get a recipient of the CES (Consumer Electronics Show) Innovations 2013 Design and Engineering Award BEST OF INNOVATIONS, and selected as Best Technology in the Wireless Handset Accessory category. More information in following link. http://www.vuzix.com/consumer/products_browse.html#video-eyewear\nIt\u0026rsquo;s an interesting device but there are still challenges behind. Since Google launch their project glass, Vuzix is the 2nd company to make the similar product. So M100 get a lot of discussion even google guys go their booth to have it a look. According to the hardware specification from Vuzix web sites. It\u0026rsquo;s totally an android based smart phone and the difference is the glasses appearance only. It\u0026rsquo;s not special by just hardware specification only.\nI think the story of this product is based on the intelligence functions like the video recognition, gesture recognition, voice recognition\u0026hellip;etc. When these functions are introduced, this device become very interesting. Vuzix also provide the SDK for developers and it may follow the smart phone pace to have variety of apps on the market. So, let\u0026rsquo;s look forward to it.\n","permalink":"https://chenfu.ai/en/posts/%E7%A7%91%E6%8A%80%E6%96%B0%E7%9F%A5-vuzix-smart-glasses-m100/","summary":"\u003cp\u003eI saw a news that about the Vuzix Smart Glasses M100 and it get a recipient of the CES (Consumer Electronics Show) Innovations 2013 Design and Engineering Award BEST OF INNOVATIONS, and selected as Best Technology in the Wireless Handset Accessory category. More information in following link.\n\u003ca href=\"http://www.vuzix.com/consumer/products_browse.html#video-eyewear\"\u003ehttp://www.vuzix.com/consumer/products_browse.html#video-eyewear\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s an interesting device but there are still challenges behind. Since Google launch their project glass, Vuzix is the 2nd company to make the similar product. So M100 get a lot of discussion even google guys go their booth to have it a look. According to the hardware specification from Vuzix web sites. It\u0026rsquo;s totally an android based smart phone and the difference is the glasses appearance only. It\u0026rsquo;s not special by just hardware specification only.\u003c/p\u003e","title":"[Tech Insights] Vuzix Smart Glasses M100"},{"content":"Just before the Chinese Lunar New Year, I received the latest alpha version of AirVision 2.0. It doesn\u0026rsquo;t just inherit the strengths of the previous version; it feels significantly faster and more stable. Here is a quick preview of the installation process and some of the main UI pages.\nInstallation Process After launching the Windows installer and following the setup steps, you\u0026rsquo;ll see a Windows Security alert. Make sure your firewall isn\u0026rsquo;t blocking the application.\nThe AirVision controller runs in the system tray. Click \u0026ldquo;Launch a Browser\u0026rdquo; to start the web interface for further configuration.\nFirst-Time Configuration Host Setup: Enter the host PC name, select your language, and set your location. Account Creation: Create an administrator account to access AirVision. Controller Setup: Add a controller if needed, or simply skip to the next step. Main Interface \u0026amp; Camera Management Once logged in, you can see the dashboard. Managing cameras is straightforward: click on the \u0026ldquo;unmanaged\u0026rdquo; part of the camera section to see a list of available devices.\nThe Map view allows for intuitive placement of cameras. You can drag and drop cameras onto the map, and just like in previous versions, the color changes when motion is detected.\nFeatures \u0026amp; Statistics The new interface offers detailed Analytics, Statistics, and a robust Recording management page. The toggle bar at the bottom provides a wealth of system information at a glance.\nAfter a quick run-through, AirVision 2.0 has really exceeded my expectations. I\u0026rsquo;m looking forward to its official launch.\nFor context, here is a video demo of the previous version for comparison: YouTube Demo Link\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-airvision-20-preview-on-win7/","summary":"\u003cp\u003eJust before the Chinese Lunar New Year, I received the latest alpha version of \u003cstrong\u003eAirVision 2.0\u003c/strong\u003e. It doesn\u0026rsquo;t just inherit the strengths of the previous version; it feels significantly faster and more stable. Here is a quick preview of the installation process and some of the main UI pages.\u003c/p\u003e\n\u003ch3 id=\"installation-process\"\u003eInstallation Process\u003c/h3\u003e\n\u003cp\u003eAfter launching the Windows installer and following the setup steps, you\u0026rsquo;ll see a Windows Security alert. Make sure your firewall isn\u0026rsquo;t blocking the application.\u003c/p\u003e","title":"[R\u0026D Notes] AirVision 2.0 Preview on Windows 7"},{"content":"Weeks ago, the supplier demo the Miracast function to us and my colleague told me maybe we can think if there are applications for surveillance system. At first I saw nothing special for surveillance application but I may find there is now.\nHere is a capture picture from the whitepaper of WiFi alliance.\nBasically, Miracast is a protocol and this means Miracast can be over any kind of infrastructure. However, Miracast connections are expected to be predominantly established between Wi-Fi devices connected with each other directly, without an AP acting as an intermediary. According to the topology, what we can see is a source to a sink and it is a peer-to-peer connection.\nGo back to the topic we want to talk for surveillance. I plot a picture as follow, and this is just like a traditional surveillance system with cameras, recorder and monitor.\nNow the connection part become the Miracast wifi direct to the adapter like NVR and play the video through HDMI to monitor finally. In future, the smart TV integrate the adapter and monitor part and link to cloud service as the picture.\nIf our target system is small with 4~8ch or under, this structure is quite simple and real for home, small store\u0026hellip;etc. It\u0026rsquo;s interesting and I\u0026rsquo;m looking forward to see it happen in near future.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-miracast-in-surveillance-system/","summary":"\u003cp\u003eWeeks ago, the supplier demo the Miracast function to us and my colleague told me maybe we can think if there are applications for surveillance system. At first I saw nothing special for surveillance application but I may find there is now.\u003c/p\u003e\n\u003cp\u003eHere is a capture picture from the whitepaper of WiFi alliance.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEfz7cBaDm4VNf4yYqIMxq55stocSsmD75bUL5eF8MfXjE35i9620eRKzmbPEWgmwhyphenhyphenI7mL9lEsDBk52uNUiB6wRG1UNN_aFCP47HlqvGjlnxgD7g-tosxYyC1nfIHbFybJFyV3Gw3Si6v/s1600/miracast_topology.jpg\"\u003e\u003cimg loading=\"lazy\" src=\"/img/Blogger/miracast_topology.jpg\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eBasically, Miracast is a protocol and this means Miracast can be over any kind of infrastructure. However, Miracast connections are expected to be predominantly established between Wi-Fi devices connected with each other directly, without an AP acting as an intermediary. According to the topology, what we can see is a source to a sink and it is a peer-to-peer connection.\u003c/p\u003e","title":"[Work Notes] Miracast in Surveillance System"},{"content":"The pure public cloud is no doubt building web services on a public infrastructure, while hybrid combines a private component. According to Wikipedia, the public cloud (aka external cloud) refers to services provided by a third party. A picture on Wikipedia describes this clearly.\nBasically, there are four deployment models on Wikipedia. A private cloud can\u0026rsquo;t fully satisfy the requirements of a surveillance system. We also won\u0026rsquo;t discuss community cloud since it\u0026rsquo;s not realistic for surveillance.\nThere is a famous network camera company called Dropcam that deploys as a pure public cloud system. When you install the devices, you create an account and register them. As I understand, Dropcam uses Amazon Web Services as infrastructure. I\u0026rsquo;ve plotted some simple block diagrams to describe it.\nThe Dropcam way is the lower-left block — all services are provided by Dropcam hosted on AWS. Dropcam becomes not just a device maker but also a service provider. This is the simplest and most elegant total system.\nThe other three block diagrams are increasingly complex. Some surveillance companies still want to expand on the traditional model, which can become the most complicated scenario in the upper section. They\u0026rsquo;ll get into trouble soon.\nThere is still a question: not everyone wants to feed private content to a service provider. That\u0026rsquo;s why the original surveillance model still holds most of the market share — but I think this situation will change in the coming years.\nAfter studying this, I\u0026rsquo;d like to shorten the deployment models to just two kinds. One is the Dropcam approach (as described above). The other addresses the weak points that pure public cloud can\u0026rsquo;t overcome at this moment.\nSo which one is better — left or right? Let\u0026rsquo;s wait and see what happens next.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-pure-public-or-hybrid-cloud-for-surveillance-system/","summary":"\u003cp\u003eThe pure public cloud is no doubt building web services on a public infrastructure, while hybrid combines a private component. According to Wikipedia, the public cloud (aka external cloud) refers to services provided by a third party. A picture on Wikipedia describes this clearly.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1aWVqnt5oleV8PILxAwBuN9j36ezoA3f29PcPtdWLV-YnyTiQgDle2slLhsMOYjYBN78oHB1MNb_bHvo1BExEPatkMYG-Wbn0LIeWQ99CVNHFJNBbjCNYmzzDKgtbl5eGsNgzBU1k5Zw/s1600/Cloud_computing_types.svg.png\"\u003e\u003cimg loading=\"lazy\" src=\"/img/Blogger/Cloud_computing_types.svg.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eBasically, there are four deployment models on Wikipedia. A private cloud can\u0026rsquo;t fully satisfy the requirements of a surveillance system. We also won\u0026rsquo;t discuss community cloud since it\u0026rsquo;s not realistic for surveillance.\u003c/p\u003e","title":"[Work Notes] Pure Public or Hybrid Cloud for Surveillance System?"},{"content":"The pure public cloud is no doubt that we build the web services on public and the hybrid combine the private part. According to the information on wiki, the public cloud aka external cloud is related to the service is provided by third party. There is a picture on wiki can describe exactly what we talk about.\nBasically, there are four deployment models on wiki. The private cloud can\u0026rsquo;t satisfy the requirements of the surveillance system. We do not talk about the community cloud also because it\u0026rsquo;s not real on surveillance system.\nThere is a famous network camera company named Dropcam that deployment as pure public cloud system. When we install the devices, we have to create an account and register them. As I know, Dropcam use the Amazon Web Service as the infrastructure. I just plot some simple block diagrams to describe it.\nThe way of Dropcam is the left bottom and all services are provided by Dropcam that host on AWS. The role of Dropcam become not only the device maker anymore but also service provider. The total system is the most easiest and simplest by this way.\nThe other three block diagrams are more and more complicated. Some surveillance company still want to expand their system base on the traditional type and the whole system may become the most complicated upper one. They will get into trouble soon.\nThere is still a question that not all people like to feed their private contents to service provider. That\u0026rsquo;s why the original surveillance still there and get most market share but I think this situation will become different in recent years.\nAfter studying, I\u0026rsquo;d like to shorten the deployment into two kinds. One is the Dropcam\u0026rsquo;s way and the reason has already described above. Another one is because some weak points that the pure public can\u0026rsquo;t overcome at this moment.\nSo which one is better, left or right? Let\u0026rsquo;s wait and see what will happen next.\n","permalink":"https://chenfu.ai/en/posts/pure-public-or-hybrid-cloud-for-surveillance/","summary":"\u003cp\u003eThe pure public cloud is no doubt that we build the web services on public and the hybrid combine the private part. According to the information on wiki, the public cloud aka external cloud is related to the service is provided by third party. There is a picture on wiki can describe exactly what we talk about.\u003c/p\u003e\n\u003cp\u003eBasically, there are four deployment models on wiki. The private cloud can\u0026rsquo;t satisfy the requirements of the surveillance system. We do not talk about the community cloud also because it\u0026rsquo;s not real on surveillance system.\u003c/p\u003e","title":"Pure public or hybrid cloud for surveillance system?"},{"content":"Today is the end of the Dragon year and we use to have a good supper on this day. It\u0026rsquo;s brand new lunar year tomorrow and we call it Snake year. Sometimes, we\u0026rsquo;d call it Small Dragon year rather than Snake year because Dragon is much more significant in traditional.\nHope my family and friends have a brand new good Small Dragon Year.\n","permalink":"https://chenfu.ai/en/posts/%E5%BF%83%E6%83%85%E9%9A%A8%E7%AD%86-happy-lunar-new-year/","summary":"\u003cp\u003eToday is the end of the Dragon year and we use to have a good supper on this day. It\u0026rsquo;s brand new lunar year tomorrow and we call it Snake year. Sometimes, we\u0026rsquo;d call it Small Dragon year rather than Snake year because Dragon is much more significant in traditional.\u003c/p\u003e\n\u003cp\u003eHope my family and friends have a brand new good Small Dragon Year.\u003c/p\u003e","title":"[Personal Reflections] Happy Lunar New Year"},{"content":"My colleague did some experiments on GStreamer alsasrc and osssrc plugins and found that alsasrc consumes a lot of CPU resource (around 16% on the chip we use). He asked me why the test tool provided by the chip vendor is quite efficient (around 1~2%). It was a big gap and I started to investigate why.\nAfter hours of checking, I found that the plugin may cause a busy wait in a while loop when the parameters are set to non-blocking mode. I made a simple code modification and the CPU rate dropped to 12%. Still frustrating, but some improvement.\nSo I started trying different parameter combinations based on three differences he noted between the alsasrc plugin and the test code:\nalsasrc is in non-block mode — the test code is in block mode. alsasrc channels = 1 — the test code sets channels = 2. Buffer size is limited in the test code but not in alsasrc. For issue 1: I thought non-blocking mode should be more efficient, but the busy wait needs to change.\nFor issue 2: This is really weird — when I set channels to 2 in the alsasrc plugin, the CPU rate drops significantly. This makes me wonder if it\u0026rsquo;s a characteristic of the I2S bus. I searched the internet but couldn\u0026rsquo;t find any information confirming that channels must be set to 2 for the alsasrc GStreamer plugin when the audio data bus is I2S. I\u0026rsquo;ll confirm this later.\nFor issue 3: I think limiting the buffer size is reasonable.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-i2s-bus-channels-setting-in-gstreamer-alsasrc-plugin/","summary":"\u003cp\u003eMy colleague did some experiments on GStreamer alsasrc and osssrc plugins and found that alsasrc consumes a lot of CPU resource (around 16% on the chip we use). He asked me why the test tool provided by the chip vendor is quite efficient (around 1~2%). It was a big gap and I started to investigate why.\u003c/p\u003e\n\u003cp\u003eAfter hours of checking, I found that the plugin may cause a busy wait in a while loop when the parameters are set to non-blocking mode. I made a simple code modification and the CPU rate dropped to 12%. Still frustrating, but some improvement.\u003c/p\u003e","title":"[Work Notes] I2S Bus Channels Setting in GStreamer alsasrc Plugin"},{"content":"A colleague recently observed a significant discrepancy in CPU usage while testing the GStreamer alsasrc and osssrc plugins. On our hardware platforms, alsasrc was consuming about 16% of CPU resources, whereas the vendor-provided test tools achieved the same task with only 1~2% overhead. This massive gap in efficiency piqued my curiosity, and I decided to investigate the root cause.\nAfter several hours of deep diving into the code, I discovered that when the plugin is set to \u0026ldquo;non-blocking mode,\u0026rdquo; it can trigger a busy-wait condition within a while loop, needlessly spiking CPU cycles. After a quick patch to optimize this behavior, I managed to bring the CPU usage down to 12%. While an improvement, it still felt far from the vendor tool\u0026rsquo;s efficiency.\nWe then compared the alsasrc configuration against the vendor test tool and found three key differences:\nalsasrc was in non-blocking mode; the test tool used blocking mode. alsasrc was configured for 1 channel (Mono); the test tool used 2 channels (Stereo). The test tool explicitly limited the buffer size; alsasrc did not. My initial thought was that non-blocking mode should inherently be more efficient for an event-driven system, provided the busy-wait is handled correctly. However, the second point was the most intriguing: when I switched alsasrc to 2 channels, the CPU usage dropped drastically. This led me to suspect a hardware-specific trait of the I2S bus. Curiously, I couldn\u0026rsquo;t find any documentation online stating that \u0026ldquo;audio buses utilizing I2S must be configured for 2 channels in GStreamer\u0026rsquo;s alsasrc.\u0026rdquo; I intend to confirm this hardware dependency in further tests. Lastly, limiting the buffer size is a standard optimization that definitely warrants implementation in our production pipeline.\n","permalink":"https://chenfu.ai/en/posts/i2s-bus-channels-setting-in-gstreamer/","summary":"\u003cp\u003eA colleague recently observed a significant discrepancy in CPU usage while testing the GStreamer \u003ccode\u003ealsasrc\u003c/code\u003e and \u003ccode\u003eosssrc\u003c/code\u003e plugins. On our hardware platforms, \u003ccode\u003ealsasrc\u003c/code\u003e was consuming about 16% of CPU resources, whereas the vendor-provided test tools achieved the same task with only 1~2% overhead. This massive gap in efficiency piqued my curiosity, and I decided to investigate the root cause.\u003c/p\u003e\n\u003cp\u003eAfter several hours of deep diving into the code, I discovered that when the plugin is set to \u0026ldquo;non-blocking mode,\u0026rdquo; it can trigger a busy-wait condition within a \u003ccode\u003ewhile\u003c/code\u003e loop, needlessly spiking CPU cycles. After a quick patch to optimize this behavior, I managed to bring the CPU usage down to 12%. While an improvement, it still felt far from the vendor tool\u0026rsquo;s efficiency.\u003c/p\u003e","title":"I2S Bus Channel Configuration in GStreamer alsasrc"},{"content":"RabbitMQ Setup and Test Server side:\nMy desktop PC is Windows 7. Download the RabbitMQ server from http://www.rabbitmq.com/.\nInstallation guide: http://www.rabbitmq.com/install-windows.html\nI use an extra Ethernet card with IP address set to 192.168.1.19, and make sure the firewall doesn\u0026rsquo;t block port 5672.\nClient side: (both send and listen on the same device)\nI use the package from https://github.com/alanxz/rabbitmq-c. Follow the guide in the link to cross-build and install on the embedded device.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-rabbitmq-setup-and-test/","summary":"\u003ch2 id=\"rabbitmq-setup-and-test\"\u003eRabbitMQ Setup and Test\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eServer side:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMy desktop PC is Windows 7. Download the RabbitMQ server from \u003ca href=\"http://www.rabbitmq.com/\"\u003ehttp://www.rabbitmq.com/\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eInstallation guide: \u003ca href=\"http://www.rabbitmq.com/install-windows.html\"\u003ehttp://www.rabbitmq.com/install-windows.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI use an extra Ethernet card with IP address set to 192.168.1.19, and make sure the firewall doesn\u0026rsquo;t block port 5672.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eClient side:\u003c/strong\u003e (both send and listen on the same device)\u003c/p\u003e\n\u003cp\u003eI use the package from \u003ca href=\"https://github.com/alanxz/rabbitmq-c\"\u003ehttps://github.com/alanxz/rabbitmq-c\u003c/a\u003e. Follow the guide in the link to cross-build and install on the embedded device.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHTw8Ub1MaZFtfYCkmY460xeqSKhTvYunsgfS2CtZEl1rWttRuFNl2K9D-blyTHtWVtGodjmvku3vEZEm6eKQjYJyX8lKlhgMatFhgCngrOLP6reLFAi4UoB0h4msJMBDABF4VrspeXZY2/s1600/Image1.png\"\u003e\u003cimg loading=\"lazy\" src=\"/img/Blogger/Image1.png\"\u003e\u003c/a\u003e\u003c/p\u003e","title":"[Work Notes] RabbitMQ Setup and Test"},{"content":"When I google the internet with realtime and transport stream, I could not find the information I want. The word \u0026lsquo;realtime\u0026rsquo; must construct on the relative thinking. For example, there is camera and screen and the camera\u0026rsquo;s video can be showed on the screen with quite small latency. We assume the latency is under 150ms or 300ms whatever and we can call this is realtime or not when we can have comparisons.\nThe structure of the transport stream or what we call MPEG-TS is not that simple. What I say is compare with raw encoded media direct push to intermedia. Maybe the transport stream is designed for broadcasting usage, so the media stream can be selected and video can be smooth played are much more important than realtime. Because people would not feel any latency happened when they just watch TV.\nIf we want to convert raw encoded media to transport stream: First, we have to packetize the raw encoded media to packetized elementary stream (PES). Second, we handle the PES by muxing, splitting to small slice AV data\u0026hellip;etc to program stream or what we call transport stream. Finally, we send the transport stream to internet or satellite for people to receive and watch it on display. These steps create lots of latency and make us feel it\u0026rsquo;s not realtime enough.\nLet\u0026rsquo;s go back to the definition of Miracast. It is to convert the raw encoded media stream to transport stream and then encapsulate the stream to RTP. Finally go through the WiFi directly to display. I\u0026rsquo;m not sure how many latency will be created. Maybe someone can tell me.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-the-realtime-of-transport-stream-on-miracast/","summary":"\u003cp\u003eWhen I google the internet with realtime and transport stream, I could not find the information I want. The word \u0026lsquo;realtime\u0026rsquo; must construct on the relative thinking. For example, there is camera and screen and the camera\u0026rsquo;s video can be showed on the screen with quite small latency. We assume the latency is under 150ms or 300ms whatever and we can call this is realtime or not when we can have comparisons.\u003c/p\u003e","title":"[Work Notes] The Realtime of Transport Stream on Miracast"},{"content":"Today, a supplier visited our company to introduce their solutions with DLNA and Miracast support. After some research on these protocols, it seems there are three main standards competing in the market for wireless display and media streaming.\nDLNA: This has been around for a long time. Apple was originally a member of the DLNA alliance. Airplay: Apple eventually left DLNA to create its own proprietary \u0026ldquo;Airplay\u0026rdquo; protocol, building a walled garden for seamless ecosystem integration. Miracast: Created by the Wi-Fi Alliance. It appears the Android camp is rallying around Miracast to challenge Apple\u0026rsquo;s dominance in this space. It will be interesting to see how these standards evolve and which one will eventually dominate the user experience.\nAnd let\u0026rsquo;s keep watching\u0026hellip;\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-airplay-dlna-and-miracast/","summary":"\u003cp\u003eToday, a supplier visited our company to introduce their solutions with DLNA and Miracast support. After some research on these protocols, it seems there are three main standards competing in the market for wireless display and media streaming.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eDLNA\u003c/strong\u003e: This has been around for a long time. Apple was originally a member of the DLNA alliance.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAirplay\u003c/strong\u003e: Apple eventually left DLNA to create its own proprietary \u0026ldquo;Airplay\u0026rdquo; protocol, building a walled garden for seamless ecosystem integration.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMiracast\u003c/strong\u003e: Created by the Wi-Fi Alliance. It appears the Android camp is rallying around Miracast to challenge Apple\u0026rsquo;s dominance in this space.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eIt will be interesting to see how these standards evolve and which one will eventually dominate the user experience.\u003c/p\u003e","title":"[R\u0026D Notes] Airplay, DLNA and Miracast"},{"content":"An overseas engineer uses the Boost C++ library for related project development. Seeing the STL syntax in their code made me realize I should take some time to study this — at minimum, to be able to read the code properly.\nFrom Wikipedia: http://en.wikipedia.org/wiki/Standard_Template_Library\nThe Standard Template Library (STL) is a C++ software library that influenced many parts of the C++ Standard Library. It provides four components called algorithms, containers, functional, and iterators.\nThe STL provides a ready-made set of common classes for C++, such as containers and associative arrays, that can be used with any built-in type and with any user-defined type that supports some elementary operations (such as copying and assignment). STL algorithms are independent of containers, which significantly reduces the complexity of the library.\nThe STL achieves its results through the use of templates. This approach provides compile-time polymorphism that is often more efficient than traditional run-time polymorphism. Modern C++ compilers are tuned to minimize any abstraction penalty arising from heavy use of the STL.\nThe STL was created as the first library of generic algorithms and data structures for C++, with four ideas in mind: generic programming, abstractness without loss of efficiency, the Von Neumann computation model, and value semantics.\nLearning Plot:\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-stl-notes/","summary":"\u003cp\u003eAn overseas engineer uses the Boost C++ library for related project development. Seeing the STL syntax in their code made me realize I should take some time to study this — at minimum, to be able to read the code properly.\u003c/p\u003e\n\u003cp\u003eFrom Wikipedia: \u003ca href=\"http://en.wikipedia.org/wiki/Standard_Template_Library\"\u003ehttp://en.wikipedia.org/wiki/Standard_Template_Library\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe Standard Template Library (STL) is a C++ software library that influenced many parts of the C++ Standard Library. It provides four components called algorithms, containers, functional, and iterators.\u003c/p\u003e","title":"[Work Notes] STL Notes"},{"content":"Patch Commands Create a patch file:\ndiff -Naur [from-file] [to-file] \u0026gt; [YourFileName.patch] -N: If a file is only in one directory, treat it as present but empty in the other -a: Treat all files as text -u: Use unified output format -r: Recursively compare subdirectories SVN — Remove all .svn directories $ rm -rf `find . -type d -name .svn` Git — Remove .git Only need to remove the .git directory at the root of the project.\nNFS Mount mount -t nfs -o nolock 10.0.0.3:/home/vm_share /mnt/shares ","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-linux%E5%B7%A5%E5%85%B7%E5%B0%8F%E8%A8%98%E9%8C%84/","summary":"\u003ch2 id=\"patch-commands\"\u003ePatch Commands\u003c/h2\u003e\n\u003cp\u003eCreate a patch file:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ediff -Naur \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003efrom-file\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eto-file\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e \u0026gt; \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eYourFileName.patch\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e-N\u003c/code\u003e: If a file is only in one directory, treat it as present but empty in the other\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-a\u003c/code\u003e: Treat all files as text\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-u\u003c/code\u003e: Use unified output format\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-r\u003c/code\u003e: Recursively compare subdirectories\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"svn--remove-all-svn-directories\"\u003eSVN — Remove all .svn directories\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ rm -rf \u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003efind . -type d -name .svn\u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"git--remove-git\"\u003eGit — Remove .git\u003c/h2\u003e\n\u003cp\u003eOnly need to remove the \u003ccode\u003e.git\u003c/code\u003e directory at the root of the project.\u003c/p\u003e","title":"[Work Notes] Linux Quick-Reference Notes"},{"content":"msgpack-idl How-To Step 1: Get the msgpack-idl\n$ git clone git://github.com/msgpack/msgpack-idl.git Step 2: Install the required Ruby tool\n$ sudo apt-get install ruby1.9.1 Step 3: Go to msgpack-idl folder\n$ sudo gem install msgpack-idl $ sudo msgpack-idl --install java Step 4: Create a sample file sample with the following content:\nmessage Node { 1: string address 2: map\u0026lt;string,string\u0026gt; properties 3: optional string? description } message StorageNode \u0026lt; Node { 4: long capacity 5: optional int weight = 1 } Step 5: Generate Java code with the following commands:\n$ msgpack-idl --example sample \u0026gt; sample.msgspec $ msgpack-idl -g java sample.msgspec -o ./out/ More information: http://wiki.msgpack.org/display/MSGPACK/Design+of+IDL\nNote: The Ruby implementation seems to only support Java code generation. Another IDL implementation written in Haskell is more active and can generate C++ code. Will study this further if IDL is really needed for our IPC.\nLink: http://hackage.haskell.org/packages/hackage.html\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-msgpack-idl-howto/","summary":"\u003ch2 id=\"msgpack-idl-how-to\"\u003emsgpack-idl How-To\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eStep 1:\u003c/strong\u003e Get the msgpack-idl\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ git clone git://github.com/msgpack/msgpack-idl.git\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eStep 2:\u003c/strong\u003e Install the required Ruby tool\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ sudo apt-get install ruby1.9.1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eStep 3:\u003c/strong\u003e Go to msgpack-idl folder\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ sudo gem install msgpack-idl\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ sudo msgpack-idl --install java\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eStep 4:\u003c/strong\u003e Create a sample file \u003ccode\u003esample\u003c/code\u003e with the following content:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emessage Node {\n  1: string address\n  2: map\u0026lt;string,string\u0026gt; properties\n  3: optional string? description\n}\nmessage StorageNode \u0026lt; Node {\n  4: long capacity\n  5: optional int weight = 1\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eStep 5:\u003c/strong\u003e Generate Java code with the following commands:\u003c/p\u003e","title":"[Work Notes] msgpack-idl How-To"},{"content":"Message pack with RPC extension required 3 packages.\nmsgpack msgpack-rpc mpio The msgpack and mpio are required by msgpack-rpc. The following are openwrt makefiles that I use to build the packages.\nmsgpack library\ninclude $(TOPDIR)/rules.mk\nPKG_NAME:=msgpack\nPKG_VERSION:=0.5.7\nPKG_RELEASE:=1\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=http://msgpack.org/releases/cpp/\nPKG_MD5SUM:=705106a9378c792fe22d285dba5c142c\nPKG_INSTALL:=1\ninclude $(INCLUDE_DIR)/package.mk\ndefine Package/msgpack\nSECTION:=libs\nCATEGORY:=Libraries\nTITLE:=Message Pack library\nURL:=http://msgpack.org\nendef\ndefine Package/msgpack/description\nMessagePack is an efficient binary serialization format.\nIt lets you exchange data among multiple languages like JSON but it\u0026rsquo;s faster and smaller.\nendef\ndefine Build/Configure\n$(call Build/Configure/Default, )\nendef\ndefine Build/InstallDev\n$(INSTALL_DIR) $(1)/usr/include/\n$(CP) \\\n$(PKG_INSTALL_DIR)/usr/include/* \\\n$(1)/usr/include/\n$(INSTALL_DIR) $(1)/usr/lib/pkgconfig $(CP) \\ $(PKG_INSTALL_DIR)/usr/lib/libmsgpack*.{la,so*} \\ $(1)/usr/lib/ endef\ndefine Package/msgpack/install\n$(INSTALL_DIR) $(1)/usr/lib\n$(CP) \\\n$(PKG_INSTALL_DIR)/usr/lib/libmsgpack*.* \\\n$(1)/usr/lib/\nendef\n$(eval $(call BuildPackage,msgpack)) mpio library\ninclude $(TOPDIR)/rules.mk\nPKG_NAME:=mpio\nPKG_VERSION:=0.3.7\nPKG_RELEASE:=1\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)\nPKG_BUILD_PARALLEL:=1\nPKG_FIXUP:=libtool\nPKG_INSTALL:=1\ninclude $(INCLUDE_DIR)/package.mk\ndefine Package/mpio\nSECTION:=libs\nCATEGORY:=Libraries\nTITLE:=Multipurpose parallel IO\nURL:=https://github.com/frsyuki/mpio\nendef\ndefine Package/mpio/description\nMultipurpose parallel I/O framework for C++ with fully multithreaded\nevent loop implementation\nendef\ndefine Build/Prepare\nmkdir -p $(PKG_BUILD_DIR)\n$(CP) src/* $(PKG_BUILD_DIR)/\nendef\ndefine Build/Configure\n$(call Build/Configure/Default, )\nendef\ndefine Build/InstallDev\n$(INSTALL_DIR) $(1)/usr/include/\n$(CP) \\\n$(PKG_INSTALL_DIR)/usr/include/* \\\n$(1)/usr/include/\n$(INSTALL_DIR) $(1)/usr/lib/pkgconfig $(CP) \\ $(PKG_INSTALL_DIR)/usr/lib/libmpio*.{la,so*} \\ $(1)/usr/lib/ endef\ndefine Package/mpio/install\n$(INSTALL_DIR) $(1)/usr/lib\n$(CP) \\\n$(PKG_INSTALL_DIR)/usr/lib/libmpio*.* \\\n$(1)/usr/lib/\nendef\n$(eval $(call BuildPackage,mpio)) msgpack-rpc library\ninclude $(TOPDIR)/rules.mk\nPKG_NAME:=msgpack-rpc\nPKG_VERSION:=0.3.1\nPKG_RELEASE:=1\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=http://msgpack.org/releases/cpp/\nPKG_MD5SUM:=e5e8f3631ac83d20cdf65fa0d7bfee21\nPKG_INSTALL:=1\ninclude $(INCLUDE_DIR)/package.mk\ndefine Package/msgpack-rpc\nSECTION:=libs\nCATEGORY:=Libraries\nTITLE:=Message Pack library\nURL:=http://msgpack.org\nDEPENDS:=+libmsgpack +libmpio\nendef\ndefine Package/msgpack-rpc/description\nMessagePack-RPC is an extension to support RPC through message pack.\nendef\ndefine Build/Configure\n$(call Build/Configure/Default, )\nendef\ndefine Build/InstallDev\n$(INSTALL_DIR) $(1)/usr/include/\n$(CP) \\\n$(PKG_INSTALL_DIR)/usr/include/ \\\n$(1)/usr/include/\nendef\ndefine Package/msgpack-rpc/install\n$(INSTALL_DIR) $(1)/usr/lib\nendef\n$(eval $(call BuildPackage,msgpack-rpc)) ","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-message-pack-rpc-install-on-openwrt/","summary":"\u003cp\u003eMessage pack with RPC extension required 3 packages.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emsgpack\u003c/li\u003e\n\u003cli\u003emsgpack-rpc\u003c/li\u003e\n\u003cli\u003empio\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe msgpack and mpio are required by msgpack-rpc. The following are openwrt makefiles that I use to build the packages.\u003c/p\u003e\n\u003cp\u003emsgpack library\u003c/p\u003e\n\u003cp\u003einclude $(TOPDIR)/rules.mk\u003c/p\u003e\n\u003cp\u003ePKG_NAME:=msgpack\u003cbr\u003e\nPKG_VERSION:=0.5.7\u003cbr\u003e\nPKG_RELEASE:=1\u003c/p\u003e\n\u003cp\u003ePKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\u003cbr\u003e\nPKG_SOURCE_URL:=http://msgpack.org/releases/cpp/\u003cbr\u003e\nPKG_MD5SUM:=705106a9378c792fe22d285dba5c142c\u003cbr\u003e\nPKG_INSTALL:=1\u003c/p\u003e\n\u003cp\u003einclude $(INCLUDE_DIR)/package.mk\u003c/p\u003e\n\u003cp\u003edefine Package/msgpack\u003cbr\u003e\nSECTION:=libs\u003cbr\u003e\nCATEGORY:=Libraries\u003cbr\u003e\nTITLE:=Message Pack library\u003cbr\u003e\nURL:=http://msgpack.org\u003cbr\u003e\nendef\u003c/p\u003e\n\u003cp\u003edefine Package/msgpack/description\u003cbr\u003e\nMessagePack is an efficient binary serialization format.\u003cbr\u003e\nIt lets you exchange data among multiple languages like JSON but it\u0026rsquo;s faster and smaller.\u003cbr\u003e\nendef\u003c/p\u003e","title":"[工作點滴] message pack rpc install on openwrt"},{"content":"A quick compilation of useful commands and configurations I frequently use in my daily operations.\nWorking with Patches To generate a patch from a single file or directory:\ndiff -Naur [from-file] [to-file] \u0026gt; [YourFileName.patch] -N: Treat absent files as empty. -a: Treat all files as text. -u: Unified output format (best for readability). -r: Recursive directory comparison. Version Control Cleanup Removing all .svn directories recursively:\nrm -rf `find . -type d -name .svn` Removing Git Metadata: In a Git repository, simply deleting the root .git directory is usually sufficient to remove history and configuration.\nNetwork File Systems (NFS) Standard Mount Command (Non-locking):\nmount -t nfs -o nolock 10.0.0.3:/home/vm_share /mnt/shares Using -o nolock is often crucial when mounting from a virtual machine or embedded target that doesn\u0026rsquo;t support the NLM (Network Lock Manager) protocol.\n","permalink":"https://chenfu.ai/en/posts/linux-utility-quick-notes/","summary":"\u003cp\u003eA quick compilation of useful commands and configurations I frequently use in my daily operations.\u003c/p\u003e\n\u003ch3 id=\"working-with-patches\"\u003eWorking with Patches\u003c/h3\u003e\n\u003cp\u003eTo generate a patch from a single file or directory:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ediff -Naur \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003efrom-file\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eto-file\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e \u0026gt; \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003eYourFileName.patch\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e-N\u003c/code\u003e: Treat absent files as empty.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-a\u003c/code\u003e: Treat all files as text.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-u\u003c/code\u003e: Unified output format (best for readability).\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-r\u003c/code\u003e: Recursive directory comparison.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"version-control-cleanup\"\u003eVersion Control Cleanup\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eRemoving all \u003ccode\u003e.svn\u003c/code\u003e directories recursively:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erm -rf \u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003efind . -type d -name .svn\u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eRemoving Git Metadata:\u003c/strong\u003e\nIn a Git repository, simply deleting the root \u003ccode\u003e.git\u003c/code\u003e directory is usually sufficient to remove history and configuration.\u003c/p\u003e","title":"Linux Engineering Utility Cheatsheet"},{"content":"Our company\u0026rsquo;s git server does not support SSL verify but does support username/password authentication. Git enables SSL verification by default when accessing HTTPS URLs.\nYou may encounter the following error:\nerror: Problem with the SSL CA cert (path? access rights?) while accessing https://tw.ubnt.com/git/example.git/info/refs fatal: HTTP request failed To fix this, disable SSL verification globally:\ngit config --global http.sslVerify false Then clone again:\n$ git clone https://tw.ubnt.com/git/example.git Cloning into \u0026#39;test\u0026#39;... Username for \u0026#39;https://tw.ubnt.com\u0026#39;: name Password for \u0026#39;https://name@tw.ubnt.com\u0026#39;: password remote: Counting objects: 1054, done. remote: Compressing objects: 100% (674/674), done. remote: Total 1054 (delta 390), reused 747 (delta 290) Receiving objects: 100% (1054/1054), 14.45 MiB | 377 KiB/s, done. Resolving deltas: 100% (390/390), done. Done!\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-git-clone-error-error-problem-with-the-ssl-ca-cert-path-access-rights/","summary":"\u003cp\u003eOur company\u0026rsquo;s git server does not support SSL verify but does support username/password authentication. Git enables SSL verification by default when accessing HTTPS URLs.\u003c/p\u003e\n\u003cp\u003eYou may encounter the following error:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eerror: Problem with the SSL CA cert (path? access rights?) while accessing\nhttps://tw.ubnt.com/git/example.git/info/refs\nfatal: HTTP request failed\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo fix this, disable SSL verification globally:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit config --global http.sslVerify false\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThen clone again:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ git clone https://tw.ubnt.com/git/example.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCloning into \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;test\u0026#39;\u003c/span\u003e...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUsername \u003cspan style=\"color:#66d9ef\"\u003efor\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;https://tw.ubnt.com\u0026#39;\u003c/span\u003e: name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePassword \u003cspan style=\"color:#66d9ef\"\u003efor\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;https://name@tw.ubnt.com\u0026#39;\u003c/span\u003e: password\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eremote: Counting objects: 1054, \u003cspan style=\"color:#66d9ef\"\u003edone\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eremote: Compressing objects: 100% \u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003e674/674\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e, \u003cspan style=\"color:#66d9ef\"\u003edone\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eremote: Total \u003cspan style=\"color:#ae81ff\"\u003e1054\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003edelta 390\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e, reused \u003cspan style=\"color:#ae81ff\"\u003e747\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003edelta 290\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eReceiving objects: 100% \u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003e1054/1054\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e, 14.45 MiB | \u003cspan style=\"color:#ae81ff\"\u003e377\u003c/span\u003e KiB/s, \u003cspan style=\"color:#66d9ef\"\u003edone\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eResolving deltas: 100% \u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003e390/390\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e, \u003cspan style=\"color:#66d9ef\"\u003edone\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDone!\u003c/p\u003e","title":"[Work Notes] Git Clone Error: \"Problem with the SSL CA cert (path? access rights?)\""},{"content":"When I had an engineering discussion with an overseas engineer, I found that he uses a third-party library called MessagePack for binary serialization in internet applications.\nMore detailed information about MessagePack is here: http://msgpack.org/\nI\u0026rsquo;m not sure yet what the full differences are between these two libraries, and I couldn\u0026rsquo;t find a detailed comparison online. So I\u0026rsquo;ll spend some time studying both.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-protocol-buffer-and-message-pack-initial/","summary":"\u003cp\u003eWhen I had an engineering discussion with an overseas engineer, I found that he uses a third-party library called MessagePack for binary serialization in internet applications.\u003c/p\u003e\n\u003cp\u003eMore detailed information about MessagePack is here:\n\u003ca href=\"http://msgpack.org/\"\u003ehttp://msgpack.org/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m not sure yet what the full differences are between these two libraries, and I couldn\u0026rsquo;t find a detailed comparison online. So I\u0026rsquo;ll spend some time studying both.\u003c/p\u003e","title":"[Work Notes] Protocol Buffer and Message Pack — Initial Study"},{"content":"The statusapi.pb-c.h and statusapi.pb-c.c are generated. Only header file is printing here for further explaination.\nstatusap.pb-c.h\n/* Generated by the protocol buffer compiler. DO NOT EDIT! */\n#ifndef PROTOBUF_C_statusapi_2eproto__INCLUDED #define PROTOBUF_C_statusapi_2eproto__INCLUDED\n#include \u0026lt;google/protobuf-c/protobuf-c.h\u0026gt;\nPROTOBUF_C_BEGIN_DECLS\ntypedef struct _Statusapi__StatusRequestType Statusapi__StatusRequestType; typedef struct _Statusapi__StatusResponseType Statusapi__StatusResponseType; typedef struct _Statusapi__StatusParams Statusapi__StatusParams;\n/* \u0026mdash; enums \u0026mdash; */\n/* \u0026mdash; messages \u0026mdash; */\nstruct _Statusapi__StatusRequestType { ProtobufCMessage base; }; #define STATUSAPI__STATUS_REQUEST_TYPE__INIT \\ { PROTOBUF_C_MESSAGE_INIT (\u0026amp;statusapi__status_request_type__descriptor) \\ }\nstruct _Statusapi__StatusResponseType { ProtobufCMessage base; }; #define STATUSAPI__STATUS_RESPONSE_TYPE__INIT \\ { PROTOBUF_C_MESSAGE_INIT (\u0026amp;statusapi__status_response_type__descriptor) \\ }\nstruct _Statusapi__StatusParams { ProtobufCMessage base; protobuf_c_boolean has_zoom_status; int32_t zoom_status; protobuf_c_boolean has_focus_status; int32_t focus_status; }; #define STATUSAPI__STATUS_PARAMS__INIT \\ { PROTOBUF_C_MESSAGE_INIT (\u0026amp;statusapi__status_params__descriptor) \\ , 0,0, 0,0 }\n/* Statusapi__StatusRequestType methods */ void statusapi__status_request_type__init (Statusapi__StatusRequestType *message); size_t statusapi__status_request_type__get_packed_size (const Statusapi__StatusRequestType *message); size_t statusapi__status_request_type__pack (const Statusapi__StatusRequestType *message, uint8_t *out); size_t statusapi__status_request_type__pack_to_buffer (const Statusapi__StatusRequestType *message, ProtobufCBuffer *buffer); Statusapi__StatusRequestType * statusapi__status_request_type__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void statusapi__status_request_type__free_unpacked (Statusapi__StatusRequestType *message, ProtobufCAllocator allocator); / Statusapi__StatusResponseType methods */ void statusapi__status_response_type__init (Statusapi__StatusResponseType *message); size_t statusapi__status_response_type__get_packed_size (const Statusapi__StatusResponseType *message); size_t statusapi__status_response_type__pack (const Statusapi__StatusResponseType *message, uint8_t *out); size_t statusapi__status_response_type__pack_to_buffer (const Statusapi__StatusResponseType *message, ProtobufCBuffer *buffer); Statusapi__StatusResponseType * statusapi__status_response_type__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void statusapi__status_response_type__free_unpacked (Statusapi__StatusResponseType *message, ProtobufCAllocator allocator); / Statusapi__StatusParams methods */ void statusapi__status_params__init (Statusapi__StatusParams *message); size_t statusapi__status_params__get_packed_size (const Statusapi__StatusParams *message); size_t statusapi__status_params__pack (const Statusapi__StatusParams *message, uint8_t *out); size_t statusapi__status_params__pack_to_buffer (const Statusapi__StatusParams *message, ProtobufCBuffer *buffer); Statusapi__StatusParams * statusapi__status_params__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void statusapi__status_params__free_unpacked (Statusapi__StatusParams *message, ProtobufCAllocator allocator); / \u0026mdash; per-message closures \u0026mdash; */\ntypedef void (*Statusapi__StatusRequestType_Closure) (const Statusapi__StatusRequestType *message, void *closure_data); typedef void (*Statusapi__StatusResponseType_Closure) (const Statusapi__StatusResponseType *message, void *closure_data); typedef void (*Statusapi__StatusParams_Closure) (const Statusapi__StatusParams *message, void closure_data);\n/ \u0026mdash; services \u0026mdash; */\ntypedef struct Statusapi__Status_Service Statusapi__Status_Service; struct Statusapi__Status_Service { ProtobufCService base; void (*set_status)(Statusapi__Status_Service *service, const Statusapi__StatusParams *input, Statusapi__StatusResponseType_Closure closure, void *closure_data); void (*get_status)(Statusapi__Status_Service *service, const Statusapi__StatusRequestType *input, Statusapi__StatusParams_Closure closure, void *closure_data); }; typedef void (*Statusapi__Status_ServiceDestroy)(Statusapi__Status_Service *); void statusapi__status__init (Statusapi__Status_Service *service, Statusapi__Status_ServiceDestroy destroy); #define STATUSAPI__STATUS__BASE_INIT \\ { \u0026amp;statusapi__status__descriptor, protobuf_c_service_invoke_internal, NULL } #define STATUSAPI__STATUS__INIT(function_prefix) \\ { STATUSAPI__STATUS__BASE_INIT,\\ function_prefix__ ## set_status,\\ function_prefix__ ## get_status } void statusapi__status__set_status(ProtobufCService *service, const Statusapi__StatusParams *input, Statusapi__StatusResponseType_Closure closure, void *closure_data); void statusapi__status__get_status(ProtobufCService *service, const Statusapi__StatusRequestType *input, Statusapi__StatusParams_Closure closure, void closure_data);\n/ \u0026mdash; descriptors \u0026mdash; */\nextern const ProtobufCMessageDescriptor statusapi__status_request_type__descriptor; extern const ProtobufCMessageDescriptor statusapi__status_response_type__descriptor; extern const ProtobufCMessageDescriptor statusapi__status_params__descriptor; extern const ProtobufCServiceDescriptor statusapi__status__descriptor;\nPROTOBUF_C_END_DECLS\n#endif /* PROTOBUF_statusapi_2eproto__INCLUDED */ Message Methods\n**\n**\nFollowing content mostly from http://code.google.com/p/protobuf-c/wiki/Generated_Code.\nTo initialize a message for yourself, use the uppercased __INIT macro: For example:\nStatusapi__StatusParams message = STATUSAPI__STATUS_PARAMS__INIT; This will properly handle default values.\nSometimes, a function that initializes a message of a give type is useful. For that purpose, we provide an __init() function\nStatusapi__StatusParams message; statusapi__status_params__init (\u0026amp;message); We generate some functions for each message are:\ninit(). Equivalent to assigning the __INIT macro to its argument. It\u0026rsquo;s useful in some contexts, like initializing a block of memory allocated by the user.\nunpack(). Unpack data for a particular message-format, using an optional allocator for the data: Statusapi__StatusParams * statusapi__status_params__unpack (ProtobufCAllocator *allocator, size_t length, const unsigned char *data);\nIt\u0026rsquo;s a good idea to not modify the unpacked message. That\u0026rsquo;s because we haven\u0026rsquo;t decided exactly whether the message\u0026rsquo;s fields are allocated separately or together. The only thing you can really assume is that free_unpacked() will always to the right thing with the return value from unpack(). In practice, we will never be allocating memory for required and optional primitive types, so you CAN modify those values before calling free_unpacked().\nTo make other kinds of changes, make a copy and track your own allocations:\nStatusapi__StatusParams *unpacked;\nStatusapi__StatusParams my_params;\nunpacked = statusapi__status_params__unpack (NULL, len, data);\nmy_params = *unpacked;\nmy_params.zoom_status = 1;\n\u0026hellip; when done with unpacked and my_params, call free_unpacked()\nfree_unpacked(). Free a message that you obtained with the unpack method:\nvoid statusapi__status_params__free_unpacked (Statusapi__StatusParams *message, ProtobufCAllocator *allocator);\nget_packed_size(). Find how long the serialized representation of the data will be: size_t statusapi__status_params__get_packed_size (const Statusapi__StatusParams *message);\npack(). Pack message into buffer; assumes that buffer is long enough (use get_packed_size first!). size_t statusapi__status_params__pack(const Statusapi__StatusParams *message, unsigned char *packed_data_out);\npack_to_buffer(). Pack message into virtualized buffer. size_t statusapi__status_params__pack_to_buffer(const Statusapi__StatusParams *message, ProtobufCBuffer *buffer);\nFor the definitions of ProtobufCBuffer and ProtobufCAllocator, see the libprotobuf_c page.\nFinally, note that default-value handling is a little subtle- it\u0026rsquo;ll probably mostly work as you expect (it\u0026rsquo;s mostly modeled after the c++ implementation), but it\u0026rsquo;s got a quirk regarding optional string values. There is no \u0026ldquo;has_field\u0026rdquo; for a string field. To determine if a string-field is set to the default value, use something like:\n#define my_struct_has_field(my_struct) \\ (my_struct.field != NULL \\ \u0026amp;\u0026amp; my_struct.field != my_struct__field__default_value) Now our method is judge the string if it\u0026rsquo;s NULL or not. So it depends on what you want.\nNext topic is to talk about the service and RPC system of the protobuf-c.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-protocol-buffer-message/","summary":"\u003cp\u003eThe statusapi.pb-c.h and statusapi.pb-c.c are generated. Only header file is printing here for further explaination.\u003c/p\u003e\n\u003cp\u003estatusap.pb-c.h\u003c/p\u003e\n\u003cp\u003e/* Generated by the protocol buffer compiler.  DO NOT EDIT! */\u003cbr\u003e\n#ifndef PROTOBUF_C_statusapi_2eproto__INCLUDED #define PROTOBUF_C_statusapi_2eproto__INCLUDED\u003cbr\u003e\n#include \u0026lt;google/protobuf-c/protobuf-c.h\u0026gt;\u003cbr\u003e\nPROTOBUF_C_BEGIN_DECLS\u003c/p\u003e\n\u003cp\u003etypedef struct _Statusapi__StatusRequestType Statusapi__StatusRequestType; typedef struct _Statusapi__StatusResponseType Statusapi__StatusResponseType; typedef struct _Statusapi__StatusParams Statusapi__StatusParams;\u003c/p\u003e\n\u003cp\u003e/* \u0026mdash; enums \u0026mdash; */\u003c/p\u003e\n\u003cp\u003e/* \u0026mdash; messages \u0026mdash; */\u003cbr\u003e\nstruct  _Statusapi__StatusRequestType {   ProtobufCMessage base; }; #define STATUSAPI__STATUS_REQUEST_TYPE__INIT \\  { PROTOBUF_C_MESSAGE_INIT (\u0026amp;statusapi__status_request_type__descriptor) \\      }\u003c/p\u003e\n\u003cp\u003estruct  _Statusapi__StatusResponseType {   ProtobufCMessage base; }; #define STATUSAPI__STATUS_RESPONSE_TYPE__INIT \\  { PROTOBUF_C_MESSAGE_INIT (\u0026amp;statusapi__status_response_type__descriptor) \\      }\u003c/p\u003e","title":"[工作點滴] protocol buffer message"},{"content":"There is protobuf and protobuf-c website:\nhttp://code.google.com/p/protobuf/ http://code.google.com/p/protobuf-c/ We are implementing remote control from back-end applications using protobuf-c. The protobuf-c has extensions from Google\u0026rsquo;s protobuf for RPC functionality.\nThe first experiment is using the message directly by packing messages into shared memory between the server and the client. Both sides can get the message without issues.\nOur target is to use the RPC approach that protobuf-c provides. First, we create a .proto file — here\u0026rsquo;s an example statusapi.proto:\npackage statusapi; message StatusRequestType {} message StatusResponseType {} message StatusParams { optional int32 zoom_status = 1 [default = 0]; optional int32 focus_status = 2 [default = 0]; } service Status { rpc set_status (StatusParams) returns (StatusResponseType); rpc get_status (StatusRequestType) returns (StatusParams); } Use the protobuf-c tool to generate source code:\n./protobuf-c --c_out=. statusapi.proto This creates statusapi.pb-c.c and statusapi.pb-c.h. Now let\u0026rsquo;s build the RPC server and client:\nstatus_server.c:\n#include \u0026lt;stdio.h\u0026gt; #include \u0026lt;string.h\u0026gt; #include \u0026lt;statusapi.pb-c.h\u0026gt; PROTOBUF_C_BEGIN_DECLS #include \u0026lt;google/protobuf-c/protobuf-c-rpc.h\u0026gt; PROTOBUF_C_END_DECLS static ProtobufC_RPC_Server *server; static Statusapi__StatusParams status_params = STATUSAPI__STATUS_PARAMS__INIT; void statusapi__set_status(Statusapi__Status_Service *service, const Statusapi__StatusParams *input, Statusapi__StatusResponseType_Closure closure, void *closure_data) { fprintf(stderr,\u0026#34;set status.\\n\u0026#34;); if (input-\u0026gt;has_zoom_status) { status_params.has_zoom_status=input-\u0026gt;has_zoom_status; status_params.zoom_status=input-\u0026gt;zoom_status; } if (input-\u0026gt;has_focus_status) { status_params.has_focus_status=input-\u0026gt;has_focus_status; status_params.focus_status=input-\u0026gt;focus_status; } closure (NULL, closure_data); } void statusapi__get_status(Statusapi__Status_Service *service, const Statusapi__StatusRequestType *input, Statusapi__StatusParams_Closure closure, void *closure_data) { fprintf(stderr,\u0026#34;get status!!\\n\u0026#34;); closure (\u0026amp;status_params, closure_data); } Statusapi__Status_Service statusapi_service = STATUSAPI__STATUS__INIT(statusapi__); int main(int argc, char *argv[]) { server = protobuf_c_rpc_server_new (PROTOBUF_C_RPC_ADDRESS_LOCAL, \u0026#34;status_rpc.socket\u0026#34;, (ProtobufCService *)\u0026amp;statusapi_service, NULL); while(1) { protobuf_c_dispatch_run(protobuf_c_dispatch_default()); } return 0; } Prepare two terminal windows. One runs the status_server and the other runs the status_client. The client sends a set_status message and the server saves the content in local variables. Then the client sends a get_status message and the server returns the stored values.\nMore detailed discussion of protobuf-c functions to follow.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-protocal-buffer-examples/","summary":"\u003cp\u003eThere is protobuf and protobuf-c website:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://code.google.com/p/protobuf/\"\u003ehttp://code.google.com/p/protobuf/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://code.google.com/p/protobuf-c/\"\u003ehttp://code.google.com/p/protobuf-c/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWe are implementing remote control from back-end applications using protobuf-c. The protobuf-c has extensions from Google\u0026rsquo;s protobuf for RPC functionality.\u003c/p\u003e\n\u003cp\u003eThe first experiment is using the message directly by packing messages into shared memory between the server and the client. Both sides can get the message without issues.\u003c/p\u003e\n\u003cp\u003eOur target is to use the RPC approach that protobuf-c provides. First, we create a \u003ccode\u003e.proto\u003c/code\u003e file — here\u0026rsquo;s an example \u003ccode\u003estatusapi.proto\u003c/code\u003e:\u003c/p\u003e","title":"[Work Notes] Protocol Buffer Examples"},{"content":"While organizing earlier blog posts from 2008, I notice how immature I was back then — but looking at the transitions and broader experiences since, it seems I\u0026rsquo;ve grown, even if just a little.\nIn January 2011, just before hitting my seventh year, I made a major decision: to leave a very familiar work environment. In some ways, it meant stepping out of my comfort zone — essentially resetting myself. What guided the decision was an unexpected opportunity to work at a multinational foreign company. That opportunity matched a few things I\u0026rsquo;d been thinking about:\nA multinational company, to broaden my perspective An R\u0026amp;D team, to continue growing my technical experience A team in transition, where I could step up and make a difference And so began the second chapter of my career in a completely new environment. The first month felt nothing like the disorientation of being fresh out of school — I was almost over-energized, browsing the company intranet voraciously, everything fresh and exciting. After three months, I was given the actual role of Team Leader, managing a team on a real project: international conference calls, writing technical documents according to company SOP.\nBeyond the essential work, I kept planning and identifying R\u0026amp;D projects that wouldn\u0026rsquo;t conflict with other teams. My goal was straightforward — to establish a firmware team that would strengthen the Taiwan R\u0026amp;D team\u0026rsquo;s competitive edge.\nDrawing from my first job\u0026rsquo;s experience, if you could bring together electronics, mechanical, and software/firmware talent, and build products that integrated photomechatronics, the barrier to entry rises and the visibility of the Taiwan team increases significantly.\nIn September 2011, I proposed such a project, hoping to execute it according to my vision. Unfortunately, the company\u0026rsquo;s strategy at the time couldn\u0026rsquo;t support it. What I could do was execute existing projects more perfectly, build more chips, and continue refining the proposal until the timing was right.\nThen in mid-November, an opportunity appeared — I met the CEO of the company I now work for. Robert is young — the same age or a year younger than me. His way of running a company was something I\u0026rsquo;d never seen before. Even he himself was constantly experimenting in management. His energy and drive made me feel like I was partnering with a real founder-builder. I had to see where this would go.\nThe R\u0026amp;D flexibility was enormous, driven by disciplined engineers who own their own work — an ideal environment for someone with ideas and a drive for self-realization. So in December, I made the decision to leave for my current company. It wasn\u0026rsquo;t easy, and I felt some guilt toward my previous employer. But if I\u0026rsquo;m going to let someone else control my future — I\u0026rsquo;d rather it be myself.\nMore than a year in now. The development pace here is incredibly fast. The Taiwan team is highly efficient, and I\u0026rsquo;ve learned many new concepts from the international R\u0026amp;D team. Working with people from such different backgrounds and cultures — where the starting points often differ completely — creates productive friction. Though there\u0026rsquo;s often conflict, the sparks that fly make me believe there\u0026rsquo;s a real chance for continuous growth ahead.\nHeading toward ten years — I look forward to becoming more mature, and expanding my perspective further.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-%E9%82%81%E5%90%91%E5%8D%81%E5%B9%B4/","summary":"\u003cp\u003eWhile organizing earlier blog posts from 2008, I notice how immature I was back then — but looking at the transitions and broader experiences since, it seems I\u0026rsquo;ve grown, even if just a little.\u003c/p\u003e\n\u003cp\u003eIn January 2011, just before hitting my seventh year, I made a major decision: to leave a very familiar work environment. In some ways, it meant stepping out of my comfort zone — essentially resetting myself. What guided the decision was an unexpected opportunity to work at a multinational foreign company. That opportunity matched a few things I\u0026rsquo;d been thinking about:\u003c/p\u003e","title":"[Work Notes] Heading Toward Ten Years"},{"content":"In Neihu, there\u0026rsquo;s a great BBQ spot on the road in front of the main gate of Lishan Junior High School, near Gang-Qian Road. It\u0026rsquo;s called Chuan Men Zi BBQ (串門子燒烤) — pretty solid! There\u0026rsquo;s a bookstore next door. Hours are 17:00 to 24:00. You can call ahead to order and then pick up — it\u0026rsquo;s takeout only, not the kind of place you sit down with friends for a long chat.\nIf you live nearby, definitely give it a try.\nThough the roadside BBQ stall on Lane 737 is more well-known in the area, I stumbled upon Chuan Men Zi by chance and thought it was actually just as good — if not better!\n","permalink":"https://chenfu.ai/en/posts/%E9%9B%9C%E4%B8%83%E9%9B%9C%E5%85%AB-%E5%85%A7%E6%B9%96%E5%A5%BD%E5%90%83%E7%9A%84%E7%87%92%E7%83%A4/","summary":"\u003cp\u003eIn Neihu, there\u0026rsquo;s a great BBQ spot on the road in front of the main gate of Lishan Junior High School, near Gang-Qian Road. It\u0026rsquo;s called \u003cstrong\u003eChuan Men Zi BBQ\u003c/strong\u003e (串門子燒烤) — pretty solid! There\u0026rsquo;s a bookstore next door. Hours are 17:00 to 24:00. You can call ahead to order and then pick up — it\u0026rsquo;s takeout only, not the kind of place you sit down with friends for a long chat.\u003c/p\u003e","title":"[Miscellaneous] Great BBQ in Neihu"},{"content":"ncftp is an FTP client. One of our projects needed FTP functionality, so I cross-compiled it for an ARM target.\nBuild Steps Step 1: Generate the Makefile. If you need curses support, add the relevant library — but for our project it\u0026rsquo;s not needed:\n./configure --disable-ccdv --without-curses --without-ncurse Step 2: Edit the Makefile — update CC and STRIP as follows:\nCROSS_COMPILE=arm-unknown-linux-gnu- CC=${CROSS_COMPILE}gcc STRIP=${CROSS_COMPILE}strip Step 3: Make it!\nmake ","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-ncftp-321-cross-compiling/","summary":"\u003cp\u003encftp is an FTP client. One of our projects needed FTP functionality, so I cross-compiled it for an ARM target.\u003c/p\u003e\n\u003ch2 id=\"build-steps\"\u003eBuild Steps\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eStep 1:\u003c/strong\u003e Generate the Makefile. If you need curses support, add the relevant library — but for our project it\u0026rsquo;s not needed:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e./configure --disable-ccdv --without-curses --without-ncurse\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eStep 2:\u003c/strong\u003e Edit the Makefile — update CC and STRIP as follows:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-makefile\" data-lang=\"makefile\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCROSS_COMPILE\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003earm-unknown-linux-gnu-\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCC\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e${\u003c/span\u003eCROSS_COMPILE\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003egcc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSTRIP\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e${\u003c/span\u003eCROSS_COMPILE\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003estrip\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eStep 3:\u003c/strong\u003e Make it!\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emake\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"[Work Notes] ncftp-3.2.1 Cross-Compiling"},{"content":"In two more weeks, I\u0026rsquo;ll be getting married — the title says it all. \u0026ldquo;A married man\u0026rdquo; is simply the counterpart of \u0026ldquo;a married woman\u0026rdquo;!\nMarriage marks the beginning of a new chapter in life. Someone will be by my side, supporting me through everything. There will surely be much to learn and grow through — I hope I can do it well. 😄\nThank you to my other half for more than three years of companionship. I look forward to your continued guidance in the days ahead.\n","permalink":"https://chenfu.ai/en/posts/%E5%BF%83%E6%83%85%E9%9A%A8%E7%AD%86-%E4%BA%BA%E5%A4%AB/","summary":"\u003cp\u003eIn two more weeks, I\u0026rsquo;ll be getting married — the title says it all. \u0026ldquo;A married man\u0026rdquo; is simply the counterpart of \u0026ldquo;a married woman\u0026rdquo;!\u003c/p\u003e\n\u003cp\u003eMarriage marks the beginning of a new chapter in life. Someone will be by my side, supporting me through everything. There will surely be much to learn and grow through — I hope I can do it well. 😄\u003c/p\u003e\n\u003cp\u003eThank you to my other half for more than three years of companionship. I look forward to your continued guidance in the days ahead.\u003c/p\u003e","title":"[Personal Reflections] A Married Man"},{"content":"While searching for information online recently, I stumbled upon a blog discussing articles about the security and surveillance industry. It was quite unique — it\u0026rsquo;s rare to find blogs specifically covering this niche industry. Through Andy\u0026rsquo;s articles, I also made a new connection and shared some thoughts.\nBlog link: http://febon.blogspot.com/\nIf you\u0026rsquo;re interested in the security surveillance industry, feel free to drop by and join the discussion.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-%E5%AE%89%E5%85%A8%E7%9B%A3%E6%8E%A7%E7%94%A2%E6%A5%AD%E7%9A%84%E5%A5%BD%E6%96%87/","summary":"\u003cp\u003eWhile searching for information online recently, I stumbled upon a blog discussing articles about the security and surveillance industry. It was quite unique — it\u0026rsquo;s rare to find blogs specifically covering this niche industry. Through Andy\u0026rsquo;s articles, I also made a new connection and shared some thoughts.\u003c/p\u003e\n\u003cp\u003eBlog link: \u003ca href=\"http://febon.blogspot.com/\"\u003ehttp://febon.blogspot.com/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eIf you\u0026rsquo;re interested in the security surveillance industry, feel free to drop by and join the discussion.\u003c/p\u003e","title":"[Work Notes] A Good Article on the Surveillance Industry"},{"content":"Most of the following content is adapted from online resources, with some corrections based on issues I encountered during setup. Ubuntu\u0026rsquo;s default Java environment uses GCJ-1.4, which has poorer performance. So the first step is to install the following packages using your preferred package manager (on Ubuntu, go to System → Synaptic Package Manager):\nsun-java6-jre (required environment for running Java software) sun-java6-jdk (needed only if you are a Java developer) eclipse-jdt (Eclipse\u0026rsquo;s Java Development Tools package) eclipse-common-nls (Eclipse\u0026rsquo;s localized language messages — install this for a Chinese interface) galternatives (GUI frontend for update-alternatives, used to change system default preferences) Edit the following file: vim /etc/jvm\n/etc/jvm (defines the system JAVA_HOME):\nCheck or add the following at the top of the file: /usr/lib/jvm/java-6-sun Run Eclipse once and then close it to auto-generate the .eclipse/ directory in your home folder. Add the following content to ~/.eclipse/eclipserc (user-specific JAVA_HOME):\n/usr/lib/jvm/java-6-sun Check /etc/eclipse/java_home (defines the order in which Eclipse searches for JAVA_HOME):\nUbuntu 7.10: Already present — no action needed Ubuntu 7.04: Manually add the following on the first line: /usr/lib/jvm/java-6-sun Run the command: galternatives. In the application, scroll down to find the following three Alternatives: jar, java, javac. Set each option to one beginning with /usr/lib/jvm/java-6-sun/...\nVerify by running this command in the terminal:\nOpen Eclipse and verify the JRE in use via:\n[Help] → [About Eclipse Platform] → [Configuration Detail]\nIf you see multiple entries containing /usr/lib/jvm/java-6-sun-1.6.0..., you have successfully set up your Java \u0026amp; Linux development environment.\nAfter completing the above, to achieve better development performance, you may also download the latest official Eclipse standalone release separately, extract it to a folder of your choice, and create a desktop shortcut.\nTo set up a C/C++ IDE environment, open Eclipse and go to:\n[Help] → [Software Updates] → [Find and Install]\nIn the dialog, select \u0026ldquo;Search for new features to install\u0026rdquo;, then click Next.\nIn the Sites to include in search section, check Europa Discovery Site and tick Automatically select mirrors. Click Finish.\nAfter a moment, expand the Europa Discovery Site menu, check C/C++ Development Tools, complete the installation, and restart Eclipse. You can now create C/C++ projects.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-eclipse-ide-under-ubuntu/","summary":"\u003cp\u003eMost of the following content is adapted from online resources, with some corrections based on issues I encountered during setup. Ubuntu\u0026rsquo;s default Java environment uses \u003cstrong\u003eGCJ-1.4\u003c/strong\u003e, which has poorer performance. So the first step is to install the following packages using your preferred package manager (on Ubuntu, go to System → Synaptic Package Manager):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003esun-java6-jre\u003c/strong\u003e (required environment for running Java software)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003esun-java6-jdk\u003c/strong\u003e (needed only if you are a Java developer)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eeclipse-jdt\u003c/strong\u003e (Eclipse\u0026rsquo;s Java Development Tools package)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eeclipse-common-nls\u003c/strong\u003e (Eclipse\u0026rsquo;s localized language messages — install this for a Chinese interface)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003egalternatives\u003c/strong\u003e (GUI frontend for \u003ccode\u003eupdate-alternatives\u003c/code\u003e, used to change system default preferences)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEdit the following file: \u003ccode\u003evim /etc/jvm\u003c/code\u003e\u003c/p\u003e","title":"[Work Notes] Eclipse IDE under Ubuntu"},{"content":"The following lines in red need to be modified; otherwise you\u0026rsquo;ll get a flood of errors during linking:\nCROSS_COMPILE= arm-unknown-linux-gnu- COMPILE_OPTS = $(INCLUDES) -I. -O2 -DSOCKLEN_T=socklen_t -DNO_STRSTREAM=1 -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 C = c C_COMPILER = $(CROSS_COMPILE)gcc C_FLAGS = $(COMPILE_OPTS) CPP = cpp CPLUSPLUS_COMPILER = $(CROSS_COMPILE)g++ CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1 OBJ = o LINK = $(CROSS_COMPILE)g++ -o LINK_OPTS = -L. CONSOLE_LINK_OPTS = $(LINK_OPTS) LIBRARY_LINK = $(CROSS_COMPILE)ld -o LIBRARY_LINK_OPTS = $(LINK_OPTS) -r -Bstatic LIB_SUFFIX = a LIBS_FOR_CONSOLE_APPLICATION = LIBS_FOR_GUI_APPLICATION = EXE = ","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-live555-streaming-server-quotconfigarmlinuxquot-%E8%A8%AD%E5%AE%9A%E6%AA%94%E4%BF%AE%E6%AD%A3/","summary":"\u003cp\u003eThe following lines in red need to be modified; otherwise you\u0026rsquo;ll get a flood of errors during linking:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-makefile\" data-lang=\"makefile\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCROSS_COMPILE\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e        arm-unknown-linux-gnu-\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCOMPILE_OPTS \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e        \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eINCLUDES\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e -I. -O2 -DSOCKLEN_T\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003esocklen_t -DNO_STRSTREAM\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e -D_LARGEFILE_SOURCE\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e -D_FILE_OFFSET_BITS\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e64\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eC \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e            c\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eC_COMPILER \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e        \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eCROSS_COMPILE\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003egcc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eC_FLAGS \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e        \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eCOMPILE_OPTS\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCPP \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e            cpp\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCPLUSPLUS_COMPILER \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e    \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eCROSS_COMPILE\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003eg++\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCPLUSPLUS_FLAGS \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e    \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eCOMPILE_OPTS\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e -Wall -DBSD\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOBJ \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e            o\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLINK \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e            \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eCROSS_COMPILE\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003eg++ -o\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLINK_OPTS \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e        -L.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCONSOLE_LINK_OPTS \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e    \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eLINK_OPTS\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLIBRARY_LINK \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e        \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eCROSS_COMPILE\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003eld -o\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLIBRARY_LINK_OPTS \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e    \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eLINK_OPTS\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e -r -Bstatic\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLIB_SUFFIX \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e            a\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLIBS_FOR_CONSOLE_APPLICATION \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLIBS_FOR_GUI_APPLICATION \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEXE \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"[Work Notes] Live555 Streaming Server \"config.armlinux\" Fix"},{"content":"Recently, in the process of constantly trying new things — combined with ever-changing work assignments — I\u0026rsquo;ve started running an experiment of sorts: does a person need to fully understand something before they can accomplish the work?\nFrom my observation so far, the answer is: you don\u0026rsquo;t need to fully understand in order to get something done. However, that\u0026rsquo;s a short-term view. From a long-term perspective, the hidden costs of not knowing can be just as significant — sometimes even worse.\nIn practice though, what management evaluates is short-term performance. No matter how excellent your hidden or indirect outcomes are, if they can\u0026rsquo;t be seen, they count for nothing. Yes — you heard me. Nothing.\nSo what I\u0026rsquo;m trying to experiment with is: how do you create and demonstrate that hidden value? And adjust within the organization through means available to me?\nWhile I don\u0026rsquo;t fully subscribe to the idea of working without understanding, in the process of actually shipping products, being too rigidly attached to knowing everything causes significant delays. Finding the right balance between knowing and not knowing is genuinely difficult. But if I can master it, I think I\u0026rsquo;ll have grown in a real and meaningful way.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-%E5%9C%A8%E7%9F%A5%E8%88%87%E7%84%A1%E7%9F%A5%E9%96%93%E7%9A%84%E6%8A%89%E6%93%87/","summary":"\u003cp\u003eRecently, in the process of constantly trying new things — combined with ever-changing work assignments — I\u0026rsquo;ve started running an experiment of sorts: does a person need to \u003cem\u003efully understand\u003c/em\u003e something before they can accomplish the work?\u003c/p\u003e\n\u003cp\u003eFrom my observation so far, the answer is: you don\u0026rsquo;t need to fully understand in order to get something done. However, that\u0026rsquo;s a short-term view. From a long-term perspective, the hidden costs of \u003cem\u003enot knowing\u003c/em\u003e can be just as significant — sometimes even worse.\u003c/p\u003e","title":"[Work Notes] The Choice Between Knowing and Not Knowing"},{"content":"Converting std::string to const char* in Visual C++ Method 1: Convert to C-style string\nstring str1(\u0026#34;hello world\u0026#34;); const char *c_str1 = str1.c_str(); Method 2: Convert to array via data()\nconst char *a_str1 = 0; a_str1 = str1.data(); ","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-visualc-string%E8%BD%89%E6%88%90const-char/","summary":"\u003ch2 id=\"converting-stdstring-to-const-char-in-visual-c\"\u003eConverting std::string to const char* in Visual C++\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eMethod 1: Convert to C-style string\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003estring \u003cspan style=\"color:#a6e22e\"\u003estr1\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;hello world\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003echar\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003ec_str1 \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e str1.c_str();\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eMethod 2: Convert to array via data()\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003echar\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003ea_str1 \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea_str1 \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e str1.data();\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"[Work Notes] Visual C++ String to const char*"},{"content":"Adding Development Packages on Ubuntu/Debian For general development:\napt-get install build-essential For X window development:\napt-get install x-window-system-dev For GNOME development:\napt-get install gnome-devel For KDE development:\napt-get install kde-devel ","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-%E5%9C%A8ubuntudebian%E6%B7%BB%E5%8A%A0%E9%96%8B%E7%99%BC%E5%B7%A5%E5%85%B7package/","summary":"\u003ch2 id=\"adding-development-packages-on-ubuntudebian\"\u003eAdding Development Packages on Ubuntu/Debian\u003c/h2\u003e\n\u003cp\u003eFor general development:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eapt-get install build-essential\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFor X window development:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eapt-get install x-window-system-dev\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFor GNOME development:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eapt-get install gnome-devel\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFor KDE development:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eapt-get install kde-devel\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"[Work Notes] Adding Development Tool Packages on Ubuntu/Debian"},{"content":"Over the past few weeks, work has been changing at an absolutely ridiculous pace. Hence the title — Super Transformation, like those charades-meets-variety-show segments on TV. It\u0026rsquo;s also fitting for the political sphere right now, where a better title might be Super Deception, playing out like some endless animated Flash series. With elections in the next six months, that title would hold up. And while we\u0026rsquo;re at it — Chang Ma-Bian, meaning someone who always lies.\nBut back to the topic. I\u0026rsquo;m not sure whether my manager is testing me or what, but lately assignments have been a revolving door: \u0026ldquo;Fran, let\u0026rsquo;s split this — you write the streaming server, I\u0026rsquo;ll write the client.\u0026rdquo; One week later: \u0026ldquo;Fran, we\u0026rsquo;ve actually asked Company S for a quote on the streaming server, and for the client there\u0026rsquo;s VLC, MPlayer, and the CMS downstairs — let\u0026rsquo;s try all of them.\u0026rdquo; So now I\u0026rsquo;m assigned to VLC. Another week later: \u0026ldquo;Fran, the CMS modifications have been consolidated into a usable state, so let\u0026rsquo;s just go with that.\u0026rdquo; Now I\u0026rsquo;m back on the CMS software.\nJust like that, three weeks have passed. I sit with nothing fully shipped. Maybe my manager is trying to teach me how to multitask in life. Then last Friday, a brand new assignment arrived — I was told to help write some VHDL code. But there was a board issue. And by Monday, I was back on the CMS.\nBecause of all this, I\u0026rsquo;m starting to feel a bit lost. Managers may not realize that when a system is constantly interrupted without proper resolution, it\u0026rsquo;s prone to crashing — just like software. That\u0026rsquo;s where I am right now, teetering on the edge of a crash.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-%E8%B6%85%E7%B4%9A%E8%AE%8A%E8%AE%8A%E8%AE%8A/","summary":"\u003cp\u003eOver the past few weeks, work has been changing at an absolutely ridiculous pace. Hence the title — \u003cem\u003eSuper Transformation\u003c/em\u003e, like those charades-meets-variety-show segments on TV. It\u0026rsquo;s also fitting for the political sphere right now, where a better title might be \u003cem\u003eSuper Deception\u003c/em\u003e, playing out like some endless animated Flash series. With elections in the next six months, that title would hold up. And while we\u0026rsquo;re at it — \u003cem\u003eChang Ma-Bian\u003c/em\u003e, meaning someone who always lies.\u003c/p\u003e","title":"[Work Notes] Rapid Task Switching and Chaos"},{"content":"The past few weeks have been a literal whirlwind of shifting priorities. I’ve titled this post \u0026ldquo;Super Transformations\u0026rdquo; because the pace of change in my project assignments has been dizzyingly fast—almost like the political theatrics we see in election cycles where headlines change every hour to keep the public \u0026ldquo;entertained.\u0026rdquo;\nTo get to the point: I’m not sure if my manager is testing my limits or if we just lack a cohesive roadmap. My recent weeks have looked like this:\nWeek 1: \u0026ldquo;Fran, let\u0026rsquo;s divide and conquer. You write the streaming server, I\u0026rsquo;ll write the client.\u0026rdquo; Week 2: \u0026ldquo;Wait, for the streaming server, let\u0026rsquo;s just ask Vendor S for a quote. In the meantime, try out VLC, MPlayer, and the internal CMS for the client side.\u0026rdquo; Week 3: \u0026ldquo;The client-side CMS modifications are looking good, let\u0026rsquo;s just stick with that.\u0026rdquo; Three weeks flew by, and I felt I had achieved absolutely nothing. It felt like I was being forced to \u0026ldquo;multitask\u0026rdquo; my entire life. Just when I thought things had settled, a new mission arrived: helping with VHDL development for a hardware board. But the board had issues on Monday, so I was pivoted back to the CMS.\nI feel completely lost. Managers often don\u0026rsquo;t realize that constantly \u0026ldquo;interrupting\u0026rdquo; a developer is like interrupting a system process—if the context switch isn\u0026rsquo;t handled perfectly, the whole thing crashes. I feel like I\u0026rsquo;m hovering right on the edge of a system-wide \u0026ldquo;Kernel Panic.\u0026rdquo;\n","permalink":"https://chenfu.ai/en/posts/rapid-task-switching-and-chaos/","summary":"\u003cp\u003eThe past few weeks have been a literal whirlwind of shifting priorities. I’ve titled this post \u0026ldquo;Super Transformations\u0026rdquo; because the pace of change in my project assignments has been dizzyingly fast—almost like the political theatrics we see in election cycles where headlines change every hour to keep the public \u0026ldquo;entertained.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eTo get to the point: I’m not sure if my manager is testing my limits or if we just lack a cohesive roadmap. My recent weeks have looked like this:\u003c/p\u003e","title":"The Whirlwind: Reflections on Rapid Task Switching"},{"content":"From a young age I was taught to honor commitments and keep my word. This principle has guided how I treat people, even if I occasionally slip — and when I do, it weighs on me, even makes me feel embarrassed.\nYet in today\u0026rsquo;s society, this value seems to be fading. Some people love to change their minds at the last minute. A promise can disappear as quickly as breath — gone as soon as it\u0026rsquo;s out, with nothing but a faint trace left behind.\nOf course, if something truly life-threatening comes up or an unforeseen event occurs, I understand; no reasonable person would be rigid about it. But when someone backs out simply out of laziness or convenience, repeatedly breaking word over trivial matters — that\u0026rsquo;s genuinely frustrating. And this keeps happening, again and again.\nBut what can you do about it? You just grit your teeth and let it go. Consider it a lesson learned — you simply met a lousy friend. Why waste your own anger on someone who won\u0026rsquo;t feel any guilt anyway? It\u0026rsquo;s not worth carrying.\nRegardless, I believe a person\u0026rsquo;s basic values are reflected — though not perfectly — in the life they build. Hold to your principles. Don\u0026rsquo;t waste your energy being angry or sad over people like that.\n","permalink":"https://chenfu.ai/en/posts/%E5%BF%83%E6%83%85%E9%9A%A8%E7%AD%86-%E8%AB%BE%E8%A8%80/","summary":"\u003cp\u003eFrom a young age I was taught to honor commitments and keep my word. This principle has guided how I treat people, even if I occasionally slip — and when I do, it weighs on me, even makes me feel embarrassed.\u003c/p\u003e\n\u003cp\u003eYet in today\u0026rsquo;s society, this value seems to be fading. Some people love to change their minds at the last minute. A promise can disappear as quickly as breath — gone as soon as it\u0026rsquo;s out, with nothing but a faint trace left behind.\u003c/p\u003e","title":"[Personal Reflections] A Promise"},{"content":"http://www.wretch.cc/blog/cant\nThe link above goes to a page of a member of the \u0026ldquo;Armpit Closure Troupe\u0026rdquo; — my sister forwarded it to me. There are a few songs on the page:\nMy Child: Without Your Love (Gold Bar) My Child: Bubble Gum Song My Child: Who Stole My Eraser? Highly recommended. Beyond the laughs, I browsed through their blog a bit, and in a certain sense, I found it admirable. At least this person, from middle school onward, had their own dream and took step after step toward their goal.\nModern people, when freed from material want, naturally develop a hunger for something spiritual. What I\u0026rsquo;ve seen through my father is a focus on practicality — though I\u0026rsquo;m not him. Just as I\u0026rsquo;m not the legendary Du Gongzhengsheng, how would I know he dreams away? But for people of his generation, when food was barely enough, who had time to talk about ideals?\nYet our parents gave us an environment where food and clothing were never an issue — and so we have the extra mental space to explore our dreams, to ask what we truly want. The transition isn\u0026rsquo;t easy, and parents also can\u0026rsquo;t provide the inspiration we need, because they don\u0026rsquo;t fully understand what we feel.\nRegardless, whenever I see someone with a purpose — no matter what that calling is — I feel genuinely happy for them.\nI hope we all find a life goal worth pursuing.\n","permalink":"https://chenfu.ai/en/posts/%E5%BF%83%E6%83%85%E9%9A%A8%E7%AD%86-%E6%90%9E%E7%AC%91%E7%9A%84%E6%AD%8C/","summary":"\u003cp\u003e\u003ca href=\"http://www.wretch.cc/blog/cant\"\u003ehttp://www.wretch.cc/blog/cant\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe link above goes to a page of a member of the \u0026ldquo;Armpit Closure Troupe\u0026rdquo; — my sister forwarded it to me. There are a few songs on the page:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003eMy Child: Without Your Love (Gold Bar)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eMy Child: Bubble Gum Song\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eMy Child: Who Stole My Eraser?\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eHighly recommended. Beyond the laughs, I browsed through their blog a bit, and in a certain sense, I found it admirable. At least this person, from middle school onward, had their own dream and took step after step toward their goal.\u003c/p\u003e","title":"[Personal Reflections] A Funny Song"},{"content":"I just saw a news segment featuring some unusual jobs and investment opportunities.\nOne example: a dog waste cleanup business. More and more Americans are too busy to clean up after their own pets, and I\u0026rsquo;m starting to see this trend in Taiwan too — people are willing to pay a little to have others handle cleaning tasks. While routine cleaning is still done at home, annual deep cleans are increasingly being outsourced.\nThis kind of business — dog waste cleanup — has actually grown to the point of opening multiple franchises, generating tens of millions of dollars in annual revenue. The owner said it himself: \u0026ldquo;To get rich doing what you love is a dead end. To get rich doing what others refuse to do — that\u0026rsquo;s the real path.\u0026rdquo; As the author of The Next Millionaire Will Be You writes, wealthy people tend to run humble, unglamorous businesses — not the glamorous industries of polished suits or country clubs. They deal in scrap metal, run dry cleaners, raise chickens, or manage plumbing services.\nBeyond the \u0026ldquo;do what others won\u0026rsquo;t\u0026rdquo; approach, there\u0026rsquo;s innovation. One I just came across: investing in prisons. American prisons are overcrowded, and privatized prison companies are emerging — with annual returns reportedly as high as 20%. Remarkable.\nSo why bother with the 18% returns from public sector retirement funds? The government could just invest in private prisons\u0026hellip;\nOvercrowded prisons — I\u0026rsquo;m not sure if that\u0026rsquo;s a good sign or a bad one. At least it seems like the number of people willing to commit crimes is rising.\nIn any case, the ability to calmly pursue what others refuse to do — or to bring genuine creativity to your work — just might be the opportunity to create something truly your own.\n","permalink":"https://chenfu.ai/en/posts/%E8%B2%A1%E7%B6%93%E8%A7%80%E9%BB%9E-%E5%8F%A6%E9%A1%9E%E8%A1%8C%E6%A5%AD%E8%88%87%E5%8F%A6%E9%A1%9E%E6%8A%95%E8%B3%87/","summary":"\u003cp\u003eI just saw a news segment featuring some unusual jobs and investment opportunities.\u003c/p\u003e\n\u003cp\u003eOne example: a dog waste cleanup business. More and more Americans are too busy to clean up after their own pets, and I\u0026rsquo;m starting to see this trend in Taiwan too — people are willing to pay a little to have others handle cleaning tasks. While routine cleaning is still done at home, annual deep cleans are increasingly being outsourced.\u003c/p\u003e","title":"[Financial Perspective] Alternative Industries and Alternative Investments"},{"content":"Recently I\u0026rsquo;ve been looking into the development of high-definition (HD) technology. What is HD? Those unfamiliar might not know — the first image that comes to my mind is\u0026hellip; the God of Gamblers movie character! I think I\u0026rsquo;ve been brainwashed too thoroughly. The second thing that comes to mind is a company name. And then finally I understood: HD = High Definition, the same HD that appears in all those \u0026ldquo;HD high-quality digital TV\u0026rdquo; ads!\nThe title of this post is borrowed from the opening headline of a mainland Chinese company\u0026rsquo;s product manual. Seeing it, I\u0026rsquo;m genuinely impressed by how far China has come in recent years. While China is developing next-generation technologies at a breakneck pace and beginning to set industry standards, Taiwan is gradually falling behind. Taiwan\u0026rsquo;s competitiveness still exists for now, but the gap continues to shrink. Products from China that were once seen as low-quality knockoffs are beginning to gain acceptance — and we need to take this shift seriously.\nRegardless, as LCD televisions become more widespread, HD is finding its place in the digital home, creating significant demand for high-definition peripherals. Sony, without a doubt, has been the most committed long-term player in HD development. Sony\u0026rsquo;s series of strategic moves appear to be entering the payoff phase. In the battle between Blu-ray and HD-DVD, when taking into account the breadth and cohesion of Sony\u0026rsquo;s ecosystem around Blu-ray — barring any extraordinary events — Blu-ray looks to me like it has the upper hand. Sony stands a very good chance of enjoying the fruits of the HD era in the years to come. Though they did get blindsided on gaming consoles by the Wii — I don\u0026rsquo;t think it fundamentally damages Sony\u0026rsquo;s position in this market. Let\u0026rsquo;s continue watching how it unfolds.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-%E9%AB%94%E9%A9%97%E9%A0%82%E7%B4%9A%E9%AB%98%E6%B8%85%E5%A8%9B%E6%A8%82%E4%BA%AB%E5%8F%97%E7%B2%BE%E5%BD%A9%E6%95%B8%E5%AD%97%E7%94%9F%E6%B4%BB/","summary":"\u003cp\u003eRecently I\u0026rsquo;ve been looking into the development of high-definition (HD) technology. What is HD? Those unfamiliar might not know — the first image that comes to my mind is\u0026hellip; the God of Gamblers movie character! I think I\u0026rsquo;ve been brainwashed too thoroughly. The second thing that comes to mind is a company name. And then finally I understood: HD = High Definition, the same HD that appears in all those \u0026ldquo;HD high-quality digital TV\u0026rdquo; ads!\u003c/p\u003e","title":"[Work Notes] Experience Premium HD Entertainment — Stepping into the Digital Life"},{"content":"I woke up this morning and as usual turned on the TV to watch the game. Wang Chien-Ming (Wang Xiaoming) started yesterday, but I watched one of the worst performances I\u0026rsquo;d seen — worse than when he completely fell apart. That\u0026rsquo;s life. Maybe it\u0026rsquo;s better to face setbacks earlier rather than later; when you\u0026rsquo;re young, a stumble still leaves time to bounce back. But if Wang doesn\u0026rsquo;t confront these struggles until he\u0026rsquo;s thirty-something, he might be finished — like the Yankees\u0026rsquo; injury-prone pitcher, Pavano.\nBack in school, whenever I faced competition, exams, or pressure, I noticed something strange about myself: on days when I felt physically great, I performed terribly. But when I came in with some ache or illness, I often performed surprisingly well. Maybe being ill shifted part of my mind elsewhere, so I could only focus all remaining attention on the task. The anxiety of outcome — the fear of losing — truly is a performance debuff.\nLooked at another way, maybe it\u0026rsquo;s just that I have too much energy and can\u0026rsquo;t focus it all at once. XD\nI hope Wang Chien-Ming can find a bit more grit and use the upcoming off-season to refine his pitches, build stronger mental resilience, and come back with more mature technique next year.\n","permalink":"https://chenfu.ai/en/posts/%E4%BC%91%E9%96%92%E9%81%8B%E5%8B%95-%E7%8E%8B%E5%B0%8F%E6%B0%91%E8%BC%B8%E4%BA%86/","summary":"\u003cp\u003eI woke up this morning and as usual turned on the TV to watch the game. Wang Chien-Ming (Wang Xiaoming) started yesterday, but I watched one of the worst performances I\u0026rsquo;d seen — worse than when he completely fell apart. That\u0026rsquo;s life. Maybe it\u0026rsquo;s better to face setbacks earlier rather than later; when you\u0026rsquo;re young, a stumble still leaves time to bounce back. But if Wang doesn\u0026rsquo;t confront these struggles until he\u0026rsquo;s thirty-something, he might be finished — like the Yankees\u0026rsquo; injury-prone pitcher, Pavano.\u003c/p\u003e","title":"[Leisure \u0026 Sports] Wang Xiaoming Lost"},{"content":"The day after the typhoon, I went back home to help my parents move to their new place. Heading out early in the morning, I got my first real glimpse of how powerful this typhoon had been — motorcycles were knocked over in dominoes. It was genuinely the first time I\u0026rsquo;d seen a domino effect made entirely out of motorcycles. Honestly, Taipei City government should consider reorganizing all motorcycle parking spots around the entire city — next time a typhoon hits, Taiwan could set a Guinness World Record. That would be one unique way to be in the spotlight.\nOnce at the new place, I kicked off my day as Taiwan\u0026rsquo;s one-man electrical crew — installing phone lines, checking outlets, inspecting every room. As noon approached, Mom mentioned that some friends would be coming to help. Then a whole crowd showed up — both my parents and I were stunned. So I quickly transformed into a waiter: buying drinks and snacks to host the guests. Since the place was still a mess (it was just the preliminary ceremonial visit), not the full move-in yet, I made a mental note: when visiting someone\u0026rsquo;s new home, read the situation first. Or it becomes awkward.\nAfter seeing the guests off, I buried myself in work until evening. After midnight, I morphed into a driver and went to the airport to pick up my younger brother flying home from Korea. Four hours later, I was up again to start the formal move-in ritual. Mom, in all the busy-ness, forgot to bring the lard — so my brother and I drove all the way to Taoyuan\u0026rsquo;s old market near the temple to buy some. Only after the ceremony was complete did my final role begin: my day as a mover.\nBy the end of the evening I was completely drained. It had been a very long time since I\u0026rsquo;d \u0026ldquo;exercised\u0026rdquo; like this. Ever since my belly started enthusiastically expanding on its own, I hadn\u0026rsquo;t exerted myself like this. And that evening when I visited my girlfriend to drop off some things, my mind had gone completely blank. Well, not quite blank — there was a vivid image of a bed floating in front of me\u0026hellip; surrounded by Z\u0026rsquo;s of various sizes\u0026hellip;\n","permalink":"https://chenfu.ai/en/posts/%E9%9B%9C%E4%B8%83%E9%9B%9C%E5%85%AB-%E5%8F%B0%E7%81%A3%E6%B0%B4%E9%9B%BB%E5%B7%A5%E6%90%AC%E9%81%8B%E5%B7%A5%E6%9C%8D%E5%8B%99%E7%94%9F%E5%8F%B8%E6%A9%9F/","summary":"\u003cp\u003eThe day after the typhoon, I went back home to help my parents move to their new place. Heading out early in the morning, I got my first real glimpse of how powerful this typhoon had been — motorcycles were knocked over in dominoes. It was genuinely the first time I\u0026rsquo;d seen a domino effect made entirely out of motorcycles. Honestly, Taipei City government should consider reorganizing all motorcycle parking spots around the entire city — next time a typhoon hits, Taiwan could set a Guinness World Record. That would be one unique way to be in the spotlight.\u003c/p\u003e","title":"[Miscellaneous] Taiwan Electrician + Mover + Waiter + Driver"},{"content":"Reading a few friends\u0026rsquo; blogs brought back some recollections — though my brain is impressively forgetful. A while back I went down to Tainan, and before leaving I tried to recall what life there had been like. Strangely, I couldn\u0026rsquo;t. But once I actually arrived, something in my brain clicked, and memories of my university days played back like a fast-forwarded recording.\nWithout many records to anchor them, I started to doubt my own past — my younger face, my old way of thinking.\nWhile searching for old photos for wedding preparation, I couldn\u0026rsquo;t explain the sense of strangeness I felt looking at them. That feeling of unfamiliarity actually made the images press more deeply into my mind. People and moments I\u0026rsquo;d forgotten came flooding back, and I realized that memory is like a skill — it needs to be practiced repeatedly to stay sharp.\nToday, stuck indoors during a typhoon, reading and thinking, I suddenly tried to recall basic things: What was my student ID in each school? What courses did I take? Who were my teachers? I could barely answer any of them.\nNot long ago I reunited with some high school friends — the only ones from before university that I\u0026rsquo;m still in contact with. Thanks to modern technology, we can still chat on MSN at any time. And I thought to myself: if technology hadn\u0026rsquo;t advanced to this point, how many of those friendships would I still have?\nSo, even though Microsoft isn\u0026rsquo;t exactly a universally beloved company — thank you.\n","permalink":"https://chenfu.ai/en/posts/%E5%BF%83%E6%83%85%E9%9A%A8%E7%AD%86-%E9%97%9C%E6%96%BC%E5%9B%9E%E6%86%B6/","summary":"\u003cp\u003eReading a few friends\u0026rsquo; blogs brought back some recollections — though my brain is impressively forgetful. A while back I went down to Tainan, and before leaving I tried to recall what life there had been like. Strangely, I couldn\u0026rsquo;t. But once I actually arrived, something in my brain clicked, and memories of my university days played back like a fast-forwarded recording.\u003c/p\u003e\n\u003cp\u003eWithout many records to anchor them, I started to doubt my own past — my younger face, my old way of thinking.\u003c/p\u003e","title":"[Personal Reflections] On Memory"},{"content":"Every now and then BusinessWeek profiles a company they consider outstanding at the time. The strange thing is, stocks featured prominently in the magazine have a curious tendency to become duds in the short term — not because the companies are bad, but it has a contrarian-investment flavor to it.\nYou know Nike, right? The legendary stock trader who, after decades of navigating the markets, casually drew a swoosh and founded the company. The name means \u0026ldquo;endurance and perseverance\u0026rdquo; — stay patient and things will turn around. Pretty apt. But I\u0026rsquo;ve gotten sidetracked!\nYes, stocks with magazine coverage often follow a pattern that resembles\u0026hellip; the Nike swoosh. A sharp drop after the publicity, before eventually recovering.\nAll that aside — so how do you actually pick stocks?\nSort first: Group the ones that have already surged, and separately group those that haven\u0026rsquo;t moved yet. Spread capital: Put a portion of your capital into the ones that haven\u0026rsquo;t moved yet. For those that have already surged: Wait about 1–2 months. After a corrective pullback, gradually spread your remaining capital into those as well. This is a conservative approach. Whether you make a lot or a little is mostly luck, but the odds of making something should be fairly high.\nIf you want those 5x or 10x returns, this method won\u0026rsquo;t do it. You\u0026rsquo;d need to put everything on a single bet — higher risk, and you\u0026rsquo;d have to assess that yourself. Unless you have very reliable inside information (sensitive topic).\n","permalink":"https://chenfu.ai/en/posts/%E8%B2%A1%E7%B6%93%E8%A7%80%E9%BB%9E-%E7%9C%8B%E5%95%86%E5%91%A8%E8%B2%B7%E8%82%A1%E7%A5%A8/","summary":"\u003cp\u003eEvery now and then \u003cem\u003eBusinessWeek\u003c/em\u003e profiles a company they consider outstanding at the time. The strange thing is, stocks featured prominently in the magazine have a curious tendency to become duds in the short term — not because the companies are bad, but it has a contrarian-investment flavor to it.\u003c/p\u003e\n\u003cp\u003eYou know Nike, right? The legendary stock trader who, after decades of navigating the markets, casually drew a swoosh and founded the company. The name means \u0026ldquo;endurance and perseverance\u0026rdquo; — stay patient and things will turn around. Pretty apt. But I\u0026rsquo;ve gotten sidetracked!\u003c/p\u003e","title":"[Financial Perspective] Using BusinessWeek to Pick Stocks"},{"content":"After entering the workforce, my stamina has declined year by year, and I\u0026rsquo;ve grown increasingly out of shape. Now all I have left is a round of golf once every two weeks — or sometimes stretching to once a month. Today my instructor seemed to have reached his limit with me\u0026hellip; probably feeling the same frustration a tutor feels when they want to shake a student. But I finally feel like I\u0026rsquo;ve made just a tiny bit of progress! XD\nLooking back though, after eight or nine months of practice, my 7-iron still only goes about 80–90 yards at best — or I just hit a dribbler. That\u0026rsquo;s really something. My instructor\u0026rsquo;s words, not mine!\n","permalink":"https://chenfu.ai/en/posts/%E5%BF%83%E6%83%85%E9%9A%A8%E7%AD%86-%E6%AE%98%E5%AD%98%E7%9A%84%E9%81%8B%E5%8B%95-%E9%AB%98%E7%88%BE%E5%A4%AB/","summary":"\u003cp\u003eAfter entering the workforce, my stamina has declined year by year, and I\u0026rsquo;ve grown increasingly out of shape. Now all I have left is a round of golf once every two weeks — or sometimes stretching to once a month. Today my instructor seemed to have reached his limit with me\u0026hellip; probably feeling the same frustration a tutor feels when they want to shake a student. But I finally feel like I\u0026rsquo;ve made just a tiny bit of progress! XD\u003c/p\u003e","title":"[Personal Reflections] My Last Sport — Golf"},{"content":"While compiling Busybox 1.7.2 using the default config (make defconfig) with a specific ARM toolchain, I encountered two specific compilation errors. One was related to the route applet, and the other was in taskset.c.\nI resolved the taskset.c issue by disabling it temporarily, but later found a proper fix. The root cause lies in a mismatch between uClibc (which Busybox is primarily designed for) and glibc. Specifically, the number of arguments for sched_getaffinity and sched_setaffinity differs between the two.\nError Log: CC miscutils/taskset.o miscutils/taskset.c: In function `taskset_main\u0026#39;: miscutils/taskset.c:78: warning: passing arg 2 of `sched_getaffinity\u0026#39; makes pointer from integer without a cast miscutils/taskset.c:78: error: too many arguments to function `sched_getaffinity\u0026#39; ... Solution: We can use a preprocessor check for __GLIBC__ to handle the parameter difference. Here is the patch applied to taskset.c:\n--- miscutils/taskset.c +++ miscutils/taskset.c @@ -75,7 +75,13 @@ if (opt \u0026amp; OPT_p) { print_aff: + /* Glilbc has 2 params for this func */ +#ifdef __GLIBC__ + if (sched_getaffinity(pid, \u0026amp;mask) \u0026lt; 0) +#else if (sched_getaffinity(pid, sizeof(mask), \u0026amp;mask) \u0026lt; 0) +#endif bb_perror_msg_and_die(\u0026#34;failed to get pid %d\u0026#39;s affinity\u0026#34;, pid); By applying this change, the compilation completes successfully. This is a classic example of the subtle porting challenges when working with different C libraries in embedded Linux development.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-busybox-172-tasksetc%E7%B7%A8%E8%AD%AF%E7%94%A2%E7%94%9Ferror/","summary":"\u003cp\u003eWhile compiling Busybox 1.7.2 using the default config (\u003ccode\u003emake defconfig\u003c/code\u003e) with a specific ARM toolchain, I encountered two specific compilation errors. One was related to the \u003ccode\u003eroute\u003c/code\u003e applet, and the other was in \u003ccode\u003etaskset.c\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eI resolved the \u003ccode\u003etaskset.c\u003c/code\u003e issue by disabling it temporarily, but later found a proper fix. The root cause lies in a mismatch between uClibc (which Busybox is primarily designed for) and glibc. Specifically, the number of arguments for \u003ccode\u003esched_getaffinity\u003c/code\u003e and \u003ccode\u003esched_setaffinity\u003c/code\u003e differs between the two.\u003c/p\u003e","title":"[R\u0026D Notes] Troubleshooting Busybox 1.7.2 taskset.c Compilation Errors"},{"content":"To speed up the boot process, Ubuntu uses dash as the default shell instead of the traditional bash. You can verify this at /bin/sh → /bin/dash.\nIf you want to switch back to the original bash, type the following at the prompt:\nsudo dpkg-reconfigure dash When the configuration window appears, select \u0026ldquo;No\u0026rdquo; to revert back to bash.\nRecommendation: If you\u0026rsquo;re doing software development on Ubuntu and write shell scripts, it\u0026rsquo;s safer to switch back to bash for compatibility.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-ubuntu-dash/","summary":"\u003cp\u003eTo speed up the boot process, Ubuntu uses \u003cstrong\u003edash\u003c/strong\u003e as the default shell instead of the traditional \u003cstrong\u003ebash\u003c/strong\u003e. You can verify this at \u003ccode\u003e/bin/sh → /bin/dash\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIf you want to switch back to the original bash, type the following at the prompt:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo dpkg-reconfigure dash\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWhen the configuration window appears, select \u003cstrong\u003e\u0026ldquo;No\u0026rdquo;\u003c/strong\u003e to revert back to bash.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eRecommendation:\u003c/strong\u003e If you\u0026rsquo;re doing software development on Ubuntu and write shell scripts, it\u0026rsquo;s safer to switch back to bash for compatibility.\u003c/p\u003e","title":"[Work Notes] Ubuntu Dash vs Bash"},{"content":"To accelerate boot times, Ubuntu moved to using Dash (/bin/dash) as the default system shell (/bin/sh), replacing the more feature-rich but slower Bash. You can verify this linkage by checking /bin/sh -\u0026gt; /bin/dash.\nWhile this is great for system performance, it can cause unexpected failures in shell scripts designed specifically with \u0026ldquo;Bashisms\u0026rdquo; (features unique to Bash). If you need to revert the default shell back to Bash for compatibility reasons, you can execute the following command:\nsudo dpkg-reconfigure dash When the configuration window appears, select \u0026lsquo;No\u0026rsquo;. This will point /bin/sh back to Bash. For those developing software or writing complex deployment scripts on Ubuntu, I strongly recommend sticking with Bash or ensuring your scripts are POSIX-compliant to avoid subtle bugs introduced by the Dash transition.\n","permalink":"https://chenfu.ai/en/posts/ubuntu-dash-vs-bash/","summary":"\u003cp\u003eTo accelerate boot times, Ubuntu moved to using \u003cstrong\u003eDash\u003c/strong\u003e (\u003ccode\u003e/bin/dash\u003c/code\u003e) as the default system shell (\u003ccode\u003e/bin/sh\u003c/code\u003e), replacing the more feature-rich but slower \u003cstrong\u003eBash\u003c/strong\u003e. You can verify this linkage by checking \u003ccode\u003e/bin/sh -\u0026gt; /bin/dash\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eWhile this is great for system performance, it can cause unexpected failures in shell scripts designed specifically with \u0026ldquo;Bashisms\u0026rdquo; (features unique to Bash). If you need to revert the default shell back to Bash for compatibility reasons, you can execute the following command:\u003c/p\u003e","title":"Ubuntu Transition: Dash vs. Bash"},{"content":"BusinessWeek Issue 1035 — Lead Story: Joining forces with e-commerce\u0026rsquo;s army of ants, Terry Gou sets his sights on becoming an internet \u0026ldquo;flying tiger.\u0026rdquo;\nTaiwan\u0026rsquo;s most globally powerful manufacturer is undoubtedly Foxconn. To build a new strategic layout, Foxconn has been in negotiations to cooperate with Alibaba, China\u0026rsquo;s largest e-commerce platform — leveraging internet commerce to capture what matters most in the digital age: information and personalization. Four years ago, Foxconn expanded upward from its original three C\u0026rsquo;s (Computers, Communications, Consumer Electronics) by adding three more (Automotive Electronics, Channels, Content). Now, by bridging the gap between virtual and physical worlds, Foxconn has officially entered the internet industry.\nAs someone born in the latter half of the 1970s, I lived through the era of the dotcom bubble. Back then, coverage of the internet — in outlets like Business Next Weekly — was dramatic to the point of absurdity, filled with sensational neologisms engineered to capture attention. Yet what cannot be denied is that if you took those reports and placed them ten years later — today — almost everything they predicted has come true. The bubble burst, but many companies rebuilt themselves, found the right business models, and created new value.\nToday I can find tens of thousands of resources online, shop in virtual stores, and write blogs to share my thoughts and feelings. In the span of a decade, the internet has become a basic necessity of life — when I come home and can\u0026rsquo;t get online, something feels missing.\nAs the internet deepens its role in daily life, the entire internet industry has entered a phase of high growth. The time to think carefully about all these transformations is now. History\u0026rsquo;s great current is sweeping us into an entirely new era. Let\u0026rsquo;s observe carefully.\nKey points from the article:\nTwo forces to master in the internet economy: Information and Personalization.\n\u0026ldquo;The winners of the internet aren\u0026rsquo;t determined by scale, but by capability and flexibility.\u0026rdquo;\nIntegrating content and information, connecting logistics and payments, creates new value.\n7 Stages of E-Commerce Transactions:\nA (Access): Connect to the internet B (Browse): Search for products and exchange information C (Credit): Complete payment D (Delivery): Get products to the buyer E (Enable): Installation and training F (Fix): Maintenance services G (Guarantee): Warranty A to C is the virtual world; D to G requires the physical world. Bridging C and D creates entirely new value.\nThree Keys to Success:\nA winning strategy An unshakeable commitment to win A scientifically grounded direction of development Winning team theory — The Barrel Theory: A team\u0026rsquo;s true strength is not determined by its strongest member, but by its weakest. You must help the weakest member grow while learning to recognize others\u0026rsquo; strengths.\n","permalink":"https://chenfu.ai/en/posts/%E8%B2%A1%E7%B6%93%E8%A7%80%E9%BB%9E-6cip%E9%B4%BB%E6%B5%B7%E6%96%B0%E4%BD%88%E5%B1%80/","summary":"\u003cp\u003e\u003cem\u003eBusinessWeek Issue 1035\u003c/em\u003e — Lead Story: Joining forces with e-commerce\u0026rsquo;s army of ants, Terry Gou sets his sights on becoming an internet \u0026ldquo;flying tiger.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eTaiwan\u0026rsquo;s most globally powerful manufacturer is undoubtedly Foxconn. To build a new strategic layout, Foxconn has been in negotiations to cooperate with Alibaba, China\u0026rsquo;s largest e-commerce platform — leveraging internet commerce to capture what matters most in the digital age: information and personalization. Four years ago, Foxconn expanded upward from its original three C\u0026rsquo;s (Computers, Communications, Consumer Electronics) by adding three more (Automotive Electronics, Channels, Content). Now, by bridging the gap between virtual and physical worlds, Foxconn has officially entered the internet industry.\u003c/p\u003e","title":"[Financial Perspective] Foxconn's New 6C+IP Strategy"},{"content":"The key to rapid M\u0026amp;A: make personnel decisions swiftly, and avoid internal power struggles.\nPriority order for an insurance company\u0026rsquo;s development should be: → Introduce and innovate products → Build a more efficient organization → Expand distribution channels → Improve risk management → Pursue M\u0026amp;A\nThe real key to winning in M\u0026amp;A is respect. Price matters, but the real secret is not overpaying — the true value of an acquisition is realized in long-term stock performance.\nThe biggest problem in M\u0026amp;A is always a people problem.\nFor acquisitions in Asia, 100% ownership should be the priority. Joint ventures (such as in Malaysia or China) should be a last resort. Adapt to how business is done locally in each country. Core principles:\nAlways tell the truth Stay focused on your core business Have ambition Leadership must be fully committed On doing business in China: It\u0026rsquo;s difficult, because China lacks a complete commercial framework. In their rapid development, they\u0026rsquo;ve tried to grab too much at once, neglecting the establishment of complete systems, core frameworks, commercial law, standard business practices, and respect for intellectual property. The approach must be:\nBe very patient to first obtain a license Under Chinese law, find the right partner — choose a joint venture company that doesn\u0026rsquo;t understand insurance, allowing them to manage Manulife\u0026rsquo;s relationship with China\u0026rsquo;s government and officials Stay true to your values. Keep an open mind, aspire to treat people fairly for life, respect all living things, stay vigilant, and stay curious.\n","permalink":"https://chenfu.ai/en/posts/%E8%B2%A1%E7%B6%93%E8%A7%80%E9%BB%9E-%E5%85%A8%E7%90%83%E7%AC%AC%E4%BA%94%E5%A4%A7%E4%BF%9D%E9%9A%AA%E5%85%AC%E5%8F%B8%E5%AE%8F%E5%88%A9%E4%BA%BA%E5%A3%BD%E5%A4%9A%E7%B8%BD%E8%A3%81%E6%98%8E%E5%B0%BC%E5%85%8B%E4%B9%8B%E8%B3%BC%E4%BD%B5%E5%BF%83%E6%B3%95/","summary":"\u003cp\u003eThe key to rapid M\u0026amp;A: make personnel decisions swiftly, and avoid internal power struggles.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePriority order for an insurance company\u0026rsquo;s development should be:\u003c/strong\u003e\n→ Introduce and innovate products → Build a more efficient organization → Expand distribution channels → Improve risk management → Pursue M\u0026amp;A\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eThe real key to winning in M\u0026amp;A is respect.\u003c/strong\u003e Price matters, but the real secret is \u003cem\u003enot\u003c/em\u003e overpaying — the true value of an acquisition is realized in long-term stock performance.\u003c/p\u003e","title":"[Financial Perspective] Manulife CEO John Mineker on the Art of M\u0026A"},{"content":"Looking at my parents\u0026rsquo; silver hair and the lines the years have carved into their faces, my heart aches. After starting university, aside from a brief stint at home during military service, I\u0026rsquo;ve always been away — studying far from home, and now working even farther. Though I\u0026rsquo;ve never said it out loud, there\u0026rsquo;s a small knot of guilt that stays with me. I hope my parents live peacefully, healthily, and happily. That is my greatest wish for them.\nI am my father\u0026rsquo;s son. Documented observations:\nSays one thing, means another! Quietly does caring things for family — but never says so! Always tucks feelings of guilt away inside. Sometimes inexplicably raises his voice. \u0026hellip;more to be discovered I am my mother\u0026rsquo;s son. Documented observations:\nScatterbrained. Always forgetting things. Sometimes doesn\u0026rsquo;t read the situation well. Dozes off when tired. \u0026hellip;more to be discovered Why are they all flaws\u0026hellip;? I honestly don\u0026rsquo;t know what the strengths are. Family members always see the flaws — and magnify them! Today visiting Grandma, I chatted with my uncle for a bit. When I asked how my younger cousin was doing in school, he immediately proved it. In his mind, not a single one of the kids was good. XD\n","permalink":"https://chenfu.ai/en/posts/%E5%BF%83%E6%83%85%E9%9A%A8%E7%AD%86-%E6%88%91%E6%98%AF%E7%88%B8%E5%AA%BD%E7%9A%84%E5%85%92%E5%AD%90/","summary":"\u003cp\u003eLooking at my parents\u0026rsquo; silver hair and the lines the years have carved into their faces, my heart aches. After starting university, aside from a brief stint at home during military service, I\u0026rsquo;ve always been away — studying far from home, and now working even farther. Though I\u0026rsquo;ve never said it out loud, there\u0026rsquo;s a small knot of guilt that stays with me. I hope my parents live peacefully, healthily, and happily. That is my greatest wish for them.\u003c/p\u003e","title":"[Personal Reflections] A Parent's Child"},{"content":"Implementing Daemons in Embedded Linux systems is a fundamental task for long-running services. Based on the excellent Linux Daemon Writing HOWTO by Devin Watson, I have refactored several processes in my current project to run as background services (daemons).\nBy backgrounding these processes, we ensure they remain resident in the system without blocking the console or being tied to a specific session.\nCore Implementation Pattern The following C snippet demonstrates the standard procedure for \u0026ldquo;daemonizing\u0026rdquo; a process: fork() from the parent, create a new session with setsid(), change the working directory, and close standard file descriptors.\nint main(void) { pid_t pid, sid; // 1. Fork off the parent process pid = fork(); if (pid \u0026lt; 0) exit(EXIT_FAILURE); if (pid \u0026gt; 0) exit(EXIT_SUCCESS); // Exit parent // 2. Change the file mode mask umask(0); // 3. Create a new SID for the child process sid = setsid(); if (sid \u0026lt; 0) exit(EXIT_FAILURE); // 4. Change the working directory to root if ((chdir(\u0026#34;/\u0026#34;)) \u0026lt; 0) exit(EXIT_FAILURE); // 5. Close out the standard file descriptors close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); // Daemon-specific initialization // For example, initializing GPIO pins system(\u0026#34;/usr/sbin/setgpio -il\u0026#34;); while(1) { // Main service loop char message[20]; // Custom helper to capture command output my_system(\u0026#34;/usr/sbin/getgpio --status\u0026#34;, message, 20); if(message[17]==\u0026#39;0\u0026#39;) { system(\u0026#34;/usr/sbin/setgpio -ol\u0026#34;); } else if(message[17]==\u0026#39;1\u0026#39;) { system(\u0026#34;/usr/sbin/setgpio -oh\u0026#34;); } sleep(5); // Polling interval } return 0; } This structural approach provides a clean and reliable way to manage background hardware monitoring or control tasks in resource-constrained embedded environments.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-daemon%E6%87%89%E7%94%A8%E6%96%BClinux%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%B5%B1%E5%AF%A6%E4%BD%9C/","summary":"\u003cp\u003eImplementing Daemons in Embedded Linux systems is a fundamental task for long-running services. Based on the excellent \u003cem\u003eLinux Daemon Writing HOWTO\u003c/em\u003e by Devin Watson, I have refactored several processes in my current project to run as background services (daemons).\u003c/p\u003e\n\u003cp\u003eBy backgrounding these processes, we ensure they remain resident in the system without blocking the console or being tied to a specific session.\u003c/p\u003e\n\u003ch3 id=\"core-implementation-pattern\"\u003eCore Implementation Pattern\u003c/h3\u003e\n\u003cp\u003eThe following C snippet demonstrates the standard procedure for \u0026ldquo;daemonizing\u0026rdquo; a process: \u003ccode\u003efork()\u003c/code\u003e from the parent, create a new session with \u003ccode\u003esetsid()\u003c/code\u003e, change the working directory, and close standard file descriptors.\u003c/p\u003e","title":"[R\u0026D Notes] Implementing Linux Daemons in Embedded Systems"},{"content":"Recently I was assigned to work on a streaming server. Working from the original development platform, we applied patches via shell scripts to transform source files — using patches on the original source code to generate modified files, then compiling those into the required libraries or executables.\nAt first I didn\u0026rsquo;t think much about why this approach was used, but I\u0026rsquo;ve recently started to appreciate its advantages.\nThe original source files we need are open-source packages downloadable from the internet. To track our modifications, we use the diff command to create patch files. When we combine multiple application components together, we end up with a collection of tarballs and patch files. We then manage them with shell scripts organized into three types:\nEXTRACT — extract tarballs MAKE — build all applications BUILD — move output to the target directory This approach makes the overall project structure clear and easy to understand. Currently, I\u0026rsquo;m trying to use this method to reconstruct the same setup with upgraded versions of the component applications. If it builds cleanly, future upgrades should be much easier.\nOf course, this isn\u0026rsquo;t about the active development process — it\u0026rsquo;s about tidying up the project at a certain maturity point. The goal is to hand off the project to someone else in a state where they can quickly understand the system architecture.\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-patch-vs-%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%B5%B1%E7%99%BC%E5%B1%95%E5%BF%83%E5%BE%97/","summary":"\u003cp\u003eRecently I was assigned to work on a streaming server. Working from the original development platform, we applied patches via shell scripts to transform source files — using patches on the original source code to generate modified files, then compiling those into the required libraries or executables.\u003c/p\u003e\n\u003cp\u003eAt first I didn\u0026rsquo;t think much about why this approach was used, but I\u0026rsquo;ve recently started to appreciate its advantages.\u003c/p\u003e\n\u003cp\u003eThe original source files we need are open-source packages downloadable from the internet. To track our modifications, we use the \u003ccode\u003ediff\u003c/code\u003e command to create patch files. When we combine multiple application components together, we end up with a collection of tarballs and patch files. We then manage them with shell scripts organized into three types:\u003c/p\u003e","title":"[Work Notes] Patch vs. Embedded Systems Development Notes"},{"content":"For anyone working with Linux, the concept of a \u0026ldquo;Daemon\u0026rdquo; (or service) is fundamental. Daemons are background processes that operate independently of any active user session. I recently deep-dived into this topic via Devin Watson\u0026rsquo;s Linux Daemon Writing HOWTO, which provides a fantastic primer and a clear template.\nBuilding on that foundation, I refactored several processes in my current project to run as persistent background services. Below is a code snippet demonstrating the core structural requirements for a Linux daemon:\nint main(void) { char message[20]; pid_t pid, sid; // 1. Fork off the parent process pid = fork(); if (pid \u0026lt; 0) { exit(EXIT_FAILURE); } // 2. Exit the parent process so it looks like the command finished if(pid \u0026gt; 0) { exit(EXIT_SUCCESS); } // 3. Change the file mode mask umask(0); // 4. Create a new SID for the child process to detach from the terminal sid = setsid(); if(sid \u0026lt; 0) { exit(EXIT_FAILURE); } // 5. Change the working directory to root for safety if((chdir(\u0026#34;/\u0026#34;)) \u0026lt; 0) { exit(EXIT_FAILURE); } // 6. Close out standard file descriptors (STDIN, STDOUT, STDERR) close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); // Daemon-specific initialization // Example: Initializing GPIO pins via a helper tool system(\u0026#34;/usr/sbin/setgpio -il\u0026#34;); while(1) { // Main loop logic: Here we poll GPIO status and react // Using a custom \u0026#39;my_system\u0026#39; function to capture output into a buffer my_system(\u0026#34;/usr/sbin/getgpio --status\u0026#34;, message, 20); if(message[17]==\u0026#39;0\u0026#39;) { system(\u0026#34;/usr/sbin/setgpio -ol\u0026#34;); } else if(message[17]==\u0026#39;1\u0026#39;) { system(\u0026#34;/usr/sbin/setgpio -oh\u0026#34;); } // Sleep to throttle CPU usage sleep(5); } return 0; } This structural pattern ensures the process is \u0026ldquo;detached\u0026rdquo; from the terminal session that started it, allowing it to survive terminal closure and manage system resources (like GPIO pins) silently in the background.\n","permalink":"https://chenfu.ai/en/posts/linux-daemon-implementation-embedded-systems/","summary":"\u003cp\u003eFor anyone working with Linux, the concept of a \u0026ldquo;Daemon\u0026rdquo; (or service) is fundamental. Daemons are background processes that operate independently of any active user session. I recently deep-dived into this topic via Devin Watson\u0026rsquo;s \u003cem\u003eLinux Daemon Writing HOWTO\u003c/em\u003e, which provides a fantastic primer and a clear template.\u003c/p\u003e\n\u003cp\u003eBuilding on that foundation, I refactored several processes in my current project to run as persistent background services. Below is a code snippet demonstrating the core structural requirements for a Linux daemon:\u003c/p\u003e","title":"Practical Daemon Implementation in Embedded Linux"},{"content":"Recently, I was assigned to work on a streaming server project. On our development platform, we utilize a combination of patch files and shell scripts to manage source code. We start with the upstream source, apply modifications via patch commands, and then compile the results into the necessary shared libraries or executables. Initially, I didn\u0026rsquo;t give much thought to why we adopted this specific workflow, but lately, I\u0026rsquo;ve begun to appreciate the profound advantages of this approach.\nThe original source files we need are often open-source packages retrieved directly from the internet. By keeping these \u0026ldquo;pristine\u0026rdquo; base files separate and creating patch files via the diff command for our local modifications, we achieve a very clean separation of concerns. When we assemble a complex system composed of various applications, we end up with a collection of standard tarballs and a set of corresponding patch files. We manage these using shell scripts organized into three main phases: EXTAR (extracting tarballs), MAKE (compiling applications), and BUILD (deploying to the target directory).\nThis management style makes the entire project architecture transparent and easy to understand. Currently, I am attempting to reconstruct a similar system using the latest versions of these applications. If this builds successfully, future upgrades should be relatively straightforward. Of course, this structured approach is most beneficial once a project reaches a certain level of maturity; it\u0026rsquo;s about cleaning up and documenting the architecture so that if the work is handed over to a new team member, they can grasp the system\u0026rsquo;s design almost immediately.\n","permalink":"https://chenfu.ai/en/posts/patch-vs-embedded-system-development/","summary":"\u003cp\u003eRecently, I was assigned to work on a streaming server project. On our development platform, we utilize a combination of patch files and shell scripts to manage source code. We start with the upstream source, apply modifications via \u003ccode\u003epatch\u003c/code\u003e commands, and then compile the results into the necessary shared libraries or executables. Initially, I didn\u0026rsquo;t give much thought to why we adopted this specific workflow, but lately, I\u0026rsquo;ve begun to appreciate the profound advantages of this approach.\u003c/p\u003e","title":"Reflections on Patch Files and Embedded Systems Development"},{"content":"Carey was a dog that my fiancée used to own. She passed away shortly after Dragon Boat Festival\u0026hellip;\nThe first time I met her, she bit me! In my entire life, I\u0026rsquo;ve been bitten by two dogs. The first was named Lucky — I forget if it was middle school or elementary school — but it wasn\u0026rsquo;t particularly lucky for me. I just wanted to pet her, and she bit me. With Carey, I also just wanted to pet her, and she bit me too\u0026hellip; though not as badly as the first time.\nAfter that first \u0026ldquo;intimate encounter,\u0026rdquo; whenever I visited my girlfriend\u0026rsquo;s place, I\u0026rsquo;d be greeted by Carey\u0026rsquo;s welcoming barks. A little loud! But then she\u0026rsquo;d come running over to rub against me and beg for food — she was such a little glutton.\nCarey was an important family member to my girlfriend — probably even more important than me. She had been by her side through so many days, through all her moods. Even now, my girlfriend still feels guilty about Carey\u0026rsquo;s passing.\nI watched from the sidelines, unable to find the words. So many comforting thoughts swirled in my head, but I swallowed them all back.\nEven now, visiting her place — more than two months later — something still feels off. Not quite like the hallucinations in the Korean drama I watched, but there\u0026rsquo;s definitely something missing. When I ride past Renxin Pet Hospital on my way back, I still think of Carey.\nAs time passes, I suppose I\u0026rsquo;ll slowly forget. But regardless, I want to record this memory of Carey.\nI\u0026rsquo;m grateful to her — she filled in for what I lacked, because I was often the \u0026ldquo;bad guy\u0026rdquo; in my girlfriend\u0026rsquo;s eyes.\n","permalink":"https://chenfu.ai/en/posts/%E5%BF%83%E6%83%85%E9%9A%A8%E7%AD%86-%E5%BC%B5carey/","summary":"\u003cp\u003eCarey was a dog that my fiancée used to own. She passed away shortly after Dragon Boat Festival\u0026hellip;\u003c/p\u003e\n\u003cp\u003eThe first time I met her, she bit me! In my entire life, I\u0026rsquo;ve been bitten by two dogs. The first was named Lucky — I forget if it was middle school or elementary school — but it wasn\u0026rsquo;t particularly lucky for me. I just wanted to pet her, and she bit me. With Carey, I also just wanted to pet her, and she bit me too\u0026hellip; though not as badly as the first time.\u003c/p\u003e","title":"[Personal Reflections] Chang Carey"},{"content":"Since high school, I used to buy computing magazines like PC DIY or gaming magazines — always chasing the latest trends: building a PC, playing games. Then, in my fourth year of university, a younger student was reading BusinessWeek, and I curiously asked why. He said he\u0026rsquo;d been reading it since high school, just out of interest, and that it offered many diverse perspectives. After that, I started buying a copy here and there — partly still following trends, I suppose.\nNow I\u0026rsquo;m a subscriber. Through BusinessWeek I\u0026rsquo;ve gained so much practical knowledge I couldn\u0026rsquo;t appreciate back then — and after entering the workforce, hazy memories have become powerful tools. Playing the stock market helped me understand the structures of different industries, their upstream and downstream relationships. Mapping that onto BusinessWeek articles, I began to understand how a company achieves what\u0026rsquo;s often called \u0026ldquo;success\u0026rdquo; (Note 1).\nThrough absorbing all of this, naturally, reflection and perspective began to shift. BusinessWeek is ultimately a media outlet, and no matter how objective a publication tries to be, some bias can still slip through. What I\u0026rsquo;m really saying is: read thoughtfully, think independently, even if you don\u0026rsquo;t fully understand something — at the very least, you\u0026rsquo;ve been exposed to it. Someday, perhaps when the timing is right, a flash of insight will arrive.\nBeyond business, I\u0026rsquo;ve found in BusinessWeek a wealth of perspectives on politics, education, society, and the humanities. Through these views, I\u0026rsquo;ve started piecing together a rough picture of what I believe life means. Though no religion has claimed me yet, there is one phrase I\u0026rsquo;ve grown fond of: \u0026ldquo;Everyone in this world has a responsibility. Whatever ability heaven has granted you, it exists so you can contribute something to the world.\u0026rdquo;\nAt least, I\u0026rsquo;ve started to have a small dream — and that already puts me ahead of the version of myself before I started working, the one who had no dreams at all.\nNote 1: I use quotation marks because I have a different interpretation. From the perspective of running a company, a certain kind of success may apply — but that doesn\u0026rsquo;t mean the person succeeds in all areas of life. Society tends to equate professional success with being a successful person. I disagree. Gain always comes with loss; what matters is knowing what you truly want to pursue. Learning contentment — that is success.\n","permalink":"https://chenfu.ai/en/posts/%E8%B2%A1%E7%B6%93%E8%A7%80%E9%BB%9E-%E6%88%91%E7%9C%8B%E5%95%86%E5%91%A8/","summary":"\u003cp\u003eSince high school, I used to buy computing magazines like \u003cem\u003ePC DIY\u003c/em\u003e or gaming magazines — always chasing the latest trends: building a PC, playing games. Then, in my fourth year of university, a younger student was reading \u003cem\u003eBusinessWeek\u003c/em\u003e, and I curiously asked why. He said he\u0026rsquo;d been reading it since high school, just out of interest, and that it offered many diverse perspectives. After that, I started buying a copy here and there — partly still following trends, I suppose.\u003c/p\u003e","title":"[Financial Perspective] My Thoughts on BusinessWeek"},{"content":"I haven\u0026rsquo;t felt this way in a long time\u0026hellip; I want to go home. Hide away at home\u0026hellip; And be a willful, rebellious child again\u0026hellip;\n","permalink":"https://chenfu.ai/en/posts/%E5%BF%83%E6%83%85%E9%9A%A8%E7%AD%86-%E7%B7%8A%E7%B9%83/","summary":"\u003cp\u003eI haven\u0026rsquo;t felt this way in a long time\u0026hellip;\nI want to go home. Hide away at home\u0026hellip;\nAnd be a willful, rebellious child again\u0026hellip;\u003c/p\u003e","title":"[Personal Reflections] Tension"},{"content":"I happened to come across this article and wanted to share it with everyone. Source: http://www.drbataipei.org/wisdom/213/wisdom213_4.htm\nWhat is a person\u0026rsquo;s responsibility? It is to contribute and be of service to the entire world — to benefit all people everywhere. This is our true responsibility as human beings.\nToday we come together to discuss: \u0026ldquo;What does a person truly need?\u0026rdquo; and \u0026ldquo;Why do we come into this world? Is it merely to eat, dress, sleep, and enjoy ourselves?\u0026rdquo;\nThese questions seem simple on the surface, but if you really examine them, they become far from simple. What is our work in this world? What is our responsibility? Every person should seek a clear answer. If we live without this clarity, life as a human being loses its meaning and value.\nWe must first learn what it means to fulfill our human duties. Children, when born, only know how to cry and how to eat — they have no concept of what their future responsibilities will be. As time passes, parents send them to school to learn what it means to be a good person, to prepare to fulfill their roles in life.\nIn learning, people develop all kinds of aspirations: some pursue wisdom — to understand the deeper principles of life; some pursue fame and gain; some pursue wealth by any means necessary, disregarding ethics and legality. Some pursue power and leadership. But before you can lead others, you must first know how to be a good person yourself.\nWhat is a person\u0026rsquo;s responsibility? It is to contribute and be of service to the entire world — to benefit all of humanity. Not merely to eat well, dress finely, and live in a luxurious home.\nIf there is a single person in the world without food or clothing, I have not done my full duty — I have not used all my ability and heart to help them. To truly fulfill our responsibility as human beings, we must genuinely benefit others, contribute to the world, serve the people. If everyone holds this intention, the world will surely find peace.\nWe must first set a good example as human beings — not competing with others. Why does the world fall into disorder? Because of competition for power, profit, and fame. If you can give the good things to others, then accept for yourself what others do not want, and quarrel with no one — then world peace becomes possible.\nStart with self-cultivation. Within your own heart, do not fight with yourself — and all delusion and distraction will settle. Peace and stillness — this is true happiness. When you are genuinely peaceful and happy, your presence influences those around you. When everyone lives in harmony, the world need not have war.\nYoung people and old alike — once we understand this principle — will no longer be drawn to gambling, addiction, arson, or violence. To want the world to be good, we must start with ourselves.\nI greatly hope that young people will awaken to this, cultivate a heart of great compassion, and carry the spirit of those who truly served humanity — like Jesus and Buddha and all the great saints — so that even if peace seems distant, it will draw near.\nWhat I have said today, you may think over for yourselves. Whether it is right or wrong, I do not know. I am someone who deeply yearns for world peace — who hopes that all of humanity may be free from suffering. But to realize this ideal, wisdom is what it will take.\n","permalink":"https://chenfu.ai/en/posts/%E6%96%87%E7%AB%A0%E8%BD%89%E8%BC%89-%E4%BA%BA%E5%88%B0%E4%B8%96%E7%95%8C%E4%BE%86%E7%9A%84%E5%B7%A5%E4%BD%9C%E5%92%8C%E8%B2%AC%E4%BB%BB/","summary":"\u003cp\u003e\u003cem\u003eI happened to come across this article and wanted to share it with everyone.\u003c/em\u003e\n\u003cem\u003eSource: \u003ca href=\"http://www.drbataipei.org/wisdom/213/wisdom213_4.htm\"\u003ehttp://www.drbataipei.org/wisdom/213/wisdom213_4.htm\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eWhat is a person\u0026rsquo;s responsibility? It is to contribute and be of service to the entire world — to benefit all people everywhere. This is our true responsibility as human beings.\u003c/p\u003e\n\u003cp\u003eToday we come together to discuss: \u0026ldquo;What does a person truly need?\u0026rdquo; and \u0026ldquo;Why do we come into this world? Is it merely to eat, dress, sleep, and enjoy ourselves?\u0026rdquo;\u003c/p\u003e","title":"[Reprinted] Our Work and Responsibility in This World"},{"content":"Creating a Patch File diff -Naur old-dir-or-file new-dir-or-file \u0026gt; patchfile.patch How to Apply a Patch There are two common ways to apply a patch:\n# Method 1 cat new-patch | patch -p0 # Method 2 patch -p0 \u0026lt; new-patch Understanding the -p (strip) Parameter The -p parameter specifies how many leading directory components to strip from paths in the patch file.\nFor example, if a patch file begins with:\n--- old/modules/network JAN 26 12:11:36 2002 +++ new/modules/network SEP 20 20:07:38 2003 -p0: Start from the current directory and look for the full path old/modules/network -p1: Strip the first directory level (old or new), then look for modules/network from the current directory Patch File Structure Lines beginning with --- and +++ indicate the files to be patched. A single patch file can contain multiple patches — each patch is a separate ---/+++ block. Each block (hunk) represents a section to be modified, typically surrounded by unchanged context lines for location reference. Hunks begin with @@ and end at the start of another hunk or a new patch header. Hunk indentation: + at the start of a line: this line is to be added - at the start of a line: this line is to be deleted ","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-patch-file-in-linux/","summary":"\u003ch2 id=\"creating-a-patch-file\"\u003eCreating a Patch File\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ediff -Naur old-dir-or-file new-dir-or-file \u0026gt; patchfile.patch\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"how-to-apply-a-patch\"\u003eHow to Apply a Patch\u003c/h2\u003e\n\u003cp\u003eThere are two common ways to apply a patch:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# Method 1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecat new-patch | patch -p0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# Method 2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epatch -p0 \u0026lt; new-patch\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"understanding-the--p-strip-parameter\"\u003eUnderstanding the \u003ccode\u003e-p\u003c/code\u003e (strip) Parameter\u003c/h2\u003e\n\u003cp\u003eThe \u003ccode\u003e-p\u003c/code\u003e parameter specifies how many leading directory components to strip from paths in the patch file.\u003c/p\u003e\n\u003cp\u003eFor example, if a patch file begins with:\u003c/p\u003e","title":"[Work Notes] Patch Files in Linux"},{"content":"Registering an ActiveX Component regsvr32 mcscal.ocx Unregistering an ActiveX Component regsvr32 /u mcscal.ocx ","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-%E5%9C%A8windows%E4%B8%8B%E7%99%BB%E9%8C%84activex%E5%85%83%E4%BB%B6%E6%96%B9%E5%BC%8F/","summary":"\u003ch2 id=\"registering-an-activex-component\"\u003eRegistering an ActiveX Component\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-batch\" data-lang=\"batch\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eregsvr32 mcscal.ocx\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"unregistering-an-activex-component\"\u003eUnregistering an ActiveX Component\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-batch\" data-lang=\"batch\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eregsvr32 /u mcscal.ocx\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"[Work Notes] Registering ActiveX Components on Windows"},{"content":"When I see that phrase, I think of the department backpack and T-shirt from university\u0026hellip; \u0026ldquo;Wings\u0026rdquo;\u0026hellip; Sometimes I wonder if I\u0026rsquo;m the odd one out — Not in a remarkable way, but in a quietly peculiar way\u0026hellip;\nIn my long search for certain answers about life, I\u0026rsquo;ve slowly drawn a few conclusions. The outline is still blurry, But a direction is taking shape. Since leaving the military, Coming to Taipei to work and to love, life is no longer as carefree as school days. On the surface, I seem composed, But beneath my behavior there\u0026rsquo;s a quiet uncertainty about the future — an unease I can\u0026rsquo;t quite name.\nBrowsing countless pages online looking for career information, I once came across someone\u0026rsquo;s blog simply titled: I Keep Trying\u0026hellip; I didn\u0026rsquo;t expect that such a simple title would move me so deeply.\nI don\u0026rsquo;t know if I\u0026rsquo;m always trying\u0026hellip; But I always feel like I\u0026rsquo;m not trying hard enough. That thought tears me into fragments. And the human brain is truly terrible at multitasking! The result is I feel like my personality is fracturing\u0026hellip;\nIs forgetfulness a side effect too?\n","permalink":"https://chenfu.ai/en/posts/%E5%BF%83%E6%83%85%E9%9A%A8%E7%AD%86-%E7%95%B0%E9%A1%9E/","summary":"\u003cp\u003eWhen I see that phrase,\nI think of the department backpack and T-shirt from university\u0026hellip; \u0026ldquo;Wings\u0026rdquo;\u0026hellip;\nSometimes I wonder if I\u0026rsquo;m the odd one out —\nNot in a remarkable way, but in a quietly peculiar way\u0026hellip;\u003c/p\u003e\n\u003cp\u003eIn my long search for certain answers about life,\nI\u0026rsquo;ve slowly drawn a few conclusions. The outline is still blurry,\nBut a direction is taking shape. Since leaving the military,\nComing to Taipei to work and to love, life is no longer as carefree as school days.\nOn the surface, I seem composed,\nBut beneath my behavior\nthere\u0026rsquo;s a quiet uncertainty about the future —\nan unease I can\u0026rsquo;t quite name.\u003c/p\u003e","title":"[Personal Reflections] The Odd One Out"},{"content":"An .ocx component is provided by a third party and can be embedded in a webpage. This particular component has limited built-in functionality, so to extend its capabilities, the .ocx file needs to be wrapped in a wrapper function before adding the extra features we need.\nIt\u0026rsquo;s always a bit challenging the first time you do something new. While I have a clear concept of what needs to be done, the tools themselves are quite unfamiliar — Windows application development is an area where I have very little experience.\nI\u0026rsquo;ll spend a few more days on this and write up my findings soon. 😄\n","permalink":"https://chenfu.ai/en/posts/%E5%B7%A5%E4%BD%9C%E9%BB%9E%E6%BB%B4-%E5%B0%87ocx%E5%B5%8C%E5%85%A5%E7%B6%B2%E9%A0%81%E4%B9%8B%E7%8B%80%E6%B3%81%E6%8F%8F%E8%BF%B0/","summary":"\u003cp\u003eAn \u003ccode\u003e.ocx\u003c/code\u003e component is provided by a third party and can be embedded in a webpage. This particular component has limited built-in functionality, so to extend its capabilities, the \u003ccode\u003e.ocx\u003c/code\u003e file needs to be wrapped in a wrapper function before adding the extra features we need.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s always a bit challenging the first time you do something new. While I have a clear concept of what needs to be done, the tools themselves are quite unfamiliar — Windows application development is an area where I have very little experience.\u003c/p\u003e","title":"[Work Notes] Embedding an OCX Component in a Webpage"},{"content":"At thirty, Looking back feels like a dream\u0026hellip; I\u0026rsquo;ve left so little trace. I used to try writing things down, But the enthusiasm lasted only three minutes, And the blog was soon deleted, Everything\u0026hellip; forgotten\u0026hellip; Memories at thirty — Only work remains.\n","permalink":"https://chenfu.ai/en/posts/%E5%BF%83%E6%83%85%E9%9A%A8%E7%AD%86-%E4%B8%89%E5%8D%81%E6%AD%B2%E7%9A%84%E8%A8%98%E6%86%B6/","summary":"\u003cp\u003eAt thirty,\nLooking back feels like a dream\u0026hellip;\nI\u0026rsquo;ve left so little trace.\nI used to try writing things down,\nBut the enthusiasm lasted only three minutes,\nAnd the blog was soon deleted,\nEverything\u0026hellip;\nforgotten\u0026hellip;\nMemories at thirty —\nOnly work remains.\u003c/p\u003e","title":"[Personal Reflections] Memories at Thirty"}]