<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>小惡魔 - AppleBOY</title><link>https://blog.wu-boy.com/</link><description>Recent content on 小惡魔 - AppleBOY</description><generator>Hugo</generator><language>en-us</language><managingEditor>appleboy.tw@gmail.com (Appleboy)</managingEditor><webMaster>appleboy.tw@gmail.com (Appleboy)</webMaster><lastBuildDate>Sun, 19 Apr 2026 23:00:00 +0800</lastBuildDate><atom:link href="https://blog.wu-boy.com/feed.xml" rel="self" type="application/rss+xml"/><item><title>A Kubernetes Login Story for Small Teams: Building an OIDC Identity Gateway with kubelogin + AuthGate on k3s</title><link>https://blog.wu-boy.com/2026/04/kubelogin-authgate-k3s-tutorial-en/</link><pubDate>Sun, 19 Apr 2026 23:00:00 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2026/04/kubelogin-authgate-k3s-tutorial-en/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2026-04-19/cover.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;Most teams meet Kubernetes for the first time through a single &amp;ldquo;superuser&amp;rdquo; kubeconfig — a file with credentials that can wipe out the entire cluster. It then starts bouncing around Slack, email, and laptops, and nobody can say for sure who still has a copy, or whether the kubeconfig belonging to a former employee is still usable.&lt;/p&gt;
&lt;p&gt;This post shows how to use &lt;a href="https://github.com/int128/kubelogin"&gt;kubelogin&lt;/a&gt; together with &lt;a href="https://github.com/go-authgate/authgate"&gt;AuthGate&lt;/a&gt; to stand up an &lt;a href="https://openid.net/specs/openid-connect-core-1_0.html"&gt;OIDC&lt;/a&gt; login flow on &lt;a href="https://k3s.io"&gt;k3s&lt;/a&gt;: the moment a user runs &lt;code&gt;kubectl get pods&lt;/code&gt;, the browser pops open AuthGate&amp;rsquo;s login page, the tokens land back in the kubeconfig, and the entire cluster no longer needs that shared &lt;code&gt;admin.kubeconfig&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>小團隊的 Kubernetes 登入方案：用 kubelogin + AuthGate 打造 OIDC 身份閘道（以 k3s 為例）</title><link>https://blog.wu-boy.com/2026/04/kubelogin-authgate-k3s-tutorial-zh-tw/</link><pubDate>Sun, 19 Apr 2026 10:00:00 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2026/04/kubelogin-authgate-k3s-tutorial-zh-tw/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2026-04-19/cover.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;大部分團隊第一次裝 Kubernetes 時，拿到的都是一個「超級使用者」的 kubeconfig，裡面就躺著一組可以幹掉整個叢集的憑證。於是這份檔案開始在 Slack、Email、筆電之間被複製來複製去，沒有人知道目前誰還留著副本、哪個離職員工的 kubeconfig 還能用。&lt;/p&gt;
&lt;p&gt;這篇文章要示範如何用 &lt;a href="https://github.com/int128/kubelogin"&gt;kubelogin&lt;/a&gt; 搭配 &lt;a href="https://github.com/go-authgate/authgate"&gt;AuthGate&lt;/a&gt;，在 &lt;a href="https://k3s.io"&gt;k3s&lt;/a&gt; 上建立一條 &lt;a href="https://openid.net/specs/openid-connect-core-1_0.html"&gt;OIDC&lt;/a&gt; 登入流程：使用者打 &lt;code&gt;kubectl get pods&lt;/code&gt; 的瞬間，瀏覽器自動跳出 AuthGate 的登入頁面，登入完成 token 寫回 kubeconfig，整個叢集不再需要共用那份 &lt;code&gt;admin.kubeconfig&lt;/code&gt;。&lt;/p&gt;</description></item><item><title>Optimizing Gitea Act Runner Connection Load: Reducing from 1,300 req/s to 170 req/s</title><link>https://blog.wu-boy.com/2026/04/optimize-gitea-act-runner-http-polling/</link><pubDate>Wed, 15 Apr 2026 10:00:00 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2026/04/optimize-gitea-act-runner-http-polling/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2026-04-11/cover.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gitea.com/gitea/act_runner"&gt;Gitea Act Runner&lt;/a&gt; is the execution component of Gitea Actions, responsible for fetching CI/CD tasks from the Gitea Server and reporting execution results. As more teams self-host Gitea, the HTTP request volume between Runners and the Server has become a bottleneck on the Server side. This article documents how we analyzed and resolved this problem, reducing the request volume from approximately 1,300 req/s to approximately 170 req/s for 200 Runners — an 87% reduction.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update (2026-04-20)&lt;/strong&gt;: This article originally described the design after &lt;a href="https://gitea.com/gitea/act_runner/pulls/819"&gt;PR #819&lt;/a&gt; merged. A follow-up, &lt;a href="https://gitea.com/gitea/act_runner/pulls/822"&gt;PR #822&lt;/a&gt;, revealed during code review that #819 had introduced a concurrency regression for Runners with &lt;code&gt;capacity &amp;gt; 1&lt;/code&gt;, and addressed it with a &amp;ldquo;single poller + semaphore&amp;rdquo; architecture. See the new section at the end: &lt;a href="#follow-up-single-poller-with-semaphore-pr-822"&gt;Follow-up: Single Poller with Semaphore (PR #822)&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Gitea Act Runner 連線負載優化：從 1,300 req/s 降到 170 req/s 的實戰紀錄</title><link>https://blog.wu-boy.com/2026/04/optimize-gitea-act-runner-http-polling-zh-tw/</link><pubDate>Sat, 11 Apr 2026 10:00:00 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2026/04/optimize-gitea-act-runner-http-polling-zh-tw/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2026-04-11/cover.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gitea.com/gitea/act_runner"&gt;Gitea Act Runner&lt;/a&gt; 是 Gitea Actions 的執行元件，負責從 Gitea Server 領取 CI/CD 任務並回報執行結果。隨著越來越多團隊自架 Gitea，Runner 與 Server 之間的 HTTP 請求量成為了 Server 端的瓶頸。本文記錄我們如何分析並解決這個問題，將 200 個 Runner 的請求量從約 1,300 req/s 降到約 170 req/s，降幅 87%。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;更新（2026-04-20）&lt;/strong&gt;：本文原本描述 &lt;a href="https://gitea.com/gitea/act_runner/pulls/819"&gt;PR #819&lt;/a&gt; 合併後的設計。後續 &lt;a href="https://gitea.com/gitea/act_runner/pulls/822"&gt;PR #822&lt;/a&gt; 在 code review 中揭露 #819 對 &lt;code&gt;capacity &amp;gt; 1&lt;/code&gt; 的 Runner 引入了一個 concurrency regression，並用「單一 poller + semaphore」架構再次修正。請見文末〈&lt;a href="#%E5%BE%8C%E7%BA%8C%E4%BF%AE%E6%AD%A3single-poller-with-semaphorepr-822"&gt;後續修正：Single Poller with Semaphore（PR #822）&lt;/a&gt;〉章節。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>The Next Step for AI Agents: API + CLI + Skills Architecture</title><link>https://blog.wu-boy.com/2026/04/api-cli-skills-architecture-for-ai-agents-en/</link><pubDate>Mon, 06 Apr 2026 10:20:00 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2026/04/api-cli-skills-architecture-for-ai-agents-en/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2026-04-06/cover.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;In previous posts, I introduced the &lt;a href="https://blog.wu-boy.com/2026/03/what-is-agent-skill-and-impact-on-software-industry-en/"&gt;concept of Agent Skills&lt;/a&gt; and showed &lt;a href="https://blog.wu-boy.com/2026/03/ai-driven-development-with-claude-code-and-github-copilot-review-en/"&gt;how to build an AI-driven development workflow with Claude Code + GitHub Copilot Review&lt;/a&gt;. As more products and teams embrace AI Agents, a clear architectural pattern is emerging: &lt;strong&gt;API + CLI + Skills&lt;/strong&gt;. This isn&amp;rsquo;t a framework or protocol — it&amp;rsquo;s a pragmatic three-layer architecture that enables any product to become &amp;ldquo;agent-friendly&amp;rdquo; quickly.&lt;/p&gt;</description></item><item><title>AI Agent 的下一步：API + CLI + Skills 架構</title><link>https://blog.wu-boy.com/2026/04/api-cli-skills-architecture-for-ai-agents-zh-tw/</link><pubDate>Mon, 06 Apr 2026 10:00:00 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2026/04/api-cli-skills-architecture-for-ai-agents-zh-tw/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2026-04-06/cover.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;在之前的文章中，我分別介紹了 &lt;a href="https://blog.wu-boy.com/2026/03/what-is-agent-skill-and-impact-on-software-industry-zh-tw/"&gt;Agent Skill 的概念&lt;/a&gt;以及&lt;a href="https://blog.wu-boy.com/2026/03/ai-driven-development-with-claude-code-and-github-copilot-review-zh-tw/"&gt;如何用 Claude Code + GitHub Copilot Review 打造 AI 驅動的開發流程&lt;/a&gt;。隨著越來越多產品和團隊開始擁抱 AI Agent，一個清晰的架構模式正在浮現：&lt;strong&gt;API + CLI + Skills&lt;/strong&gt;。這不是某個框架或協議，而是一種務實的三層架構，讓任何產品都能快速變得「對 Agent 友善」。&lt;/p&gt;</description></item><item><title>Building an AI-Driven Development Workflow with Claude Code + GitHub Copilot Review</title><link>https://blog.wu-boy.com/2026/03/ai-driven-development-with-claude-code-and-github-copilot-review-en/</link><pubDate>Sat, 21 Mar 2026 10:00:00 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2026/03/ai-driven-development-with-claude-code-and-github-copilot-review-en/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2026-03-21/cover.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;As a developer who maintains multiple open-source projects on &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;, my daily work goes far beyond writing code. I also deal with a constant stream of issues, PR reviews, releases, and other tasks that are tedious but critical. As projects grow, this workload quickly exceeds what one person can handle efficiently.&lt;/p&gt;
&lt;p&gt;Over the past few months, I&amp;rsquo;ve integrated &lt;a href="https://docs.anthropic.com/en/docs/claude-code"&gt;Claude Code&lt;/a&gt; and &lt;a href="https://docs.github.com/en/copilot/how-tos/use-copilot-agents/request-a-code-review/use-code-review"&gt;GitHub Copilot Review&lt;/a&gt; into my daily development workflow, and the results have been remarkable — tasks that used to take half a day now often get done in 1-2 hours. This post shares my complete workflow and explains why I believe &lt;strong&gt;the developer&amp;rsquo;s own technical ability is the key to using AI tools effectively&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>用 Claude Code + GitHub Copilot Review 打造 AI 驅動的開發流程</title><link>https://blog.wu-boy.com/2026/03/ai-driven-development-with-claude-code-and-github-copilot-review-zh-tw/</link><pubDate>Sat, 21 Mar 2026 10:00:00 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2026/03/ai-driven-development-with-claude-code-and-github-copilot-review-zh-tw/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2026-03-21/cover.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;身為一個在 &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt; 上長期維護多個開源專案的開發者，我每天面對的不只是寫程式，還有大量的 Issue 處理、PR Review、版本發佈等瑣碎但重要的工作。隨著專案規模成長，這些工作量已經遠超一個人能高效處理的範圍。&lt;/p&gt;
&lt;p&gt;過去一段時間，我開始將 &lt;a href="https://docs.anthropic.com/en/docs/claude-code"&gt;Claude Code&lt;/a&gt; 和 &lt;a href="https://docs.github.com/en/copilot/how-tos/use-copilot-agents/request-a-code-review/use-code-review"&gt;GitHub Copilot Review&lt;/a&gt; 整合進我的日常開發流程，結果讓我非常驚艷——原本需要半天的工作，現在經常在 1-2 小時內就能完成。這篇文章將分享我的完整流程，以及為什麼我認為&lt;strong&gt;開發者本身的技術能力，才是善用 AI 工具的關鍵&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>Agent Skill 是什麼？對軟體產業帶來的變化</title><link>https://blog.wu-boy.com/2026/03/what-is-agent-skill-and-impact-on-software-industry-zh-tw/</link><pubDate>Sat, 14 Mar 2026 11:00:00 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2026/03/what-is-agent-skill-and-impact-on-software-industry-zh-tw/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2026-03-14/cover.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;隨著 AI Agent 技術的快速發展，一個全新的概念正在改變軟體開發的工作方式：&lt;strong&gt;Agent Skill（代理技能）&lt;/strong&gt;。如果你有使用過 &lt;a href="https://docs.anthropic.com/en/docs/claude-code"&gt;Claude Code&lt;/a&gt;、&lt;a href="https://www.cursor.com/"&gt;Cursor&lt;/a&gt; 或其他 AI 輔助開發工具，可能已經接觸過類似的概念。本篇文章將深入介紹什麼是 Agent Skill，以及它如何對軟體產業帶來根本性的變化。&lt;/p&gt;</description></item><item><title>What Is Agent Skill? How It Changes the Software Industry</title><link>https://blog.wu-boy.com/2026/03/what-is-agent-skill-and-impact-on-software-industry-en/</link><pubDate>Sat, 14 Mar 2026 10:00:00 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2026/03/what-is-agent-skill-and-impact-on-software-industry-en/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2026-03-14/cover.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;With the rapid evolution of AI Agent technology, a new concept is reshaping how software development works: &lt;strong&gt;Agent Skill&lt;/strong&gt;. If you&amp;rsquo;ve used &lt;a href="https://docs.anthropic.com/en/docs/claude-code"&gt;Claude Code&lt;/a&gt;, &lt;a href="https://www.cursor.com/"&gt;Cursor&lt;/a&gt;, or other AI-assisted development tools, you may have already encountered something similar. This article takes a deep dive into what Agent Skill is and how it brings fundamental changes to the software industry.&lt;/p&gt;</description></item><item><title>Introduction to OAuth Client ID Metadata Document</title><link>https://blog.wu-boy.com/2026/02/oauth-client-id-metadata-document/</link><pubDate>Tue, 17 Feb 2026 11:52:21 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2026/02/oauth-client-id-metadata-document/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2026-02-17/cover_1000x558.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;In 2025, I introduced MCP (&lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro"&gt;Model Context Protocol&lt;/a&gt;) at the iThome &lt;a href="https://cloudsummit.ithome.com.tw/2025/"&gt;Taiwan Cloud Summit&lt;/a&gt;. At that time, I mentioned that the official team has been continuously revising the authentication protocol to address complex authentication flows. The previous design involved DCR (&lt;a href="https://datatracker.ietf.org/doc/html/rfc7591"&gt;Dynamic Client Registration&lt;/a&gt;), so as expected, on 2025/11/25, a new &lt;a href="https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization"&gt;Authorization mechanism&lt;/a&gt; was released. This authentication mechanism is called &amp;ldquo;&lt;a href="https://datatracker.ietf.org/doc/draft-ietf-oauth-client-id-metadata-document/"&gt;Client ID Metadata Documents, abbreviated as CIMD&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;When installing a Model Context Protocol (MCP) server, the most challenging part is often not the protocol itself, but how to establish trust between the client and server. If you&amp;rsquo;ve ever tried to connect an MCP client to an MCP server it has never encountered before, you&amp;rsquo;ve probably run into what&amp;rsquo;s known as the &amp;ldquo;registration wall&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Pre-registering with every possible authorization server is simply not scalable, and while Dynamic Client Registration (DCR) helps, it lacks reliable mechanisms to verify client identity, making it vulnerable to phishing attacks. Beyond security concerns, DCR also creates operational overhead by generating an ever-growing number of duplicate client identities that need to be managed.&lt;/p&gt;</description></item><item><title>OAuth Client ID Metadata Document 簡介</title><link>https://blog.wu-boy.com/2026/02/oauth-client-id-metadata-document-zh-tw/</link><pubDate>Tue, 17 Feb 2026 09:52:21 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2026/02/oauth-client-id-metadata-document-zh-tw/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2026-02-17/cover_1000x558.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;2025 年在 iThome &lt;a href="https://cloudsummit.ithome.com.tw/2025/"&gt;臺灣雲端大會&lt;/a&gt;介紹過 MCP (&lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro"&gt;Model Context Protocol&lt;/a&gt;)，那時候就有提到在認證協議部分，官方其實一直都在改版解決複雜的認證流程，之前設計的 DCR (&lt;a href="https://datatracker.ietf.org/doc/html/rfc7591"&gt;Dynamic Client Registration&lt;/a&gt;)，所以沒意外去年 2025/11/25 又推出一版 &lt;a href="https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization"&gt;Authorization 機制&lt;/a&gt;，此認證機制取名叫『&lt;a href="https://datatracker.ietf.org/doc/draft-ietf-oauth-client-id-metadata-document/"&gt;Client ID Metadata Documents 簡稱 CIMD&lt;/a&gt;』。&lt;/p&gt;
&lt;p&gt;安裝 Model Context Protocol（MCP）伺服器時，最棘手的部分往往不是協議本身，而是如何讓客戶端與伺服器彼此建立信任。如果你曾嘗試讓一個 MCP 客戶端連線到一個從未接觸過的 MCP 伺服器，你大概遇過所謂的「註冊高牆（registration wall）」。&lt;/p&gt;
&lt;p&gt;要預先在每一個可能的授權伺服器完成註冊根本無法擴展，而 Dynamic Client Registration（DCR）雖然有所幫助，但因為缺乏可靠的機制來驗證客戶端身份，所以容易遭受網路釣魚攻擊。除了安全性問題之外，DCR 還會造成營運負擔，因為它會產生越來越多需要管理的重複客戶端身份。&lt;/p&gt;</description></item><item><title>Why Our Team Migrated from Bitbucket Data Center to Gitea Enterprise</title><link>https://blog.wu-boy.com/2026/02/why-we-migrated-from-bitbucket-dc-to-gitea-en/</link><pubDate>Mon, 16 Feb 2026 11:41:55 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2026/02/why-we-migrated-from-bitbucket-dc-to-gitea-en/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2026-02-16/blog-cover_800x447.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;In the software development field, most people are no strangers to &lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;—the world’s most popular version control system and a foundational tool for modern collaborative development. And when we talk about Git, we can’t help but think of &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;, the largest and most well-known open-source software platform today.&lt;/p&gt;
&lt;p&gt;However, for many private companies or small to mid-sized teams, GitHub may not be an option due to security, cost, deployment strategies, or regulatory requirements. In such cases, what tools can serve as an internal Git repository platform? The most common choices include &lt;a href="https://about.gitlab.com/"&gt;GitLab&lt;/a&gt; and &lt;a href="https://about.gitea.com/"&gt;Gitea&lt;/a&gt;, which is the focus of this article.&lt;/p&gt;
&lt;p&gt;For some teams, Gitea might still be relatively unfamiliar. Simply put, &lt;strong&gt;Gitea is a lightweight, self-hosted Git platform written in Go&lt;/strong&gt;, providing GitHub-like capabilities such as code hosting, permission management, Issues and Pull Requests, and CI/CD. You can find a more comprehensive explanation in the official documentation (&lt;a href="https://docs.gitea.com/"&gt;Gitea Documentation&lt;/a&gt;). It’s cross-platform, easy to deploy, and low-maintenance, which is why it has been increasingly favored by small and medium-sized teams.&lt;/p&gt;
&lt;p&gt;The main purpose of this article is to share why our team ultimately decided to migrate from &lt;a href="https://www.atlassian.com/enterprise/data-center/bitbucket"&gt;Bitbucket Data Center&lt;/a&gt; to Gitea—and why we didn’t choose a more feature-rich but comparatively heavier open-source solution like GitLab.&lt;/p&gt;</description></item><item><title>為什麼團隊從 Bitbucket Data Center 版本轉向 Gitea 企業版</title><link>https://blog.wu-boy.com/2026/02/why-we-migrated-from-bitbucket-dc-to-gitea-zh-tw/</link><pubDate>Mon, 16 Feb 2026 10:33:55 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2026/02/why-we-migrated-from-bitbucket-dc-to-gitea-zh-tw/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2026-02-16/blog-cover_800x447.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;相信在軟體開發領域，大家對 &lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt; 應該都不陌生——這套全球最受歡迎的版本控制系統已成為現代協作開發的基礎工具。而提到 Git，就不得不想到目前全球最大且最知名的開源軟體平台 &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;但在許多私人企業或中小型團隊中，如果因為安全性、成本、部署策略或法規需求等原因，而不能直接採用 GitHub，那麼有哪些工具可以作為企業內部的 Git 版本庫平台呢？最常見的選擇包含 &lt;a href="https://about.gitlab.com/"&gt;GitLab&lt;/a&gt; 以及本篇將深入探討的 &lt;a href="https://about.gitea.com/"&gt;Gitea&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;對部分團隊而言，Gitea 可能還相對陌生。簡單來說，&lt;strong&gt;Gitea 是一套以 Go 語言打造的極輕量、自架型 Git 平台&lt;/strong&gt;，提供與 GitHub 類似的功能，例如程式碼託管、權限管理、Issue 與 Pull Request、CI/CD 等能力。 你也可以在官方文件中看到更完整說明（&lt;a href="https://docs.gitea.com/"&gt;Gitea Documentation&lt;/a&gt;）。它跨平台、容易部署，且維護成本低，因此逐漸受到中小型團隊青睞。&lt;/p&gt;
&lt;p&gt;本篇文章的主軸，就是要和大家分享： 為什麼我們團隊最終選擇從 &lt;a href="https://www.atlassian.com/enterprise/data-center/bitbucket"&gt;Bitbucket Data Center&lt;/a&gt; 遷移到 Gitea？又為什麼沒有選擇 GitLab 這類功能更完整、但相對較為沉重的開源方案？&lt;/p&gt;</description></item><item><title>Building AI-Powered GitHub Workflows: A Complete Guide to LLM Action</title><link>https://blog.wu-boy.com/2025/12/building-ai-powered-github-workflows-with-llm-action-en/</link><pubDate>Tue, 09 Dec 2025 14:55:47 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2025/12/building-ai-powered-github-workflows-with-llm-action-en/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2025-12-09/blog_cover_1024x572_en.png" alt="blog cover"&gt;&lt;/p&gt;
&lt;p&gt;In the AI era, integrating Large Language Models into CI/CD pipelines has become crucial for improving development efficiency. However, existing solutions are often tied to specific service providers, and LLM outputs are typically unstructured free-form text that is difficult to parse and use reliably in automated workflows. &lt;a href="https://github.com/appleboy/LLM-action"&gt;LLM Action&lt;/a&gt; was created to solve these pain points.&lt;/p&gt;
&lt;p&gt;The core feature is support for &lt;a href="https://platform.openai.com/docs/guides/function-calling"&gt;Tool Schema&lt;/a&gt; structured output—you can predefine a JSON Schema to force LLM responses to conform to a specified format. This means AI no longer just returns a block of text, but produces predictable, parseable structured data. Each field is automatically converted into GitHub Actions output variables, allowing subsequent steps to use them directly without additional string parsing or regex processing. This completely solves the problem of unstable LLM output that is difficult to integrate into automated workflows.&lt;/p&gt;
&lt;p&gt;Additionally, LLM Action provides a unified interface to connect to any OpenAI-compatible service, whether it&amp;rsquo;s cloud-based OpenAI, Azure OpenAI, or locally deployed self-hosted solutions like Ollama, LocalAI, LM Studio, or vLLM—all can be seamlessly switched.&lt;/p&gt;
&lt;p&gt;Practical use cases include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automated Code Review: Define a Schema to output fields like &lt;code&gt;score&lt;/code&gt;, &lt;code&gt;issues&lt;/code&gt;, &lt;code&gt;suggestions&lt;/code&gt;, directly used to determine whether the review passes&lt;/li&gt;
&lt;li&gt;PR Summary Generation: Structured output of &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;summary&lt;/code&gt;, &lt;code&gt;breaking_changes&lt;/code&gt; for automatic PR description updates&lt;/li&gt;
&lt;li&gt;Issue Classification: Output &lt;code&gt;category&lt;/code&gt;, &lt;code&gt;priority&lt;/code&gt;, &lt;code&gt;labels&lt;/code&gt; to automatically tag Issues&lt;/li&gt;
&lt;li&gt;Release Notes: Generate arrays of &lt;code&gt;features&lt;/code&gt;, &lt;code&gt;bugfixes&lt;/code&gt;, &lt;code&gt;breaking&lt;/code&gt; to automatically compose formatted release notes&lt;/li&gt;
&lt;li&gt;Multi-language Translation: Batch output multiple language fields, completing multi-language translation in a single API call&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Through Schema definition, LLM Action transforms AI output from &amp;ldquo;unpredictable text&amp;rdquo; to &amp;ldquo;programmable data,&amp;rdquo; truly enabling end-to-end AI automated workflows.&lt;/p&gt;</description></item><item><title>打造 AI 驅動的 GitHub 工作流程：LLM Action 完整指南</title><link>https://blog.wu-boy.com/2025/12/building-ai-powered-github-workflows-with-llm-action-zh-tw/</link><pubDate>Tue, 09 Dec 2025 14:51:47 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2025/12/building-ai-powered-github-workflows-with-llm-action-zh-tw/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2025-12-09/blog_cover_1024x572_tw.png" alt="blog cover"&gt;&lt;/p&gt;
&lt;p&gt;在 AI 時代，將大型語言模型整合進 CI/CD 流程已成為提升開發效率的關鍵。然而，現有的解決方案往往綁定特定服務商，且 LLM 的輸出通常是非結構化的自由文字，難以在自動化流程中可靠地解析與使用。&lt;a href="https://github.com/appleboy/LLM-action"&gt;LLM Action&lt;/a&gt; 的誕生正是為了解決這些痛點。&lt;/p&gt;
&lt;p&gt;最核心的特色是支援 &lt;a href="https://platform.openai.com/docs/guides/function-calling"&gt;Tool Schema&lt;/a&gt; 結構化輸出——你可以預先定義 JSON Schema，讓 LLM 的回應強制符合指定格式。這意味著 AI
不再只是回傳一段文字，而是產出可預測、可解析的結構化資料，每個欄位都會自動轉換為 GitHub Actions
的輸出變數，讓後續步驟能直接取用，無需額外的字串解析或正則表達式處理。這徹底解決了 LLM 輸出不穩定、難以整合進自動化流程的問題。&lt;/p&gt;
&lt;p&gt;此外，LLM Action 提供統一介面串接任何 OpenAI 相容的服務，無論是雲端的 OpenAI、Azure OpenAI，還是本地部署的 Ollama、LocalAI、LM Studio、vLLM
等自託管方案，都能無縫切換。&lt;/p&gt;
&lt;p&gt;實際應用場景包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自動化 Code Review：定義 Schema 輸出 &lt;code&gt;score&lt;/code&gt;、&lt;code&gt;issues&lt;/code&gt;、&lt;code&gt;suggestions&lt;/code&gt; 等欄位，直接用於判斷是否通過審查&lt;/li&gt;
&lt;li&gt;PR 摘要生成：結構化輸出 &lt;code&gt;title&lt;/code&gt;、&lt;code&gt;summary&lt;/code&gt;、&lt;code&gt;breaking_changes&lt;/code&gt; 供後續自動更新 PR 描述&lt;/li&gt;
&lt;li&gt;Issue 分類：輸出 &lt;code&gt;category&lt;/code&gt;、&lt;code&gt;priority&lt;/code&gt;、&lt;code&gt;labels&lt;/code&gt; 自動為 Issue 加上標籤&lt;/li&gt;
&lt;li&gt;Release Notes：產出 &lt;code&gt;features&lt;/code&gt;、&lt;code&gt;bugfixes&lt;/code&gt;、&lt;code&gt;breaking&lt;/code&gt; 陣列，自動組成格式化的發布說明&lt;/li&gt;
&lt;li&gt;多語言翻譯：批次輸出多個語言欄位，一次 API 呼叫完成多語系翻譯&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;透過 Schema 定義，LLM Action 讓 AI 輸出從「不可預測的文字」變成「可程式化的資料」，真正實現端到端的 AI 自動化工作流程。&lt;/p&gt;</description></item><item><title>From Natural Language to K8s Operations: The MCP Architecture and Practice of kubectl-ai</title><link>https://blog.wu-boy.com/2025/10/from-natural-language-to-k8s-operations-the-mcp-architecture-and-practice-of-kubectl-ai-en/</link><pubDate>Sat, 25 Oct 2025 10:54:53 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2025/10/from-natural-language-to-k8s-operations-the-mcp-architecture-and-practice-of-kubectl-ai-en/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2025-10-25/blog-cover_1024x983.png" alt="blog cover"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/GoogleCloudPlatform/kubectl-ai"&gt;kubectl-ai&lt;/a&gt; is a revolutionary open-source project that seamlessly integrates Large Language Models (LLMs) with &lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt; operations, enabling users to interact intelligently with K8s clusters using natural language. This article explores how this innovative technology addresses the pain points of traditional &lt;a href="https://kubernetes.io/docs/reference/kubectl/"&gt;kubectl&lt;/a&gt; command complexity and significantly lowers the barrier to entry for Kubernetes users.&lt;/p&gt;</description></item><item><title>從自然語言到 K8s 操作：kubectl-ai 的 MCP 架構與實踐</title><link>https://blog.wu-boy.com/2025/10/from-natural-language-to-k8s-operations-the-mcp-architecture-and-practice-of-kubectl-ai-zh-tw/</link><pubDate>Sat, 25 Oct 2025 09:53:53 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2025/10/from-natural-language-to-k8s-operations-the-mcp-architecture-and-practice-of-kubectl-ai-zh-tw/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2025-10-25/blog-cover_1024x983.png" alt="blog cover"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/GoogleCloudPlatform/kubectl-ai"&gt;kubectl-ai&lt;/a&gt; 是一個革命性的開源專案，將大型語言模型與 &lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt; 運維完美結合，讓用戶能夠透過自然語言與 K8s 集群進行智能交互。本文將深入探討這項創新技術如何解決傳統 &lt;a href="https://kubernetes.io/docs/reference/kubectl/"&gt;kubectl&lt;/a&gt; 命令複雜性的痛點，大幅降低 Kubernetes 的使用門檻。&lt;/p&gt;</description></item><item><title>Building a Unified API Gateway for Cross-Cloud AI Services: A Secure and Scalable Enterprise Solution</title><link>https://blog.wu-boy.com/2025/07/building-a-unified-api-gateway-en/</link><pubDate>Sun, 13 Jul 2025 09:00:00 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2025/07/building-a-unified-api-gateway-en/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2025-07-13/IMG_6694_1024x683.JPG" alt="blog logo"&gt;&lt;/p&gt;
&lt;p&gt;In today&amp;rsquo;s enterprise environment, Generative AI technology has become key to enhancing business efficiency and innovation. However, with the diversification and decentralization of AI services, how to uniformly manage and call these services has become a challenge. This article will introduce how to use &lt;a href="https://go.dev/"&gt;Golang&lt;/a&gt; to develop a &lt;a href="https://cloudsummit.ithome.com.tw/2025/session-page/3684"&gt;unified API Gateway for cross-cloud AI services&lt;/a&gt;, achieving a secure and scalable enterprise-level solution.&lt;/p&gt;
&lt;p&gt;This was my second &lt;a href="https://cloudsummit.ithome.com.tw/2025/session-page/3684"&gt;public talk&lt;/a&gt; at the 2025 &lt;a href="https://cloudsummit.ithome.com.tw/2025/"&gt;iThome CloudSummit Taiwan&lt;/a&gt;. Below is the outline of the talk.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Authentication and Authorization&lt;/li&gt;
&lt;li&gt;Multi-Cloud AI Backend Integration (&lt;a href="https://azure.microsoft.com/en-us/products/ai-services/openai-service"&gt;Azure OpenAI&lt;/a&gt;, &lt;a href="https://aws.amazon.com/bedrock/"&gt;AWS Bedrock&lt;/a&gt;, &lt;a href="https://cloud.google.com/products/gemini"&gt;Google Gemini AI&lt;/a&gt;, etc.)&lt;/li&gt;
&lt;li&gt;Traffic Control and Resource Management&lt;/li&gt;
&lt;li&gt;Monitoring and Metrics Aggregation&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>跨雲端 AI 服務統一 API Gateway：安全、可擴展的企業級解決方案</title><link>https://blog.wu-boy.com/2025/07/building-a-unified-api-gateway-zh-tw/</link><pubDate>Sun, 13 Jul 2025 08:29:00 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2025/07/building-a-unified-api-gateway-zh-tw/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2025-07-13/IMG_6694_1024x683.JPG" alt="blog logo"&gt;&lt;/p&gt;
&lt;p&gt;在當今的企業環境中，Generative AI 技術已經成為提升業務效率和創新能力的關鍵。然而，隨著 AI 服務的多樣化和分散化，如何統一管理和調用這些服務成為了一個挑戰。本文將介紹如何使用 &lt;a href="https://go.dev/"&gt;Golang&lt;/a&gt; 開發一個&lt;a href="https://cloudsummit.ithome.com.tw/2025/session-page/3684"&gt;跨雲端 AI 服務的統一 API Gateway&lt;/a&gt;，實現安全、可擴展的企業級解決方案。&lt;/p&gt;
&lt;p&gt;這是我在 2025 年 &lt;a href="https://cloudsummit.ithome.com.tw/2025/"&gt;iThome 臺灣雲端大會&lt;/a&gt; (CloudSummit) 的第二場&lt;a href="https://cloudsummit.ithome.com.tw/2025/session-page/3684"&gt;公開演講&lt;/a&gt;，底下是演講的內容大綱。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;身份驗證與授權&lt;/li&gt;
&lt;li&gt;多雲人工智慧後端整合 ( &lt;a href="https://azure.microsoft.com/en-us/products/ai-services/openai-service"&gt;Azure OpenAI&lt;/a&gt;、&lt;a href="https://aws.amazon.com/bedrock/"&gt;AWS Bedrock&lt;/a&gt;、&lt;a href="https://cloud.google.com/products/gemini"&gt;Google Gemini AI&lt;/a&gt; &amp;hellip;. )&lt;/li&gt;
&lt;li&gt;流量控制與資源管理&lt;/li&gt;
&lt;li&gt;監控與指標聚合&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Step-by-Step Guide to Building MCP Server and Client with Golang (Model Context Protocol)</title><link>https://blog.wu-boy.com/2025/07/step-by-step-golang-mcp-server-client-en/</link><pubDate>Tue, 08 Jul 2025 15:42:58 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2025/07/step-by-step-golang-mcp-server-client-en/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2025-07-03/mcp-golang_1024x592.png" alt="blog logo"&gt;&lt;/p&gt;
&lt;p&gt;In 2025, I delivered a workshop at the &lt;a href="https://cloudsummit.ithome.com.tw/2025/"&gt;iThome Taiwan Cloud Summit&lt;/a&gt; in Taipei, titled &amp;ldquo;&lt;strong&gt;Step-by-Step Guide to Building MCP Server and Client with &lt;a href="https://go.dev/"&gt;Golang&lt;/a&gt;&lt;/strong&gt; (&lt;a href="https://modelcontextprotocol.io/introduction"&gt;Model Context Protocol&lt;/a&gt;)&amp;rdquo;. The goal of this workshop was to help developers understand how to implement the MCP protocol using Golang, providing practical code examples and hands-on guidance. I have organized all workshop materials into a GitHub repository, which you can find at &lt;a href="https://github.com/go-training/mcp-workshop"&gt;go-training/mcp-workshop&lt;/a&gt;. For detailed workshop content, please &lt;a href="https://cloudsummit.ithome.com.tw/2025/lab-page/3721"&gt;refer to this link&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>一步步學會用 Golang 開發 MCP 伺服器與客戶端 (Model Context Protocol)</title><link>https://blog.wu-boy.com/2025/07/step-by-step-golang-mcp-server-client-zh-tw/</link><pubDate>Tue, 08 Jul 2025 10:42:58 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2025/07/step-by-step-golang-mcp-server-client-zh-tw/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2025-07-03/mcp-golang_1024x592.png" alt="blog logo"&gt;&lt;/p&gt;
&lt;p&gt;2025 年在台北 &lt;a href="https://cloudsummit.ithome.com.tw/2025/"&gt;iThome 臺灣雲端大會&lt;/a&gt; (CloudSummit) 給一場 Workshop，主題是「&lt;strong&gt;一步步學會用 &lt;a href="https://go.dev/"&gt;Golang&lt;/a&gt; 開發 MCP 伺服器與客戶端&lt;/strong&gt; (&lt;a href="https://modelcontextprotocol.io/introduction"&gt;Model Context Protocol&lt;/a&gt;)」。這次的工作坊旨在幫助開發者了解如何使用 Golang 實現 MCP 協議，並提供實際的程式碼範例和操作指南。我已經先將 Workshop 的內容整理成一個 GitHub Repo，您可以在 &lt;a href="https://github.com/go-training/mcp-workshop"&gt;go-training/mcp-workshop&lt;/a&gt; 找到相關資源。詳細 Workshop 內容，請&lt;a href="https://cloudsummit.ithome.com.tw/2025/lab-page/3721"&gt;參考此連結&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>Integrating Gitea with Jira Software Development Workflow</title><link>https://blog.wu-boy.com/2025/03/gitea-integrate-with-jira-issue-tracking-flow-en/</link><pubDate>Sat, 15 Mar 2025 12:22:24 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2025/03/gitea-integrate-with-jira-issue-tracking-flow-en/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2025-03-15/blog-logo_800x793.png" alt="blog logo"&gt;&lt;/p&gt;
&lt;p&gt;Before diving in, let&amp;rsquo;s familiarize ourselves with &lt;a href="https://about.gitea.com/"&gt;Gitea&lt;/a&gt; and &lt;a href="https://www.atlassian.com/software/jira"&gt;Jira&lt;/a&gt;. For better context, I recommend reading &amp;ldquo;&lt;a href="https://blog.wu-boy.com/2025/01/git-software-development-guide-key-to-improving-team-collaboration-en/"&gt;Git Software Development Guide: Key to Improving Team Collaboration&lt;/a&gt;&amp;rdquo; first.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://about.gitea.com/"&gt;Gitea&lt;/a&gt; is a lightweight self-hosted Git server written in Go, providing teams with an easily deployable code management solution. It supports multiple operating systems including Linux, Windows, and macOS, while offering comprehensive features for code review, issue tracking, and Wiki management—all essential tools for enhancing team collaboration.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.atlassian.com/software/jira"&gt;Jira&lt;/a&gt; is Atlassian&amp;rsquo;s professional project management and issue tracking system. Widely adopted by software development teams worldwide, Jira excels in issue tracking, supports agile methodologies (including Scrum and Kanban), and provides robust data analytics capabilities to optimize project management and team collaboration.&lt;/p&gt;</description></item><item><title>Gitea 與 Jira 軟體開發流程整合</title><link>https://blog.wu-boy.com/2025/03/gitea-integrate-with-jira-issue-tracking-flow-zh-tw/</link><pubDate>Sat, 15 Mar 2025 08:42:24 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2025/03/gitea-integrate-with-jira-issue-tracking-flow-zh-tw/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2025-03-15/blog-logo_800x793.png" alt="blog logo"&gt;&lt;/p&gt;
&lt;p&gt;在開始本文前，讓我們先來了解 &lt;a href="https://about.gitea.com/"&gt;Gitea&lt;/a&gt; 和 &lt;a href="https://www.atlassian.com/software/jira"&gt;Jira&lt;/a&gt; 這兩個工具。建議您可以先閱讀『&lt;a href="https://blog.wu-boy.com/2025/01/git-software-development-guide-key-to-improving-team-collaboration-zh-tw/"&gt;Git 軟體開發指南：提高團隊協作的關鍵&lt;/a&gt;』，以更好地理解後續內容。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://about.gitea.com/"&gt;Gitea&lt;/a&gt; 是一套以 Go 語言開發的輕量級自架式 Git 伺服器，為團隊提供了便於部署的程式碼管理方案。系統除了支援 Linux、Windows 和 macOS 等多種作業系統外，還具備完善的程式碼審查、問題追蹤和 Wiki 等功能，能大幅提升團隊的協作開發效率。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.atlassian.com/software/jira"&gt;Jira&lt;/a&gt; 是 Atlassian 公司開發的專業級專案管理與問題追蹤系統。作為軟體開發團隊廣泛採用的工具，Jira 不僅提供完整的問題追蹤功能，還支援敏捷開發流程（如 Scrum 和 Kanban）以及豐富的數據分析功能，有效協助團隊管理專案進度並提升協作品質。&lt;/p&gt;</description></item><item><title>Git Software Development Guidelines: Improving Team Collaboration</title><link>https://blog.wu-boy.com/2025/01/git-software-development-guide-key-to-improving-team-collaboration-en/</link><pubDate>Sat, 04 Jan 2025 10:04:38 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2025/01/git-software-development-guide-key-to-improving-team-collaboration-en/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Git"&gt;Git&lt;/a&gt; is a powerful distributed version control system created by &lt;a href="https://en.wikipedia.org/wiki/Linus_Torvalds"&gt;Linus Torvalds&lt;/a&gt;, initially designed for managing the Linux kernel source code. Its exceptional features include lightning-fast processing, robust data integrity, seamless support for non-linear development through branching, and sophisticated branch management capabilities. These characteristics make Git an essential tool in modern software development. While mastering basic Git operations is important, understanding its workflow is crucial for achieving optimal team collaboration. This article presents comprehensive Git software development guidelines to enhance team productivity.&lt;/p&gt;
&lt;p&gt;As development teams expand, Git workflows naturally become more intricate. To maintain smooth collaboration, implementing well-structured Git development guidelines becomes essential. These guidelines help regulate team members&amp;rsquo; actions, ensuring code repository stability and maintainability. When properly followed, they not only expedite development cycles but also minimize errors and enhance overall code quality.&lt;/p&gt;
&lt;h2 id="git-software-development-workflow"&gt;Git Software Development Workflow&lt;/h2&gt;
&lt;p&gt;The following diagram illustrates a streamlined Git development workflow that demonstrates effective team collaboration:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2025-01-04/git-flow.png" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;While this workflow may not suit all teams, it serves as a reference that can be adjusted according to specific circumstances. Let&amp;rsquo;s explore some Git software development guidelines that help improve team collaboration efficiency.&lt;/p&gt;</description></item><item><title>Git 軟體開發指南：提高團隊協作的關鍵</title><link>https://blog.wu-boy.com/2025/01/git-software-development-guide-key-to-improving-team-collaboration-zh-tw/</link><pubDate>Sat, 04 Jan 2025 09:04:38 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2025/01/git-software-development-guide-key-to-improving-team-collaboration-zh-tw/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Git"&gt;Git&lt;/a&gt; 是一套分散式版本控制系統，由 &lt;a href="https://en.wikipedia.org/wiki/Linus_Torvalds"&gt;Linus Torvalds&lt;/a&gt; 所開發，主要用於管理 Linux 核心的原始碼。Git 的主要特色包含了快速的處理速度、完整的資料保護、支援多分支的非線性開發，以及強大的分支管理功能，這些特色使其成為軟體開發領域中不可或缺的工具。要有效地運用 Git，除了要熟悉基本操作外，更重要的是要掌握其工作流程，才能達到最佳的團隊協作效果。本文將為您介紹一套實用的 Git 軟體開發指南，協助團隊提升協作效率。&lt;/p&gt;
&lt;p&gt;隨著團隊規模的擴大，Git 的使用也變得更加複雜。為了確保團隊協作的順暢，我們必須建立一套完整的 Git 軟體開發指南，規範團隊成員的操作行為，以維持程式碼庫的穩定性與可維護性。遵循這些規範不僅能加快開發進度，更能減少錯誤發生的機會，進而提升程式碼品質。&lt;/p&gt;
&lt;h2 id="git-軟體開發流程圖"&gt;Git 軟體開發流程圖&lt;/h2&gt;
&lt;p&gt;以下是一個簡單的 Git 軟體開發流程圖，用於說明團隊成員之間如何協作開發：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2025-01-04/git-flow.png" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;上述流程不一定適用於所有團隊，但可作為參考，並根據實際情況進行調整。接下來，我們將介紹一些 Git 軟體開發指南，幫助團隊提高協作效率。&lt;/p&gt;</description></item><item><title>Learning Go Language with GitLab API</title><link>https://blog.wu-boy.com/2024/11/learning-go-language-with-gitlab-api-en/</link><pubDate>Sat, 16 Nov 2024 15:15:56 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2024/11/learning-go-language-with-gitlab-api-en/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2024-11-16/gitlab-flow.png" alt="logo"&gt;&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;People often ask me how to learn &lt;a href="https://go.dev/"&gt;Go language&lt;/a&gt;, and I usually suggest they start with a real project to quickly learn the language&amp;rsquo;s features. Personally, I started with small projects and gradually expanded their scope, from contributing to documentation to open-source projects, then learning how to modify the source code, and finally writing my own project. This learning method allows you to become familiar with the features of the Go language more quickly.&lt;/p&gt;</description></item><item><title>使用 GitLab API 學習 Go 語言</title><link>https://blog.wu-boy.com/2024/11/learning-go-language-with-gitlab-api-zh-tw/</link><pubDate>Sat, 16 Nov 2024 12:32:46 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2024/11/learning-go-language-with-gitlab-api-zh-tw/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2024-11-16/gitlab-flow.png" alt="logo"&gt;&lt;/p&gt;
&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;常有人問我如何學習 &lt;a href="https://go.dev/"&gt;Go 語言&lt;/a&gt;，我通常建議他們從實際專案開始，這樣可以更快掌握語言特性。我個人也是先寫小專案，再逐步擴大範圍，從貢獻文件到開源專案，進而學習如何修改原始碼，最後再自己寫一個專案。這樣的學習方式能讓你更快熟悉 Go 語言的特性。&lt;/p&gt;</description></item><item><title>如何解決 MacOS 或 Linux 開發環境下的 SSL 驗證失敗問題</title><link>https://blog.wu-boy.com/2024/08/how-to-resolve-certificate-verify-failed/</link><pubDate>Sat, 31 Aug 2024 09:21:49 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2024/08/how-to-resolve-certificate-verify-failed/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2024-08-31/azure-openai-hong-kong.png" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;在開發環境中，有時候會遇到 SSL 驗證失敗的問題，這個問題通常是因為系統沒有正確的 SSL 憑證，導致無法驗證 SSL 憑證的問題。這篇文章將會介紹如何解決 MacOS 或 Linux 開發環境下的 SSL 驗證失敗問題。會寫這篇主要是我們預計在中國地區使用 &lt;a href="https://azure.microsoft.com/"&gt;Azure 服務&lt;/a&gt;，但是在中國地區使用 Azure 服務時，會遇到 SSL 驗證失敗的問題，其理由就是在 &lt;a href="https://learn.microsoft.com/en-us/azure/application-gateway/overview"&gt;Application Gateway&lt;/a&gt; 上的 SSL 憑證是由 Azure 提供自簽憑證。之後再寫一篇這個架構的目的跟辛酸史。也很感謝微軟團隊在這邊給予的協助及幫忙。&lt;/p&gt;</description></item><item><title>如何設計一套具備 Container 容器化技術的 CI/CD 平台 - Drone 開源專案</title><link>https://blog.wu-boy.com/2024/07/how-to-design-a-ci-cd-platform-with-containerization-technology/</link><pubDate>Tue, 09 Jul 2024 11:01:51 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2024/07/how-to-design-a-ci-cd-platform-with-containerization-technology/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/pw/AP1GczNeLCXNNS9NuOpeSI5CRTWe_SdtDwueVjvBQU_Wv08mVz8FoWqQ1WYfq1MHWRSXOtFbbK5gwai6D530X3qvL-tmaoR5D717ghr_q5u42lWojcF3Q3tuG0PR2IIWieoJBqg7aZMnmKwoy7dzQnL6VAwu0w=w2212-h1132-s-no-gm?authuser=0" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;今年一樣報名了 2024 年台北 &lt;a href="https://cloudsummit.ithome.com.tw/2024/"&gt;Cloud Summit&lt;/a&gt; 活動，講的主題是『&lt;a href="https://cloudsummit.ithome.com.tw/2024/session-page/2653"&gt;如何設計一套具備 Container 容器化技術的 CI/CD 平台?&lt;/a&gt;』，我相信大家在團隊內一定都有使用 CI/CD 工具，像是 Jenkins、GitLab CI、Travis CI、Circle CI 等等，這些工具都是非常好用的，但是想要在自己的環境中建置一套 CI/CD 平台，你會怎麼做呢？這次會帶您深入了解 Drone CI/CD 開源工具，並且透過實際的 Demo 來說明如何設計一套具備 Container 容器化技術的 CI/CD 平台。藉由 Drone 原始碼的解析，讓您了解 Drone 的運作原理，並且透過 Drone 的 Plugin 機制，讓您可以自行開發 Drone 的 Plugin，讓 Drone 可以更加符合您的需求。&lt;/p&gt;</description></item><item><title>Using singleflight in Go language to solve Cache Hotspot Invalid</title><link>https://blog.wu-boy.com/2024/02/how-to-reslove-the-hotspot-invalid-using-singleflight-en/</link><pubDate>Sat, 03 Feb 2024 14:19:13 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2024/02/how-to-reslove-the-hotspot-invalid-using-singleflight-en/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2024-02-03/cache-hotspot-invalid.png" alt="photo"&gt;&lt;/p&gt;
&lt;p&gt;The diagram above illustrates a commonly used architecture in implementing web services, which involves adding a cache between the service and the database to reduce the load on the database. However, when implementing service integration, three major cache problems are often encountered: &lt;a href="https://totoroliu.medium.com/redis-%E5%BF%AB%E5%8F%96%E9%9B%AA%E5%B4%A9-%E6%93%8A%E7%A9%BF-%E7%A9%BF%E9%80%8F-8bc02f09fe8f"&gt;Cache Avalanche, Hotspot Invalid, Cache Penetration&lt;/a&gt;. Among them, Cache Hotspot Invalid is a very common issue. When the data in the cache expires or disappears, a large number of requests will simultaneously hit the backend database, causing an excessive load on the database and even leading to database crashes, as shown in the diagram where the cache key of a certain article expires. This article will introduce how to use the &lt;a href="https://pkg.go.dev/golang.org/x/sync/singleflight"&gt;singleflight&lt;/a&gt; built into the &lt;a href="https://go.dev"&gt;Go language&lt;/a&gt; to solve the Cache Hotspot Invalid problem. This is a feature in the &lt;a href="https://pkg.go.dev/golang.org/x/sync"&gt;sync&lt;/a&gt; package that can prevent duplicate requests from hitting the backend database simultaneously.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2024-02-03/cache-missing.png" alt="photo"&gt;&lt;/p&gt;</description></item><item><title>在 Go 語言用 singleflight 解決快取擊穿 (Cache Hotspot Invalid)</title><link>https://blog.wu-boy.com/2024/02/how-to-reslove-the-hotspot-invalid-using-singleflight/</link><pubDate>Sat, 03 Feb 2024 14:19:13 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2024/02/how-to-reslove-the-hotspot-invalid-using-singleflight/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2024-02-03/cache-hotspot-invalid.png" alt="photo"&gt;&lt;/p&gt;
&lt;p&gt;上圖是在實作 Web 服務時常用的架構，會在服務跟資料庫之間加上快取，以減少資料庫的負載。然而在實作服務串接時，常常會遇到快取三大問題：&lt;a href="https://totoroliu.medium.com/redis-%E5%BF%AB%E5%8F%96%E9%9B%AA%E5%B4%A9-%E6%93%8A%E7%A9%BF-%E7%A9%BF%E9%80%8F-8bc02f09fe8f"&gt;雪崩、擊穿、穿透&lt;/a&gt;，其中 Cache Hotspot Invalid (快取擊穿) 是一個非常常見的問題，當快取中的資料過期或消失時，大量的請求會同時打到後端資料庫，這會導致資料庫的負載過大，甚至會導致資料庫掛掉，如下圖某篇文章的 cache key 過期。這篇文章將會介紹如何使用 &lt;a href="https://go.dev"&gt;Go 語言&lt;/a&gt;內建的 &lt;a href="https://pkg.go.dev/golang.org/x/sync/singleflight"&gt;singleflight&lt;/a&gt; 來解決快取擊穿的問題，這是 &lt;a href="https://pkg.go.dev/golang.org/x/sync"&gt;sync&lt;/a&gt; 套件中的一個功能，可以避免重複的請求同時打到後端資料庫。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2024-02-03/cache-missing.png" alt="photo"&gt;&lt;/p&gt;</description></item><item><title>生成式 AI CodeGPT 開發經驗談 - 台北 ModernWeb</title><link>https://blog.wu-boy.com/2023/11/codegpt-in-modernweb/</link><pubDate>Sun, 19 Nov 2023 13:13:30 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/11/codegpt-in-modernweb/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2023-11-08/cover.png" alt="photo"&gt;&lt;/p&gt;
&lt;p&gt;很高興可以到台北 ModerWeb 分享『&lt;a href="https://modernweb.tw/2023/session-page/2428"&gt;生成式 AI CodeGPT 開發經驗談&lt;/a&gt;』，沒想到這主題這麼多人有興趣，第一次遇到滿場的現象。這場主要講授在今年 3 月由我自己開源的 &lt;a href="https://github.com/appleboy/CodeGPT"&gt;CodeGPT&lt;/a&gt; 工具，身為軟體工程師，每天都一定會寫 &lt;a href="https://www.conventionalcommits.org/en/v1.0.0/"&gt;Commit Message&lt;/a&gt;，而此工具會針對修改的 Code Diff 進行閱讀，並給出一次性的 Commit Message，讓軟體工程師不用再煩惱該如何寫 Commit Message。大家可以看看上面的封面圖，就可以知道我每天需要花多少時間在寫有用可閱讀的 Commit。&lt;/p&gt;</description></item><item><title>Go 語言專案開發 Hot Reload 工具 - air</title><link>https://blog.wu-boy.com/2023/10/live-reload-in-go/</link><pubDate>Sat, 21 Oct 2023 11:10:03 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/10/live-reload-in-go/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2023-10-21/go.png" alt="go"&gt;&lt;/p&gt;
&lt;p&gt;大家都知道 &lt;a href="https://go.dev/"&gt;Go 語言&lt;/a&gt;的開發環境是非常的快速，但是如果你想要在開發的時候，修改程式碼後，自動重新編譯並且執行，這時候就需要一個 Hot Reload 工具，這邊介紹一個 &lt;a href="https://github.com/cosmtrek/air/"&gt;air&lt;/a&gt;，這個工具可以幫助你在開發的時候，自動重新編譯並且執行。安裝及設定方式非常簡單，不用 10 分鐘就可以打造自動編譯的開發環境。&lt;/p&gt;</description></item><item><title>快速設定 Git Commit Signature Verification</title><link>https://blog.wu-boy.com/2023/10/git-commit-signature-verification/</link><pubDate>Sun, 08 Oct 2023 09:25:11 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/10/git-commit-signature-verification/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2023-10-08/cover.png" alt="git commit"&gt;&lt;/p&gt;
&lt;p&gt;大家可以看到上面這張圖的第一筆 commit 是有加上綠色框框的 Verified 標籤，這是因為我有設定 &lt;a href="https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification"&gt;Git Commit Signature Verification&lt;/a&gt;，這樣的好處是可以確保每次的 commit 都是由我本人所做的，而不是其他人偽造的。這邊我們來看看如何設定 Git Commit Signature Verification。&lt;/p&gt;</description></item><item><title>加密檔案的好工具 - age</title><link>https://blog.wu-boy.com/2023/09/secure-encryption-tool-age/</link><pubDate>Sat, 30 Sep 2023 09:51:04 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/09/secure-encryption-tool-age/</guid><description>&lt;p&gt;&lt;img src="https://blog.wu-boy.com/images/2023-09-30/cover.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="htts://go.dev"&gt;Go 語言&lt;/a&gt;內的 &lt;a href="https://github.com/FiloSottile/age"&gt;age&lt;/a&gt; 軟體是一種開源的密碼學工具，用於加密和解密檔案。它主要用於保護敏感檔案或資料的隱私。它使用先進的加密標準，如 XChaCha20 和 Poly1305，以及 Scrypt 來加密和解密檔案。它還支持多種加密標準，如 RSA 和 Ed25519，以及多種密碼學工具，它還支持多種平台，如 Linux、Windows 和 macOS。為什麼我需要選擇這套工具呢？可以先從底下的流程圖來了解。&lt;/p&gt;</description></item><item><title>初探輕量級 DevOps 平台: Gitea - 台北 DevOpsDay</title><link>https://blog.wu-boy.com/2023/09/introduction-to-gitea-devops-platform/</link><pubDate>Fri, 29 Sep 2023 12:02:40 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/09/introduction-to-gitea-devops-platform/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/SrQvhDJm5NMkrxrut0lACspnz6iQSFCX3vlbtGCuAcwO-i_4iJCJ6trK3V2F6Q6s6fQ_EcSglwAL0qO0aLaTRtk4Ca32EI7Ks1H7u_nI9jC6xn3PF9hhgccjkbN3irX5pGi9kV-vIxk=w1920-h1080" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;今年非常幸運可以在台北 &lt;a href="https://devopsdays.tw/"&gt;DevOpsDay&lt;/a&gt; 給一場『&lt;a href="https://devopsdays.tw/2023/session-page/2366"&gt;輕量級 DevOps 平台: Gitea Platform&lt;/a&gt;』，這次分享主要是介紹輕量級 DevOps 平台，並且改善開發流程，讓開發者可以更快速的部署到生產環境。如果你使用過 &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;，那 Gitea DevOps 平台你一定不要錯過。Gitea 團隊在 2022 年底開始打造讓 &lt;a href="https://gitea.com/"&gt;Gitea&lt;/a&gt; 可以像是 GitHub 一樣使用 GitHub Actions，詳細的內容可以參考&lt;a href="https://blog.gitea.com/hacking-on-gitea-actions/"&gt;這篇文章&lt;/a&gt;。底下讓我們來看看怎麼使用 Gitea DevOps 平台。&lt;/p&gt;</description></item><item><title>打造 MLOps 平台 改善 AI 模型開發流程 - 2023 台北雲端大會</title><link>https://blog.wu-boy.com/2023/07/mlops-cloud-summit-in-taipei/</link><pubDate>Sun, 30 Jul 2023 16:12:47 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/07/mlops-cloud-summit-in-taipei/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/pw/AIL4fc_YtqxPo8o2wCBOZaD3TvhLdNVtpDjPqRIQYEbbMbFPFsaCjFtAFN7o6MmFZMfhTKEvlEUQ565rY4JTg0xkgAnRjreCMstTfsfk62NTzlmRw5IwPAisadyIi94In1uk-wwjxuzKkqYwAgyYoj9UhbRSuA=w1375-h918-s-no?authuser=0" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;很高興今年可以在&lt;a href="https://cloudsummit.ithome.com.tw/"&gt;台灣雲端大會&lt;/a&gt; (CloudSummit) 給一場『&lt;a href="https://cloudsummit.ithome.com.tw/2023/session-page/1991"&gt;打造 MLOps 平台改善 AI 模型開發流程&lt;/a&gt;』。這次分享主要是介紹如何打造 MLOps 平台，並且改善 AI 模型開發流程，讓開發者可以更快速的部署模型到生產環境。這次是 CloudSummit 第一次到南港展覽二館，而我也是第一次坐高鐵到南港站。剛到會場真是讓我驚艷的是場地的規模，而且還有很多攤位，整體流線相對前幾年來比較，變得非常的通順，逛起攤位來非常的舒服。&lt;/p&gt;</description></item><item><title>使用 Colima 快速打造 Kubernetes 開發環境</title><link>https://blog.wu-boy.com/2023/06/how-to-create-kubernetes-cluster-in-local/</link><pubDate>Sat, 10 Jun 2023 10:13:50 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/06/how-to-create-kubernetes-cluster-in-local/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/pw/AJFCJaXtuCuA5R-Xw8ea3rKHuIHwWY5JinU7EXhBsvq6HS1J0vva-4TYFsJY9fT7_gW69Dvf_khWJ1npoFO_yhxnY51WbWIW-OTQQfgxjLHxeEcQuO5JwT8l3Anp9Hku-ij7VU-bgUtygX-l-AwLgvPBZvYljQ=w860-h821-s-no?authuser=0" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;在學習新的技術項目，最麻煩的就是如何快速安裝相關環境，讓團隊同仁可以快速上手的最關鍵的原因之一。而學習 Kubernetes 也不例外，如果要在本地環境中搭建 Kubernetes 開發環境，需要安裝 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;、&lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt;、&lt;a href="https://minikube.sigs.k8s.io/docs/"&gt;Minikube&lt;/a&gt;、&lt;a href="https://kubernetes.io/docs/reference/kubectl/"&gt;Kubectl&lt;/a&gt; 等相關工具，這些工具的安裝和配置過程都比較繁瑣，而且容易出錯。能不能有快速地繞過這些方式，快速在自己的電腦打造 Kubernetes 開發環境呢？除了 Minikube，你可能也聽過 &lt;a href="https://k3s.io/"&gt;k3s&lt;/a&gt;、&lt;a href="https://kind.sigs.k8s.io/"&gt;kind&lt;/a&gt; 等工具，不過這些工具對於新人來說，還是相當困難。今天要介紹的是一個新的工具 &lt;a href="https://github.com/abiosoft/colima"&gt;Colima&lt;/a&gt;，它可以讓您在本地環境中運行輕量級的虛擬機器，並在虛擬機器中運行 Kubernetes 叢集。&lt;/p&gt;</description></item><item><title>如何產生開發者 kubeconfig 設定檔</title><link>https://blog.wu-boy.com/2023/05/how-to-create-user-kubeconfig-file/</link><pubDate>Wed, 31 May 2023 07:56:20 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/05/how-to-create-user-kubeconfig-file/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/pw/AJFCJaXtuCuA5R-Xw8ea3rKHuIHwWY5JinU7EXhBsvq6HS1J0vva-4TYFsJY9fT7_gW69Dvf_khWJ1npoFO_yhxnY51WbWIW-OTQQfgxjLHxeEcQuO5JwT8l3Anp9Hku-ij7VU-bgUtygX-l-AwLgvPBZvYljQ=w860-h821-s-no?authuser=0" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;產生 &lt;code&gt;kubeconfig&lt;/code&gt; 檔案需要準備底下資訊&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#658b00"&gt;export&lt;/span&gt; &lt;span style="color:#00688b"&gt;KUBECONFIG&lt;/span&gt;=&amp;lt;path-to-kubeconfig-file&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#658b00"&gt;export&lt;/span&gt; &lt;span style="color:#00688b"&gt;CLUSTER_NAME&lt;/span&gt;=&amp;lt;cluster-name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#658b00"&gt;export&lt;/span&gt; &lt;span style="color:#00688b"&gt;SERVER_URL&lt;/span&gt;=&amp;lt;server-url&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#658b00"&gt;export&lt;/span&gt; &lt;span style="color:#00688b"&gt;CA_CERT&lt;/span&gt;=&amp;lt;path-to-ca-certificate&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#658b00"&gt;export&lt;/span&gt; &lt;span style="color:#00688b"&gt;TOKEN&lt;/span&gt;=&amp;lt;token&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#658b00"&gt;export&lt;/span&gt; &lt;span style="color:#00688b"&gt;USERNAME&lt;/span&gt;=&amp;lt;username&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;將 &lt;code&gt;&amp;lt;path-to-kubeconfig-file&amp;gt;&lt;/code&gt; 替換為要生成的 kubeconfig 檔案的路徑和名稱，例如 &lt;code&gt;~/mykubeconfig&lt;/code&gt;。將 &lt;code&gt;&amp;lt;cluster-name&amp;gt;&lt;/code&gt; 替換為你的叢集名稱， &lt;code&gt;&amp;lt;server-url&amp;gt;&lt;/code&gt; 替換為你的 Kubernetes API 伺服器的 URL， &lt;code&gt;&amp;lt;path-to-ca-certificate&amp;gt;&lt;/code&gt; 替換為你的 CA 憑證的路徑和名稱， &lt;code&gt;&amp;lt;username&amp;gt;&lt;/code&gt; 替換為你的使用者名稱，&lt;code&gt;&amp;lt;token&amp;gt;&lt;/code&gt; 替換為你的身份驗證令牌（Access Token），透過底下指令就可以完成了&lt;/p&gt;</description></item><item><title>用 Terraform 初始化 GCP 環境</title><link>https://blog.wu-boy.com/2023/05/initialize-gcp-environment-using-terraform/</link><pubDate>Sat, 27 May 2023 10:50:33 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/05/initialize-gcp-environment-using-terraform/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/pw/AJFCJaWyFC1UXBwtZxoLTamoUztI0cikLLTKKf_wugXxkeQxOsXODnMs8fMiO_BcJuC6sF5f9vzfM5s0Q-wMMjuCzvx3OwmEVnnxENYALUhOXaoBxtsu3v5_DomatQM70DpkNqSv5hYdX7NKHqLzK9-E0QLmrA=w678-h677-s-no?authuser=0" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;我們將使用 &lt;a href="https://developer.hashicorp.com/terraform/intro"&gt;Terraform&lt;/a&gt; 來初始化 &lt;a href="https://cloud.google.com/"&gt;GCP 環境&lt;/a&gt;。從建立 Service Account 到 GCS 並且將 Terraform State 儲存做版本控制，這篇文章將會一步一步帶領您完成。&lt;/p&gt;</description></item><item><title>在 Kubernetes 中列出 Service 下的所有 Pod</title><link>https://blog.wu-boy.com/2023/05/list-pods-from-k8s-service/</link><pubDate>Sun, 21 May 2023 20:19:45 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/05/list-pods-from-k8s-service/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/pw/AJFCJaXtuCuA5R-Xw8ea3rKHuIHwWY5JinU7EXhBsvq6HS1J0vva-4TYFsJY9fT7_gW69Dvf_khWJ1npoFO_yhxnY51WbWIW-OTQQfgxjLHxeEcQuO5JwT8l3Anp9Hku-ij7VU-bgUtygX-l-AwLgvPBZvYljQ=w860-h821-s-no?authuser=0" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt; (簡稱 k8s) 中，Service Endpoint（服務終端點）是一個抽象的概念，代表著一個服務的網絡位置。它是一個內部或外部的 IP 地址，可以用來訪問運行在 Kubernetes 集群中的應用程序服務。而如何在 Kubernetes 中列出 Service 下的所有 Pod 呢？這篇文章將會介紹如何使用 kubectl 來列出 Service 下的所有 Pod。&lt;/p&gt;</description></item><item><title>設計流程及系統架構圖好工具 D2</title><link>https://blog.wu-boy.com/2023/05/what-is-d2-declarative-diagramming-language/</link><pubDate>Sun, 21 May 2023 10:09:26 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/05/what-is-d2-declarative-diagramming-language/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/pw/AJFCJaXH-MYgMTn3_iMl7FIKNbI1B93sTffzWPn8ZEaC96iTp9ZCpqu2DZY9gNLWrnqUL10qUBD2pwHhdOBOczBiHeaFCC6MhrSBwI-jgNZuaGC50fVhTBl7yQDXem2AhvMpR871jUuvHssv-muKZqfZ8-4chw=w2786-h1152-s-no?authuser=0" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;在之前寫過一篇『&lt;a href="https://blog.wu-boy.com/2022/09/three-tools-design-system-architecture-and-flow/"&gt;三款好用的繪圖工具來解決系統架構或流程圖&lt;/a&gt;』，內文介紹了 PlantUML、Diagrams 及 Excalidraw 三套不同的工具，而本篇要來介紹一套用 Go 語言寫的工具 &lt;a href="https://d2lang.com/"&gt;D2: Declarative Diagramming&lt;/a&gt;，這套工具可以讓你使用簡單的語法來繪製系統架構圖或流程圖，並且可以將圖片轉換成 SVG 或 PNG 格式。在介紹之前，我來講講為什麼要用這些流程圖工具，對工作上或團隊內部有什麼優點？&lt;/p&gt;</description></item><item><title>軟體工程師會被 AI 取代嗎?</title><link>https://blog.wu-boy.com/2023/05/software-engineering-will-be-replaced-by-ai/</link><pubDate>Thu, 11 May 2023 21:11:19 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/05/software-engineering-will-be-replaced-by-ai/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/LPYqF26.png" alt="Cover"&gt;&lt;/p&gt;
&lt;p&gt;看了 &lt;a href="https://www.youtube.com/@hackbearterry"&gt;HackBear 泰瑞&lt;/a&gt;剛發佈的影片『&lt;a href="https://www.youtube.com/watch?v=Dgjic4BbjGs"&gt;我要被AI取代了嗎？&lt;/a&gt;』，今年火熱的 &lt;a href="https://openai.com/blog/chatgpt"&gt;ChatGTP&lt;/a&gt; 已經是軟體工程師每天需要用到的工具了，但是這個工具真的會取代軟體工程師嗎？我們來看看影片內容。&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Dgjic4BbjGs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;p&gt;看完影片後，自己想想有哪些事情是不會被 AI 取代的，大家也不用害怕 ChatGPT，而是要善用 AI 帶來的好處，讓自己的工作更有效率。&lt;/p&gt;</description></item><item><title>網路服務 SaaS、PaaS 和 IaaS 的差異</title><link>https://blog.wu-boy.com/2023/05/what-are-different-between-saas-pass-iaas/</link><pubDate>Thu, 11 May 2023 13:30:16 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/05/what-are-different-between-saas-pass-iaas/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/pw/AJFCJaVJO5Fu36CODWwYUc31FV6wfL6NEFO5_RLVnJ3H89TfB8nXDRAjB5Xwau9u6UlOLMnLkTyV0YWv84t1rSj2TMmynxkJS9-qxp6HqCOU1_MkiUERow9MsaYikt-FOtLd0yFVCJ2ZcDYbhw8szvfatZOIVg=w1000-no-tmp.jpg" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;一般來說，開發的應用程式可以部署在 SaaS、PaaS 或 IaaS 平台上。這些平台都是雲端運算的不同模式，可以根據自己的需求來選擇最適合自己的模式。本文將介紹 SaaS、PaaS 和 IaaS 的差異。根據團隊成員組成來決定要用什麼平台，這對於新創團隊來說是非常重要的議題。像是如果團隊有熟悉 Linux 維護的同仁，可以選擇像是 &lt;a href="https://www.linode.com/"&gt;Linode&lt;/a&gt;、&lt;a href="https://www.digitalocean.com/"&gt;DigitalOcean&lt;/a&gt; 這類的 IaaS 服務，如果團隊有熟悉 Heroku、Google App Engine 這類的 PaaS &lt;a href="https://www.linode.com/"&gt;Linode&lt;/a&gt; 是一個 IaaS (Infrastructure as a Service) 提供商，它提供了虛擬化的硬體環境，使用者可以在這個環境中建立虛擬機器和存儲裝置。使用者需要負責管理這些虛擬機器和存儲裝置，包括安裝和維護作業系統和應用程式。因此，Linode 可以歸類在 IaaS 的範疇。我個人就很常使用 &lt;a href="https://www.linode.com/"&gt;Linode&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>Compiling multi-architecture images with Docker BuildKit using Drone CI/CD</title><link>https://blog.wu-boy.com/2023/04/drone-ci-cd-to-build-multiarch-docker-images-with-buildx-en/</link><pubDate>Sat, 22 Apr 2023 14:50:40 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/04/drone-ci-cd-to-build-multiarch-docker-images-with-buildx-en/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/ySw4F8j.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;In 2020, Docker announced &lt;a href="https://www.docker.com/blog/multi-arch-build-and-images-the-simple-way/"&gt;support for multi-architecture images&lt;/a&gt;, and later, &lt;a href="https://docs.docker.com/develop/develop-images/build_enhancements/"&gt;Docker BuildKit&lt;/a&gt; officially supported &lt;a href="https://docs.docker.com/build/building/multi-platform/"&gt;multi-architecture images&lt;/a&gt;. This article introduces how to use &lt;a href="https://www.drone.io/"&gt;Drone CI/CD&lt;/a&gt; with &lt;a href="https://docs.docker.com/develop/develop-images/build_enhancements/"&gt;Docker BuildKit&lt;/a&gt; to compile multi-architecture images, and this feature is free and does not require a paid Docker Hub account. However, the &lt;a href="https://plugins.drone.io/plugins/docker"&gt;Drone Docker Plugin&lt;/a&gt; provided by Drone CI/CD does not currently support multi-architecture images, so you need to write your own Drone Pipeline to achieve our goal. The official website has also proposed this proposal: &amp;lsquo;&lt;a href="https://github.com/drone/proposal/issues/5"&gt;Support cross-arch Docker builds within Docker using QEMU&lt;/a&gt;&amp;rsquo; to achieve this goal, using QEMU. The key point is to use Docker BuildKit to complete it under the environment where the Host supports &lt;a href="https://www.qemu.org/"&gt;Qemu&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>用 Drone CI/CD 搭配 Docker BuildKit 編譯多架構映像檔</title><link>https://blog.wu-boy.com/2023/04/drone-ci-cd-to-build-multiarch-docker-images-with-buildx/</link><pubDate>Sat, 22 Apr 2023 07:12:47 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/04/drone-ci-cd-to-build-multiarch-docker-images-with-buildx/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/ySw4F8j.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;在 2020 年就有 &lt;a href="https://www.docker.com/blog/multi-arch-build-and-images-the-simple-way/"&gt;Docker 宣布支援多架構映像檔&lt;/a&gt;，後來才有正式的 &lt;a href="https://docs.docker.com/develop/develop-images/build_enhancements/"&gt;Docker BuildKit&lt;/a&gt; 支援&lt;a href="https://docs.docker.com/build/building/multi-platform/"&gt;多架構映像檔&lt;/a&gt;，這篇文章來介紹如何使用 &lt;a href="https://www.drone.io/"&gt;Drone CI/CD&lt;/a&gt; 搭配 &lt;a href="https://docs.docker.com/develop/develop-images/build_enhancements/"&gt;Docker BuildKit&lt;/a&gt; 編譯多架構映像檔，而且這個功能是免費的，不需要付費的 Docker Hub 帳號。但是在 Drone CI/CD 官方提供的 &lt;a href="https://plugins.drone.io/plugins/docker"&gt;Drone Docker Plugin&lt;/a&gt; 目前是不支援多架構映像檔，所以需要自己撰寫 Drone Pipeline，來達到我們的目的，官方也有人提出了這樣的 Proposal: 『&lt;a href="https://github.com/drone/proposal/issues/5"&gt;Support cross-arch Docker builds within Docker using QEMU&lt;/a&gt;』，使用 QEMU 來達成目的，底下來介紹如何使用，關鍵點就是在 Host 支援 &lt;a href="https://www.qemu.org/"&gt;Qemu&lt;/a&gt; 的環境下，使用 Docker BuildKit 完成。&lt;/p&gt;</description></item><item><title>用 ChatGPT 幫忙進行 Code Review 給建議</title><link>https://blog.wu-boy.com/2023/03/code-review-brief-using-chatgpt-gpt4/</link><pubDate>Sun, 26 Mar 2023 17:05:10 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/03/code-review-brief-using-chatgpt-gpt4/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/LPYqF26.png" alt="Cover"&gt;&lt;/p&gt;
&lt;p&gt;上一篇文章我們介紹了如何&lt;a href="https://blog.wu-boy.com/2023/03/writes-git-commit-messages-using-chatgpt/"&gt;使用 ChatGPT 來自動生成 Commit Message&lt;/a&gt;，這篇文章來介紹如何使用 ChatGPT 來進行 Code Review。在月初開發的 &lt;a href="https://github.com/appleboy/CodeGPT"&gt;CodeGPT&lt;/a&gt; 已經讓開發者可以使用 &lt;a href="https://platform.openai.com/docs/models/gpt-3-5"&gt;GPT-3.5-Turbo&lt;/a&gt; 來進行生成 Commit 總結，這個功能省下開發者不少整理開發內容時間，但是我覺得還是不夠，大家除了開發外，還花了很多時間在進行 Code Review，所以如果有工具，可以讓開發者可以提前知道優化的項目，這可以省下不少 Review 的時間。&lt;/p&gt;</description></item><item><title>用 ChatGPT 自動幫開發者產生 Commit Message</title><link>https://blog.wu-boy.com/2023/03/writes-git-commit-messages-using-chatgpt/</link><pubDate>Sun, 12 Mar 2023 15:53:55 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/03/writes-git-commit-messages-using-chatgpt/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/LPYqF26.png" alt="Cover"&gt;&lt;/p&gt;
&lt;p&gt;相信大家對 &lt;a href="https://zh.wikipedia.org/zh-tw/ChatGPT"&gt;ChatGPT&lt;/a&gt; 不會很陌生，這是目前在生成式人工智慧 (AIGC: AI Generated Content) 內的當紅炸子雞，然而 ChatGPT 對於軟體工程師有什麼影響呢？能否透過 ChatGPT 改善團隊流程或協助開發？而我現在想到最直接的就是用 ChatGTP 幫忙寫 Git Commit Message，然而怎麼把 Commit Message 寫好可以參考&lt;a href="https://wadehuanglearning.blogspot.com/2019/05/commit-commit-commit-why-what-commit.html"&gt;這篇文章&lt;/a&gt;，為了能達成這目的，我用 &lt;a href="https://go.dev"&gt;Go 語言&lt;/a&gt;寫了一個 CLI 工具 &lt;a href="https://github.com/appleboy/CodeGPT"&gt;CodeGPT&lt;/a&gt; (請大家幫忙分享)，來協助軟體工程師整理開發內容。底下先看看使用 CodeGPT 來產生 Commit Message 的成果:&lt;/p&gt;</description></item><item><title>Automated solution for updating running Docker containers - watchtower</title><link>https://blog.wu-boy.com/2023/02/automating-docker-container-base-image-updates-eng/</link><pubDate>Tue, 28 Feb 2023 14:52:48 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/02/automating-docker-container-base-image-updates-eng/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/XbonwAZ.png" alt="CI"&gt;&lt;/p&gt;
&lt;p&gt;Nowadays, most of us have containerized our services, and effectively managing and upgrading containers without affecting existing services is a critical issue. Two steps are required in the &lt;a href="https://zh.wikipedia.org/zh-tw/CI/CD"&gt;CI/CD process&lt;/a&gt;: first, packaging the environment as a Docker image and uploading it to the company&amp;rsquo;s private &lt;a href="https://docs.docker.com/registry/"&gt;Docker registry&lt;/a&gt;; and second, after the upload is complete, possibly connecting to the machine via SSH, pulling the new image, and restarting the running service via the Graceful Shutdown mechanism. You can learn more about Graceful Shutdown &lt;a href="https://blog.wu-boy.com/2020/02/what-is-graceful-shutdown-in-golang/"&gt;in this article&lt;/a&gt;. I am going to introduces &lt;a href="https://containrrr.dev/watchtower"&gt;Watchtower&lt;/a&gt;, a brand new tool that automatically upgrades and updates running containers, allowing for further CD process streamlining. Developers only need to upload the Docker image, and the remote servers can update the running container automatically.&lt;/p&gt;</description></item><item><title>自動升級更新執行中的 Docker 容器解決方案 - watchtower</title><link>https://blog.wu-boy.com/2023/02/automating-docker-container-base-image-updates-cht/</link><pubDate>Tue, 28 Feb 2023 08:44:19 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/02/automating-docker-container-base-image-updates-cht/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/XbonwAZ.png" alt="CI"&gt;&lt;/p&gt;
&lt;p&gt;現在大家在部署服務肯定都已經容器化，而如何有效管理及升級容器不影響現有的服務，這就是一個重要的議題，然而在 &lt;a href="https://zh.wikipedia.org/zh-tw/CI/CD"&gt;CI/CD 的流程&lt;/a&gt;內，肯定有兩個步驟是必須的，第一就是將環境打包成 Docker Image 並上傳到公司內私有的 &lt;a href="https://docs.docker.com/registry/"&gt;Docker Registry&lt;/a&gt;，以及上傳完畢後，也許透過 SSH 方式連上機器，並且拉取新的映像檔，再透過 Graceful Shutdown 機制重新啟動正在執行的服務。可以參考這篇了解什麼是 &lt;a href="https://blog.wu-boy.com/2020/02/what-is-graceful-shutdown-in-golang/"&gt;Graceful Shutdown&lt;/a&gt;。本篇就是要帶給大家一個全新的工具 &lt;a href="https://containrrr.dev/watchtower"&gt;Watchtower&lt;/a&gt; 用來自動升級更新執行中的容器，讓 CD 流程可以再簡化一步，開發者只要上傳完 Docker Image，遠方的伺服器就可以自動更新。&lt;/p&gt;</description></item><item><title>用 Go 語言實現固定大小的 Ring Buffer 資料結構</title><link>https://blog.wu-boy.com/2023/01/ring-buffer-queue-with-fixed-size-in-golang/</link><pubDate>Tue, 24 Jan 2023 08:08:14 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/01/ring-buffer-queue-with-fixed-size-in-golang/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/mDJolWF.png" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;Ring Buffer Queue 是&lt;strong&gt;固定大小記憶體&lt;/strong&gt;的 FIFO (first in, first out) 資料結構，用來處理不同 Process 之前的資料交換。工作原理就是在一段連續固定大小區間的記憶體用 (head/tail) 兩個指針來決定現在要將資料放在哪個位置。本篇將帶大家用 &lt;a href="https://go.dev"&gt;Go 語言&lt;/a&gt;快速實現 Ring Buffer 資料結構。&lt;/p&gt;</description></item><item><title>用 Go 語言建立 Web 及 Worker 服務實現取消任務 (二)</title><link>https://blog.wu-boy.com/2023/01/create-server-and-worker-for-cancel-task-in-golang/</link><pubDate>Mon, 02 Jan 2023 08:32:31 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2023/01/create-server-and-worker-for-cancel-task-in-golang/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/a5rYLFr.png" alt="cancel a task"&gt;&lt;/p&gt;
&lt;p&gt;上一篇『&lt;a href="https://blog.wu-boy.com/2022/12/system-design-how-to-cancel-a-running-task-in-golang/"&gt;系統設計: 如何取消正在執行的工作任務 (一)&lt;/a&gt;』教大家如何用 &lt;a href="https://go.dev"&gt;Go 語言&lt;/a&gt;實現 &lt;code&gt;canceler&lt;/code&gt; package 來紀錄及取消正在執行的任務。而本篇來實現上圖的 &lt;code&gt;HTTP Server&lt;/code&gt; 及 &lt;code&gt;Worker&lt;/code&gt; 程式碼，底下直接用 Gin 框架來快速實現 HTTP 兩個 Handle，分別是 &lt;code&gt;Cancel Task&lt;/code&gt; 及 &lt;code&gt;Ｗatch Task&lt;/code&gt; (如下圖標示的 1 跟 2)。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/dquTd65.png" alt="cancel a task"&gt;&lt;/p&gt;
&lt;p&gt;其中上圖綠色框框 &lt;code&gt;1&lt;/code&gt; 是用來接收使用者想要取消的任務，而 &lt;code&gt;2&lt;/code&gt; 是用來讓 worker 進行長連接，根據不同的情境可以設定不同的等待時間。大家可能會問，為什麼不讓 Server 主動通知 Worker 就可以了，先解釋這點，這邊我們可能要先假設 Worker 存在的環境是封閉的，不能任意架設服務，故需要主動向 HTTP Server 進行詢問。其中 HTTP Server 跟 Worker 中間可以透過 gRPC 或 RESTful 進行資料交換，本篇先以 RESTful 進行說明。&lt;/p&gt;</description></item><item><title>用 Go 語言實作如何取消正在執行的工作任務 (一)</title><link>https://blog.wu-boy.com/2022/12/system-design-how-to-cancel-a-running-task-in-golang/</link><pubDate>Fri, 23 Dec 2022 08:32:31 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2022/12/system-design-how-to-cancel-a-running-task-in-golang/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/VZyfv0M.png" alt="cancel a task"&gt;&lt;/p&gt;
&lt;p&gt;本篇來聊聊『如何取消正在執行的工作任務』，當系統內有需要處理比較久或較多資源的任務，肯定會將這些任務丟到其他機器再執行，執行過程如果需要取消，會經過如上圖幾個步驟。先假設中間的過程不透過 Message Queue 機制，而是兩個服務進行溝通透過 &lt;a href="https://aws.amazon.com/tw/what-is/restful-api/"&gt;RESTful&lt;/a&gt; 或 &lt;a href="https://grpc.io/"&gt;gRPC&lt;/a&gt; 方式。&lt;/p&gt;</description></item><item><title>系統設計: 處理服務讀取多個任務遇到的問題 (Go 語言)</title><link>https://blog.wu-boy.com/2022/11/simple-scheduler-with-multiple-worker-using-golang/</link><pubDate>Sun, 13 Nov 2022 08:23:09 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2022/11/simple-scheduler-with-multiple-worker-using-golang/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/lbY6KzL.png" alt="system design 02"&gt;&lt;/p&gt;
&lt;p&gt;不同的服務都會有需要處理比較久的任務，這些任務是不能即時執行完成，才回應給前端，這樣使用者體驗會非常的差。將類型的任務存在資料庫或放在&lt;a href="https://zh.m.wikipedia.org/zh-hant/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97"&gt;消息對列&lt;/a&gt;就是一種處理方式，接著啟動另一個服務來消化非即時性的任務，而常見的處理方式就是在服務內啟動多個 Worker Node 來平行消化任務 (如上圖)。&lt;/p&gt;</description></item><item><title>三款好用的繪圖工具來解決系統架構或流程圖</title><link>https://blog.wu-boy.com/2022/09/three-tools-design-system-architecture-and-flow/</link><pubDate>Sat, 17 Sep 2022 21:30:26 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2022/09/three-tools-design-system-architecture-and-flow/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/0sA0St5.png" alt="drwaio 01"&gt;&lt;/p&gt;
&lt;p&gt;不管是長官還是同事甚至下屬，在公司無時無刻都需要跨團隊進行溝通，當系統架構或流程越來越複雜的時候，如果沒有按照當下情況記錄下來，對於未來接手的同事，或者是自己都會不小心忘記，而在記憶最清楚的當下用文字或流程圖記錄下來，對團隊及自己是有相當大的幫助。而有沒有工具可以快速畫出系統架構或流程圖？我們可以分幾種情境來討論。&lt;/p&gt;</description></item><item><title>用 Google 團隊推出的 Wire 工具解決 Dependency Injection</title><link>https://blog.wu-boy.com/2022/09/dependency-injection-in-go/</link><pubDate>Sat, 10 Sep 2022 13:17:01 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2022/09/dependency-injection-in-go/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/DZOA6zy.png" alt="proposal"&gt;&lt;/p&gt;
&lt;p&gt;不知道大家在用 &lt;a href="https://go.dev"&gt;Go 語言&lt;/a&gt;寫服務的時候，會不會遇到 Components 會有相互依賴的關係，A 物件依賴 B 物件，B 物件又依賴 C 物件，所以在初始化 A 物件前，就必須先將 B 跟 C 初始化完成，這就是錯綜復雜的關係。也許大家會想到另一個做法，就是把每個物件都宣告成&lt;strong&gt;全域變數&lt;/strong&gt;，我個人不推薦這個使用方式，雖然很方便，但是就會讓整體架構變得很複雜。而本篇要介紹一個救星工具，就是 Google 團隊開發的 &lt;a href="https://github.com/google/wire"&gt;Wire&lt;/a&gt; 工具，官方部落格也可以&lt;a href="https://blog.golang.org/wire"&gt;參考看看&lt;/a&gt;。此工具就是為了解決底下兩個問題 (&lt;a href="https://en.wikipedia.org/wiki/Dependency_injection"&gt;dependency injection&lt;/a&gt;)。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Components 互相依賴錯綜復雜的關係&lt;/li&gt;
&lt;li&gt;不要宣告全域變數&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>三種好用的 gRPC 測試工具</title><link>https://blog.wu-boy.com/2022/08/three-grpc-testing-tool/</link><pubDate>Wed, 24 Aug 2022 16:29:31 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2022/08/three-grpc-testing-tool/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/ZfDNgPP.png" alt="grpc flow proposal"&gt;&lt;/p&gt;
&lt;p&gt;最近在用 &lt;a href="https://go.dev"&gt;Go 語言&lt;/a&gt;實作微服務，溝通的接口採用 &lt;a href="https://grpc.io/"&gt;gRPC&lt;/a&gt;，除了可以透過 gRPC 支援的&lt;a href="https://grpc.io/docs/languages/"&gt;第三方語言&lt;/a&gt;來寫客戶端的測試之外，有沒有一些好用的工具來驗證檢查 gRPC 實現的接口。剛好今年看到 &lt;a href="https://www.postman.com/"&gt;Postman&lt;/a&gt; 宣布&lt;a href="https://blog.postman.com/postman-now-supports-grpc/"&gt;開始支援 gRPC&lt;/a&gt;，相信大家對於 Postman 工具並不會太陌生，畢竟測試 &lt;a href="https://en.wikipedia.org/wiki/WebSocket"&gt;Websocket&lt;/a&gt; 或 RESTful API 都是靠這工具呢。本篇除了介紹 Postman 之外，還有一套 CLI 工具 &lt;a href="https://github.com/fullstorydev/grpcurl"&gt;grpcurl&lt;/a&gt; 及一套 GUI 工具 &lt;a href="https://github.com/fullstorydev/grpcui"&gt;grpcui&lt;/a&gt; 也是不錯用，後面這兩套都是由同一家公司 &lt;a href="https://www.fullstory.com/blog/tag/engineering/"&gt;FullStory&lt;/a&gt; 開源出來的專案，底下就來一一介紹。&lt;/p&gt;</description></item><item><title>監控服務 Gatus 系統架構</title><link>https://blog.wu-boy.com/2022/07/gatus-system-architecture/</link><pubDate>Tue, 26 Jul 2022 17:29:31 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2022/07/gatus-system-architecture/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/mvEGMva.png" alt="gatus proposal"&gt;&lt;/p&gt;
&lt;p&gt;今年第一場公開的演講 &lt;a href="https://cloudsummit.ithome.com.tw/"&gt;2022 台灣雲端大會&lt;/a&gt;，台灣五月開始疫情變嚴重，故延遲了一次到七月才舉辦，這次帶給大家的是『&lt;a href="https://cloudsummit.ithome.com.tw/2022/speaker-page/69"&gt;自動化監控網站運行服務 – Gatus&lt;/a&gt;』，內容可以拆為兩個部分，第一部分是介紹為什麼要使用 &lt;a href="https://github.com/TwiN/gatus"&gt;Gatus&lt;/a&gt;，用來解決開發團隊哪些問題，我也整理了三大點為什麼我選擇 Gatus，另一部分就是本篇的主軸，Gatus 系統架構跟流程。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;監控條件 (客製化回應)&lt;/li&gt;
&lt;li&gt;開源專案 (Go 語言)&lt;/li&gt;
&lt;li&gt;簡易頁面 (Status Page)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;對於使用 Gatus 有興趣的朋友可以參考我之前寫的文章：『&lt;a href="https://blog.wu-boy.com/2022/03/automated-service-health-dashboard-gatus/"&gt;自動化監控網站運行服務 - Gatus&lt;/a&gt;』，本篇就不介紹怎麼使用 Gatus 了。&lt;/p&gt;</description></item><item><title>在 Go 語言測試使用 Setup 及 Teardown</title><link>https://blog.wu-boy.com/2022/07/setup-and-teardown-with-unit-testing-in-golang/</link><pubDate>Sun, 17 Jul 2022 07:44:49 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2022/07/setup-and-teardown-with-unit-testing-in-golang/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/FD5go1t.png" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;相信大家在寫測試時，都會需要啟動而外服務，像是 &lt;a href="https://redis.io/"&gt;Redis&lt;/a&gt; 或 &lt;a href="https://www.postgresql.org/"&gt;Postgres&lt;/a&gt; 等，而開始測試前會需要初始化資料庫連線，或者是準備測試資料，測試結束後就關閉資料庫連線，並且移除不必要的測試資料或檔案。在 &lt;a href="https://go.dev"&gt;Go 語言&lt;/a&gt;內開發者不用去依賴第三方的套件，透過內建的 &lt;code&gt;TestMain&lt;/code&gt; 就可以非常輕鬆完成此事情。底下看看如何操作及使用。&lt;/p&gt;</description></item><item><title>優化重構 Worker Pool 程式碼</title><link>https://blog.wu-boy.com/2022/06/refactor-worker-pool-source-code/</link><pubDate>Tue, 07 Jun 2022 20:42:17 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2022/06/refactor-worker-pool-source-code/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/mDJolWF.png" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;最近看到 &lt;a href="https://go.dev"&gt;Go 語言&lt;/a&gt;一段程式碼，認為有很大的優化空間，也將過程跟想法分享給大家。也許每個人優化的方向不同，各位讀者可以把&lt;a href="https://go.dev/play/p/aZFiLXm16lI"&gt;程式碼&lt;/a&gt;整個看完後，先停住，不要繼續往下看，想看看是否有優化的空間。此程式碼本身沒有任何問題，執行過程不會出現任何錯誤。&lt;/p&gt;
&lt;p&gt;先說明底下範例在做什麼，相信大家都有聽過在 Go 語言內要實現 &lt;a href="https://gobyexample.com/worker-pools"&gt;Worker Pools&lt;/a&gt; 機制相當簡單，看到 &lt;code&gt;ExecuteAll&lt;/code&gt; 函式就是讓開發者可以自訂同時間開多少個 Goroutine 來平行執行工作，第二個參數可以自訂義工作內容是什麼。&lt;/p&gt;</description></item><item><title>在 Go 語言內使用 bytes.Buffer 注意事項</title><link>https://blog.wu-boy.com/2022/06/reuse-the-bytes-buffer-in-go/</link><pubDate>Tue, 07 Jun 2022 20:42:17 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2022/06/reuse-the-bytes-buffer-in-go/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/FD5go1t.png" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;a href="https://go.dev"&gt;Go 語言&lt;/a&gt;中，如何高效的處理字串相加，由於字串 (string) 是不可變的，所以將很多字串拼接起來，會如同宣告新的變數來儲存。這邊就可以透過 &lt;a href="https://pkg.go.dev/strings"&gt;strings.Builder&lt;/a&gt; 或 &lt;a href="https://pkg.go.dev/bytes"&gt;bytes.Buffer&lt;/a&gt; 來解決字串相加效能問題。除了效能問題之外，還需要注意在 &lt;code&gt;bytes.Buffer&lt;/code&gt; 處理 &lt;code&gt;[]byte&lt;/code&gt; 及 &lt;code&gt;string&lt;/code&gt; 之間的轉換，底下拿實際專案上寫出來的錯誤給大家參考看看&lt;/p&gt;</description></item><item><title>用 10 分鐘了解 Go 語言如何從 Channel 讀取資料</title><link>https://blog.wu-boy.com/2022/05/read-data-from-channel-in-go/</link><pubDate>Sun, 22 May 2022 22:42:46 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2022/05/read-data-from-channel-in-go/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/NGE7q2U.png" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;Go 語言強大的 &lt;a href="https://go.dev/tour/concurrency/1"&gt;goroutine 特性&lt;/a&gt;，讓各位開發者愛不釋手，而多個 goroutine 如何溝通呢？就是透過 &lt;a href="https://go.dev/tour/concurrency/2"&gt;Channel&lt;/a&gt; 來做到。本篇教大家從 Channel 讀取資料的兩種方式及使用時機，並實際用一個案例快速了解 Channel 實作上會遇到哪些問題？底下用兩個範例讓大家了解如何讀取 Channel 資料出來。&lt;/p&gt;</description></item><item><title>用 Go 語言實現 Pub-Sub 模式</title><link>https://blog.wu-boy.com/2022/04/simple-publish-subscribe-pattern-in-golang/</link><pubDate>Sat, 30 Apr 2022 20:56:49 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2022/04/simple-publish-subscribe-pattern-in-golang/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/k7fF6V0.png" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;相信大家都知道&lt;a href="https://zh.wikipedia.org/wiki/%E5%8F%91%E5%B8%83/%E8%AE%A2%E9%98%85"&gt;發布 / 訂閱模式&lt;/a&gt;，開發者可以透過第三方開源工具像是 &lt;a href="https://redis.io"&gt;Redis&lt;/a&gt;, &lt;a href="https://nsq.io"&gt;NSQ&lt;/a&gt; 或 &lt;a href="https://nats.io"&gt;Nats&lt;/a&gt; 等來實現訂閱機制，本篇則是會教大家如何用 &lt;a href="https://go.dev"&gt;Go 語言&lt;/a&gt;寫出一個單機版本的 Pub/Sub 模式，在單一系統內非常輕量級，且不需要靠第三方服務就可以輕易實現。底下會直接用單一訂閱 Topic 機制來撰寫 Publisher 及 Subscriber。&lt;/p&gt;</description></item><item><title>Go 語言實作 Graceful Shutdown 套件</title><link>https://blog.wu-boy.com/2022/04/new-package-graceful-shutdown-in-golang/</link><pubDate>Sun, 17 Apr 2022 07:41:33 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2022/04/new-package-graceful-shutdown-in-golang/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/D5FfhY5.png" alt="background job 01"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;歡迎追蹤 &lt;a href="https://github.com/appleboy/graceful"&gt;appleboy/graceful&lt;/a&gt; 套件&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://go.dev"&gt;Go 語言&lt;/a&gt;撰寫的服務如何優雅的重新啟動，避免工作執行到一半就被關閉，是一個很中要的議題。故實作了簡易 Graceful Shutdown 套件，讓服務都可以支援此功能，如果不知道什麼是 Graceful Shutdown 的朋友們，可以參考這篇『 &lt;a href="https://blog.wu-boy.com/2020/02/what-is-graceful-shutdown-in-golang/"&gt;[Go 教學] 什麼是 graceful shutdown?&lt;/a&gt;』，本篇跟大家介紹一個好用的套件『&lt;a href="https://github.com/appleboy/graceful"&gt;appleboy/graceful&lt;/a&gt;』，使用後。不用再擔心背景的服務沒完成就被關閉，不只是背景的工作需要處理，在關閉服務前，開發者也要確保部分工作要在關閉服務前才執行，像是關閉 Database 及 Redis 連線。&lt;/p&gt;</description></item><item><title>使用 AWS IAM Policy 設定 S3 Bucket 底下特定目錄權限</title><link>https://blog.wu-boy.com/2022/04/grant-access-to-user-specific-folders-in-amazone-s3-bucket/</link><pubDate>Sat, 02 Apr 2022 15:49:44 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2022/04/grant-access-to-user-specific-folders-in-amazone-s3-bucket/</guid><description>&lt;p&gt;如何有效控制 &lt;a href="https://aws.amazon.com/tw/"&gt;AWS&lt;/a&gt; User 能看到哪些功能，以及執行哪些操作，最仰賴的就是 &lt;a href="https://aws.amazon.com/iam/"&gt;AWS Identity and Access Management&lt;/a&gt; (簡稱 IAM)，IAM 可以讓管理者透過 UI 或自定義 JSON 格式來客製化使用者權限。剛好最近跟其他團隊合作到一個專案，需求就是開發者透過 Web 進行 AI Model 訓練，訓練前 &lt;a href="https://aws.amazon.com/pm/sagemaker"&gt;SageMaker&lt;/a&gt; 會將使用者的 Dataset 下載到容器內，接著開始訓練，而團隊將此下載 Dataset 動作記錄到 AWS S3 Bucket 的 &lt;code&gt;syslog&lt;/code&gt; 目錄內，確保檔案存取紀錄。最後將目錄底下的檔案，開權限給客戶進行查看，避免管理者或其他 User 不小心存取到別人的 Dataset 資料。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/zg8abD1.png" alt="log"&gt;&lt;/p&gt;
&lt;p&gt;一般來說在 Bucket 內會有許多 Sub-Folder，而 AWS 透過 IAM 方式設定 User 只能存取特定的目錄。可以參考 AWS 官方這篇文章『&lt;a href="https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/"&gt;Writing IAM Policies: Grant Access to User-Specific Folders in an Amazon S3 Bucket&lt;/a&gt;』。&lt;/p&gt;</description></item><item><title>推薦自動化監控網站運行服務 - Gatus</title><link>https://blog.wu-boy.com/2022/03/automated-service-health-dashboard-gatus/</link><pubDate>Sun, 20 Mar 2022 09:59:59 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2022/03/automated-service-health-dashboard-gatus/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/duUxnBC.jpg" alt="gatus dashboard"&gt;&lt;/p&gt;
&lt;p&gt;部署服務後，怎麼明確讓團隊清楚知道服務的運行狀況，就像 GitHub 就是提供&lt;a href="https://www.githubstatus.com/"&gt;整體運行的網頁&lt;/a&gt;，監控常用的操作指令，像是 Git Operations, Webhooks 或 &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt; 等服務狀況。讓開發者遇到問題的時候，可以即時查看現在狀態做出相對應動作。而類似這樣的線上服務很多，像是 Atlassian 的 &lt;a href="https://www.atlassian.com/software/statuspage"&gt;Statuspage&lt;/a&gt; 或 &lt;a href="https://pingpong.one/"&gt;PingPong&lt;/a&gt; 等，更多免費服務可以直接參考 &lt;a href="https://github.com/ivbeg/awesome-status-pages"&gt;awesome-status-pages&lt;/a&gt;。而本篇要介紹一套開源軟體 &lt;a href="https://github.com/TwiN/gatus"&gt;Gatus&lt;/a&gt;，它是用 &lt;a href="https://go.dev"&gt;Go 語言&lt;/a&gt;撰寫出來的，非常輕量。&lt;/p&gt;</description></item><item><title>使用 pyroscope adhoc 加速找到效能瓶頸</title><link>https://blog.wu-boy.com/2022/02/pyroscope-adhoc-profiling-in-golang/</link><pubDate>Sun, 27 Feb 2022 09:07:55 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2022/02/pyroscope-adhoc-profiling-in-golang/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/KMl96Ks.png" alt="pyroscope profiling"&gt;&lt;/p&gt;
&lt;p&gt;大家在開發軟體時，會快速迭代專案時程跟需求，功能越多，系統就會開始出現效能上的瓶頸，而最快的解決方式就是先垂直擴展，把 CPU 跟記憶體先往上加，但是這是治標不治本，所以之前有推薦大家一套如何在服務執行時，快速找到哪個地方執行較慢，請參考之前的文章『&lt;a href="https://blog.wu-boy.com/2021/03/debug-performance-issues-using-pyroscope/"&gt;即時效能分析工具 Pyroscope&lt;/a&gt;』，&lt;a href="https://pyroscope.io"&gt;Pyroscope&lt;/a&gt; 目前支援了很多語言，像是 Go, Python, Java, Ruby, Rust, PHP 及 .Net，如果你想要快速在本地端找到效能瓶頸，請繼續將本篇看完。底下會用 &lt;a href="https://go.dev"&gt;Go 語言&lt;/a&gt;實際範例教大家。&lt;/p&gt;</description></item><item><title>Go 1.18 generics 新套件 constraints, slices 及 maps</title><link>https://blog.wu-boy.com/2022/02/golang-1-18-generics-constraints-slices-maps/</link><pubDate>Sat, 19 Feb 2022 11:38:38 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2022/02/golang-1-18-generics-constraints-slices-maps/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;今天看到 Go1.18 終於推出 &lt;a href="https://groups.google.com/g/golang-announce/c/QHL1fTc352o/m/5sE6moURBwAJ"&gt;RC1 版本&lt;/a&gt;了，離正式 Release 又跨出一大步了。繼上一篇『&lt;a href="https://blog.wu-boy.com/2022/02/introduction-to-golang-1-18-generics/"&gt;初探 golang 1.18 generics 功能&lt;/a&gt;』教學後，本次來看看 go1.18 推出三個新的 Package: &lt;a href="https://pkg.go.dev/golang.org/x/exp/constraints"&gt;constraints&lt;/a&gt;, &lt;a href="https://pkg.go.dev/golang.org/x/exp/slices"&gt;slices&lt;/a&gt; 及 &lt;a href="https://pkg.go.dev/golang.org/x/exp/maps"&gt;maps&lt;/a&gt; 使用方式。目前這三個 Package 會統一放在 &lt;code&gt;golang.org/x/exp&lt;/code&gt; 內。本篇程式碼都可以在&lt;a href="https://github.com/go-training/training/tree/master/example46-go-1.18-generics-part2"&gt;這邊找到&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>初探 golang 1.18 generics 功能</title><link>https://blog.wu-boy.com/2022/02/introduction-to-golang-1-18-generics/</link><pubDate>Fri, 11 Feb 2022 08:18:19 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2022/02/introduction-to-golang-1-18-generics/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://go.dev/"&gt;Go 語言&lt;/a&gt;在近期內會推出 &lt;a href="https://tip.golang.org/doc/go1.18"&gt;1.18&lt;/a&gt; 版本，而 1.18 最重要的功能之一就是 &lt;a href="https://go.dev/doc/tutorial/generics"&gt;generics&lt;/a&gt;，在此版本之前，最令人詬病的就是 Go 無法支援多種 Type 當參數，造成在寫 Package 時候多出很多重複性的程式碼，本篇會教大家基礎認識什麼是 generics，及怎麼使用。&lt;/p&gt;</description></item><item><title>infrastructure as code 優勢及工具選擇</title><link>https://blog.wu-boy.com/2021/11/introduction-to-infra-structure-as-code-pulumi-vs-terraform/</link><pubDate>Wed, 17 Nov 2021 08:18:19 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/11/introduction-to-infra-structure-as-code-pulumi-vs-terraform/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/Ljxw0ng.png" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;今年在 &lt;a href="https://cloudsummit.ithome.com.tw/"&gt;Cloud Summit&lt;/a&gt; 會議上分享『&lt;a href="https://cloudsummit.ithome.com.tw/2021/speaker-page/69"&gt;初探 Infrastructure as Code 工具 Pulumi&lt;/a&gt;』，主要幾項重點跟大家分享&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;什麼是 infrastructure as code 簡稱 IaC&lt;/li&gt;
&lt;li&gt;IaC 對團隊帶來什麼優勢&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pulumi.com/"&gt;Pulumi&lt;/a&gt; 及 &lt;a href="https://www.terraform.io/"&gt;Terraform&lt;/a&gt; 兩大工具比較&lt;/li&gt;
&lt;li&gt;Pulumi 價格比較&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;IaC 帶來的好處跟優勢如下&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;建置 CI/CD 自動化 (不用依賴 UI 操作)&lt;/li&gt;
&lt;li&gt;版本控制 (審核避免錯誤)&lt;/li&gt;
&lt;li&gt;重複使用 (減少建置時間)&lt;/li&gt;
&lt;li&gt;環境一至性 (測試及正式)&lt;/li&gt;
&lt;li&gt;團隊成長 (分享學習資源)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;內容會偏向介紹 Pulumi 工具居多，如果想多了解，參考本投影片準沒錯&lt;/p&gt;</description></item><item><title>Introduction to Open Policy Agent 初探權限控管機制</title><link>https://blog.wu-boy.com/2021/10/introduction-to-open-police-agent-in-mopconf/</link><pubDate>Sun, 24 Oct 2021 11:39:20 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/10/introduction-to-open-police-agent-in-mopconf/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/qLGheyjm3eVL-TRP_MT1X9j2QrNrtIIAlVPmLbvNGWcLkqfUTpH87D2GCzYmce8eU88oMF-82lSqT6DwOByPWEKVZP4nGWT-IZFDvpVwnil2AeXZaYxZN5J33IpfsYfP6mljV3S51R4=w1920-h1080" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;很高興可以在 &lt;a href="https://mopcon.org/2021/"&gt;Mopconf&lt;/a&gt; 分享 &lt;a href="https://www.openpolicyagent.org/"&gt;Open Policy Agent&lt;/a&gt;。本議程最主要是跟大家初步分享 OPA 的概念，我們團隊如何將 OPA 導入系統架構，及分享如何設計 RBAC 及 &lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html"&gt;IAM Role&lt;/a&gt; 架構，底下是這次預計會分享的內容:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Why do we need a Policy Engine?&lt;/li&gt;
&lt;li&gt;Why do we choose Open Policy Agent?&lt;/li&gt;
&lt;li&gt;Workflow with Open Policy Agent?&lt;/li&gt;
&lt;li&gt;What is Policy Language (Rego)?&lt;/li&gt;
&lt;li&gt;RBAC and IAM Role Design&lt;/li&gt;
&lt;li&gt;Three ways to deploy an Open Policy Agent.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;可以參考另外兩篇介紹&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.wu-boy.com/2021/04/setup-rbac-role-based-access-control-using-open-policy-agent/"&gt;初探 Open Policy Agent 實作 RBAC (Role-based access control) 權限控管&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.wu-boy.com/2021/05/comunicate-with-open-policy-agent-using-resful-api/"&gt;使用 RESTful API 串接 Open Policy Agent&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果可以的話，大家可以給我一些回饋，請填寫&lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSfRuK40O1j5KIPHt6RQyY3Au77bW91kgGIEGOrNxsjxHUSwgA/viewform"&gt;會後問卷&lt;/a&gt;&lt;/p&gt;</description></item><item><title>如何發佈高品質的 Pull Request (簡稱 PR)</title><link>https://blog.wu-boy.com/2021/10/how-to-write-high-quality-pull-request/</link><pubDate>Wed, 06 Oct 2021 22:02:25 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/10/how-to-write-high-quality-pull-request/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/iQ6TfHQ.png" alt="code review"&gt;&lt;/p&gt;
&lt;p&gt;除了在公司團隊內負責審核各專案 PR 之外，也在 &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt; 上面提交多個 PR，並且與全世界各地開發者一起共同維護大型專案，一個好的 PR 可以加速專案的進行，且省下多數 Reviewr 寶貴的時間，故我自己整理底下幾點，來確保團隊同事之前有個共同的標準外，也大大降低 Review 時間，提升專案品質。&lt;/p&gt;</description></item><item><title>用 Supervisor 管理系統程式</title><link>https://blog.wu-boy.com/2021/09/control-system-process-using-supervisor-in-golang/</link><pubDate>Mon, 20 Sep 2021 18:55:22 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/09/control-system-process-using-supervisor-in-golang/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/4uBJZAG.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;相信大家都有管理 Linux 主機 Process 的經驗，用的工具也是千奇百種，但是肯定對 &lt;a href="https://www.python.org/"&gt;Python&lt;/a&gt; 版本的 &lt;a href="http://supervisord.org/"&gt;Supervisor&lt;/a&gt; 並不陌生，這套工具相當好用，可以監控不同的 Process 狀態，也可以自動重啟。而本篇要介紹用 &lt;a href="http://golang.org/"&gt;Go 語言&lt;/a&gt;寫出來的開源套件『&lt;a href="https://github.com/ochinchina/supervisord"&gt;Supervisord&lt;/a&gt;』，作者提到為什麼要用 Go 語言開發此工具，原因很簡單，就是透過 Go 語言的跨平台優勢，寫一套程式，可以直接跑在任何平台，管理者就不需要再為了 Python 環境而煩惱。&lt;/p&gt;</description></item><item><title>NSQ Consumers 處理 Graceful Shutdown 技巧</title><link>https://blog.wu-boy.com/2021/09/graceful-shutdown-with-nsq-consumers/</link><pubDate>Sun, 19 Sep 2021 14:50:42 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/09/graceful-shutdown-with-nsq-consumers/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/i98snGt.png" alt="Imgur"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nsq.io/"&gt;NSQ&lt;/a&gt; 是一套即時分散式處理消息平台，目的在於提供大量的訊息傳遞，團隊可以依據不同的任務來設計分散式架構去消化大量的訊息。而我在最近開發了一套開源項目 &lt;a href="https://github.com/golang-queue/queue"&gt;golang-queue/queue&lt;/a&gt;，這套詳細的資訊會再開另一篇進行討論，簡單來說這個套件可以讓開發者使用在單機的 Producer 及 Consumer 架構，使用的就是 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;的 Goroutine 及 Channel，又或者直接搭配 &lt;a href="https://nsq.io/"&gt;NSQ&lt;/a&gt;, &lt;a href="https://nats.io/"&gt;NATs&lt;/a&gt; 或 &lt;a href="https://redis.io/topics/pubsub"&gt;Redis Pub/Sub&lt;/a&gt; 第三方的系統取代內建的 Channel 機制。而本篇會講在整合 NSQ 要處理 &lt;a href="https://blog.wu-boy.com/2020/02/what-is-graceful-shutdown-in-golang/"&gt;Graceful Shutdown&lt;/a&gt; 所遇到的問題跟解決方式。&lt;/p&gt;</description></item><item><title>[竹北美食] 中正西路必吃美食 - 鴨肉麵 + 肉絲炒飯</title><link>https://blog.wu-boy.com/2021/09/%E4%B8%AD%E6%AD%A3%E8%A5%BF%E8%B7%AF%E5%BF%85%E5%90%83%E7%BE%8E%E9%A3%9F-%E9%B4%A8%E8%82%89%E9%BA%B5-%E8%82%89%E7%B5%B2%E7%82%92%E9%A3%AF/</link><pubDate>Fri, 10 Sep 2021 20:26:53 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/09/%E4%B8%AD%E6%AD%A3%E8%A5%BF%E8%B7%AF%E5%BF%85%E5%90%83%E7%BE%8E%E9%A3%9F-%E9%B4%A8%E8%82%89%E9%BA%B5-%E8%82%89%E7%B5%B2%E7%82%92%E9%A3%AF/</guid><description>&lt;p&gt;2022/01/01 &lt;strong&gt;更新漲價後的價格&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/qAQp03M.jpg" alt="Imgur"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/l7UYI8I.jpg" alt="Imgur"&gt;&lt;/p&gt;
&lt;p&gt;底下文章內是之前的價格，大家參考看看。另外附上買炒飯大碗的圖片:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/YvoR01G.jpg" alt="Imgur"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/JQkbm4y.jpg" alt="Imgur"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/eLgzIOW.jpg" alt="炒飯"&gt;&lt;/p&gt;
&lt;p&gt;來介紹竹北華興重劃區這邊的美食之一『鴨肉麵 + 肉絲炒飯』，這間店位於中正西路上面，也是唯一一間賣鴨肉的，週末幾乎都是客滿，現場至少都要等 30 分鐘以上，其中最必要吃的就是鴨肉麵跟肉絲炒飯，炒飯記得點大碗的，沒記錯是 90 元，物價會上漲，要吃就盡快吃，另外也可以點一盤鴨肉，應該是 150 元，可以跟老闆娘說要腿的部位，有帶小朋友的，就這樣點就對了，避免肉太硬，小孩子吃一吃說吞不下去，就浪費了。&lt;/p&gt;</description></item><item><title>用 AWS EFS 或 FSx Lustre 加速 Sagemaker AI 模型訓練</title><link>https://blog.wu-boy.com/2021/09/speed-up-amazon-sagemaker-training-using-efs-or-fsx-lustre/</link><pubDate>Sat, 04 Sep 2021 12:43:19 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/09/speed-up-amazon-sagemaker-training-using-efs-or-fsx-lustre/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/X4wpl6d.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;前不久寫過一篇『&lt;a href="https://blog.wu-boy.com/2021/06/integratate-sagemaker-workflow-using-golang-api/"&gt;AI 團隊整合導入 AWS SageMaker 流程&lt;/a&gt;』介紹如何用 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;整合 &lt;a href="https://aws.amazon.com/tw/pm/sagemaker/"&gt;SageMaker API&lt;/a&gt;。本篇會介紹在訓練 AI 模型前，如何將 Dataset 準備好並整合 SageMaker，過程中遇到什麼問題跟挑戰。團隊提供 AI 平台讓使用者可以上傳自家的 Dataset 搭配團隊內部預設的 Dataset 進行 AI 模型的訓練，最後將模型提供給使用者下載使用，簡單來說，使用者只需要提供 Dataset 並把 AI 訓練參數設定完畢，就可以拿到最後的模型進行後續的整合開發。底下我們探討使用者上傳 Dataset 的流程。&lt;/p&gt;</description></item><item><title>開源專案 Drone CI/CD 平台真的免費嗎？</title><link>https://blog.wu-boy.com/2021/08/drone-license/</link><pubDate>Sun, 01 Aug 2021 09:57:19 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/08/drone-license/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/2P2MVNK.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;自己推行 &lt;a href="https://www.drone.io/"&gt;Drone&lt;/a&gt; CI/CD 開源平台已經多年，很多人都會問我說，Drone 真的可以免費使用嗎？用在開源上面，或者是導入進公司內部團隊，這費用該怎麼計算呢？好的，本篇就帶大家了解 Drone 用在開源上或是公司內部團隊上需要注意的地方，官方其實有寫了一整頁 &lt;a href="https://docs.drone.io/enterprise/"&gt;FAQ 非常詳細&lt;/a&gt;，底下是我整理幾點給大家知道。&lt;/p&gt;</description></item><item><title>打造最小 Python Docker 容器</title><link>https://blog.wu-boy.com/2021/07/building-minimal-docker-containers-for-python-applications/</link><pubDate>Fri, 09 Jul 2021 08:28:20 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/07/building-minimal-docker-containers-for-python-applications/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/p8LKFhI.png" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;現在已經是容器 (container) 的時代，團隊之間合作肯定要打包統一的 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; Image 來解決環境不一致的問題，但是容器的大小決定了部署微服務的時間，本篇來介紹如何打造最小的 &lt;a href="https://www.python.org/"&gt;Python&lt;/a&gt; 容器。如果你需要跨部門合作，Docker 絕對是最棒的工具，讓大家不用為了環境煩惱。底下透過 &lt;a href="https://flask.palletsprojects.com/en/2.0.x/"&gt;Flask&lt;/a&gt; Application 來介紹如何撰寫 &lt;a href="https://docs.docker.com/engine/reference/builder/"&gt;Dockerfile&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>AI 團隊整合導入 AWS SageMaker 流程</title><link>https://blog.wu-boy.com/2021/06/integratate-sagemaker-workflow-using-golang-api/</link><pubDate>Sun, 27 Jun 2021 11:35:53 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/06/integratate-sagemaker-workflow-using-golang-api/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/REuJgTP.png" alt="Flow"&gt;&lt;/p&gt;
&lt;h2 id="團隊困境"&gt;團隊困境&lt;/h2&gt;
&lt;p&gt;如果團隊未來想把&lt;a href="https://medium.com/@troy801125/machine-learning-%E4%BA%BA%E5%B7%A5%E6%99%BA%E6%85%A7%E5%92%8C%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92%E6%98%AF%E4%BB%80%E9%BA%BC-49a6ba41ab3e"&gt;機器學習&lt;/a&gt;推廣成一個服務，可以讓開發者帶入不同的參數進行客製化的學習，最終拿到學習過的 Model。或是團隊資源不夠，想要使用大量的 GPU 資源來加速 AI Model Training，這時就是要朝向使用第三方資源像是 &lt;a href="https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html"&gt;AWS SageMaker&lt;/a&gt; 來進行整合。而在團隊內會分成機器學習團隊，及後端團隊，前者是專門進行資料分析及 AI Model 演算法及程式碼開發，後者則是專攻全部工作流程，從產生測試資料，前置準備，到 Training Model，及將產生的結果發送給開法者，這整段流程會由後端團隊進行串接。所以當我們要用第三方服務時 AWS SageMaker，對於機器學習團隊來說，要將整個環境打包成容器模式，並且符合 SageMaker 所規定的格式，&lt;strong&gt;過程相當複雜&lt;/strong&gt;，而為了讓開發環境統一，我們使用了&lt;a href="https://docs.aws.amazon.com/sagemaker/latest/dg/docker-containers.html"&gt;容器技術&lt;/a&gt; (Docker Container) 來進行 SageMaker 串接，本篇會教大家如何整合 SageMaker 流程，讓機器學習團隊可以專注於 Model 流程開發，而不需要花時間在整合容器技術並符合 SageMaker 格式。&lt;/p&gt;</description></item><item><title>用 docker-compose 優雅關閉服務</title><link>https://blog.wu-boy.com/2021/06/graceful-stop-service-using-docker-compose-in-golang/</link><pubDate>Sun, 20 Jun 2021 10:28:17 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/06/graceful-stop-service-using-docker-compose-in-golang/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;大家應該遇過如果服務還有工作還沒處理完，服務要進行更新，需要等到全部工作處理完成才可以將服務的停止，而當服務收到關閉通知信號時，第一要先停止接受 Job 任務，接著等待 Worker 將手上 Job 處理完畢後，才停止服務，接著更新再上線。而這狀況怎麼透過 docker-compose 來處理停止服務，這就是本篇的重點。文章內會用 &lt;a href="https://golang.org/"&gt;Go 語言&lt;/a&gt;當教學範例，如何接受 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 傳來的 Signal 訊號，接受訊號後該如何處理，及如何設定 docker-compose 的 YAML 檔案確保所有的工作都可以正常執行完畢。&lt;/p&gt;
&lt;p&gt;之前已經有寫過幾篇關於 Graceful Shutdown 教學文章，大家有興趣可以先閱讀底下教學連結資訊，而本篇最主要是紀錄在如何用 docker 指令優雅關閉容器服務，尤其是關閉服務前，可以讓原本服務內的工作可以正常做完，才正式關閉。在本文開始前，先將 &lt;a href="https://www.docker.com/"&gt;docker&lt;/a&gt; 及 &lt;a href="https://docs.docker.com/compose/compose-file/"&gt;docker-compose&lt;/a&gt; 版本資訊貼出來，避免有資訊的落差，畢竟 docker-compose 在不同版本之間有不同的設定方式。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.wu-boy.com/2020/02/graceful-shutdown-using-docker-compose-with-rolling-update/"&gt;[Go 教學] graceful shutdown 搭配 docker-compose 實現 rolling update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.wu-boy.com/2020/02/graceful-shutdown-with-multiple-workers/"&gt;[Go 教學] graceful shutdown with multiple workers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Go 語言內 new 跟 make 使用時機</title><link>https://blog.wu-boy.com/2021/06/what-is-different-between-new-and-make-in-golang/</link><pubDate>Tue, 08 Jun 2021 08:51:18 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/06/what-is-different-between-new-and-make-in-golang/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="logo"&gt;&lt;/p&gt;
&lt;p&gt;大家接觸 Go 語言肯定對 &lt;code&gt;new&lt;/code&gt; 跟 &lt;code&gt;make&lt;/code&gt; 不陌生，但是什麼時候要使用 &lt;code&gt;new&lt;/code&gt; 什麼時候用 &lt;code&gt;make&lt;/code&gt;，也許是很多剛入門的開發者比較不懂，本篇就簡單筆記 &lt;code&gt;new&lt;/code&gt; 跟 &lt;code&gt;make&lt;/code&gt; 的差異及使用時機。&lt;/p&gt;</description></item><item><title>將部落格從 Wordpress 轉換到 Hugo</title><link>https://blog.wu-boy.com/2021/05/migrate-wordpress-to-hugo/</link><pubDate>Sun, 30 May 2021 13:34:20 +0800</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/05/migrate-wordpress-to-hugo/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/hJRgySS.png" alt="blog cover"&gt;&lt;/p&gt;
&lt;p&gt;自己的 Blog 從 2006 年開始撰寫各類技術性文章，用的都是 &lt;a href="https://wordpress.com/zh-tw/"&gt;Wordpress&lt;/a&gt; 系統，這是當時最盛行的 &lt;a href="https://github.com/WordPress/WordPress"&gt;Blog 開源專案&lt;/a&gt;，想想當年第一個學習的語言是 &lt;a href="https://www.php.net/"&gt;PHP&lt;/a&gt;，這個選擇也陪伴了我 15 年以上，而是什麼原因讓我想從 Wordpress 轉換到 Hugo 呢？&lt;/p&gt;</description></item><item><title>Docker 容器實戰</title><link>https://blog.wu-boy.com/docker-course/</link><pubDate>Sat, 29 May 2021 06:37:19 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/docker-course/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/fr-DxVaFf3lryJs-FUfDOp-azBpG7_atca4zJGuipRMUshXX-ICZXB9PdrqevF8DHRwUhG8gVrfI8jSv5LjS0Yj4R-dovaucEyCZ8U6hz68iYYU30RTFqdjO-u8ozGaPmPsyD5Ax-4c=w1920-h1080" alt="logo"&gt;&lt;/p&gt;
&lt;h2 id="課程介紹"&gt;課程介紹&lt;/h2&gt;
&lt;p&gt;現在軟體工程師如果還不知道 Docker 就已經太落伍了，本課程著重在實戰上面的介紹。藉由實戰經驗來了解如何使用 Docker 容器技術，透過容器可以減少開發環境建置時間，除了開發環境，Docker 也可以協助快速建置雲端環境，您不用在主機上面從無到有建置 Node.js 或 PHP 等相關設定環境，大大減少維運或開發者建置時間，這些省下來的時間都可以拿來開發多少功能需求了。所以你還不會 Docker 嗎？現在各種求職平台或工作內容都會寫上 Docker 需求，雖然 Docker 容器技術不是必須，但是這都是加分條件，開發者會 Docker 真的會讓團隊戰力更加完整。現在就開始加入學習 Docker 實戰吧。&lt;/p&gt;
&lt;h2 id="課程緣由"&gt;課程緣由&lt;/h2&gt;
&lt;p&gt;在各種教學平台上已經有很多課程介紹 Docker 容器技術，很多 Docker 的基礎教學都非常完整，所以這門課程會著重在 Docker 實戰，藉由工作上會用到的 Docker 容器技術加以介紹，所以課程內容會相當廣泛，介紹各種不同的工具及平台來協助團隊在部署或架構面上更完整。像是底下一系列相關應用及部署技巧&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用 docker-compose 快速安裝 Gitea (Git Host 最將選擇)&lt;/li&gt;
&lt;li&gt;用 Docker 直接快速部署到 Heroku 平台&lt;/li&gt;
&lt;li&gt;用 docker-compose 實現 rolling update 機制&lt;/li&gt;
&lt;li&gt;用 Docker 搭配 GitHub Action 部署 Go 語言服務&lt;/li&gt;
&lt;li&gt;用 Docker 快速建置 PHP Laravel 開發環境&lt;/li&gt;
&lt;li&gt;介紹 docker 使用 cache from 機制加快 docker image 編譯&lt;/li&gt;
&lt;li&gt;使用 Traefik 搭配容器服務&lt;/li&gt;
&lt;li&gt;透過 Docker 也可以將 Flutter 自動化測試&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;未來預計還會有像是 Kubernetes 部署及建制，或者是 Prometheus + Grafana 系統效能監控等主題。&lt;/p&gt;</description></item><item><title>如何取得上傳進度條 progress bar 相關數據及實作 Graceful Shutdown</title><link>https://blog.wu-boy.com/2021/05/graceful-shutdown-with-progress-bar-in-golang/</link><pubDate>Fri, 21 May 2021 04:52:17 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/05/graceful-shutdown-with-progress-bar-in-golang/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/ASkclquxfpPTlJ_QWnhZjB5katrz18NyK4zt2w47UM8gS71MCjWodDoGp50nHRyeQx8MfbJJbwWjfIWCoKbZYLkec7a-FqMEw-r9Lh3U8XGAuwEqWa3DVMB2lkhdgMQUI1IMiKWL5Ss=w1920-h1080" alt=""&gt;&lt;/p&gt;
&lt;p&gt;由於專案需求，需要開發一套 CLI 工具，讓 User 可以透過 CLI 上傳大檔案來進行 Model Training，請參考上面的流程圖。首先第一步驟會先跟 API Server 驗證使用者，驗證完畢就開始上傳資料到 &lt;a href="https://aws.amazon.com/tw/s3/"&gt;AWS S3&lt;/a&gt; 或其他 Storage 空間，除了上傳過程需要在 CLI 顯示目前進度，另外也需要將目前上傳的進度 (速度, 進度及剩餘時間) 都上傳到 API Server，最後在 Web UI 介面透過 &lt;a href="https://www.apollographql.com/docs/react/data/subscriptions/"&gt;GraphQL Subscription&lt;/a&gt; 讓使用者可以即時看到上傳進度數據。&lt;/p&gt;
&lt;p&gt;而 CLI 上傳進度部分，我們選用了一套開源套件 &lt;a href="https://github.com/cheggaaa/pb"&gt;cheggaaa/pb&lt;/a&gt;，相信有在寫 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;都並不會陌生。而此套件雖然可以幫助在 Terminal 顯示進度條，但是有些接口是沒有提供的，像是即時速度，上傳進度及剩餘時間。本篇教大家如何實作這些數據，及分享過程會遇到相關問題。&lt;/p&gt;</description></item><item><title>MongoDB 效能調校紀錄</title><link>https://blog.wu-boy.com/2021/05/mongodb-performance-tunning/</link><pubDate>Sun, 16 May 2021 00:57:45 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/05/mongodb-performance-tunning/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/DZKO3gMs5RhQ0-uGU2Y-uaTsb7HKCJU3lH91uggni5HA-fpDMqgvKPwHRwuo-jlCbAJZYyY9TKKovtCDT7OFgiclb2VYz58HwmDeHUX6FjlwfnuTkaTZxYudTIiuJ6yWsuNu2vs1vTQ=w1920-h1080" title="mongodb"&gt;&lt;img src="https://lh3.googleusercontent.com/DZKO3gMs5RhQ0-uGU2Y-uaTsb7HKCJU3lH91uggni5HA-fpDMqgvKPwHRwuo-jlCbAJZYyY9TKKovtCDT7OFgiclb2VYz58HwmDeHUX6FjlwfnuTkaTZxYudTIiuJ6yWsuNu2vs1vTQ=w1920-h1080" alt="mongodb" title="mongodb"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最近剛好在實作 &lt;a href="https://prometheus.io/"&gt;Prometheus&lt;/a&gt; + &lt;a href="https://grafana.com/"&gt;Grafana&lt;/a&gt; 的時候，對 MongoDB 做了容器 CPU 使用率 (&lt;code&gt;container_cpu_usage_seconds_total&lt;/code&gt;) 的監控，Metrics 寫法如下:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sum(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rate(container_cpu_usage_seconds_total{name!~&lt;span style="color:#cd5555"&gt;&amp;#34;(^&lt;/span&gt;$&lt;span style="color:#cd5555"&gt;|^0_.*)&amp;#34;&lt;/span&gt;}[1m]))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;by (name)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;從上面的 Metrics 可以拉長時間來看，會發現專案的 MongoDB 非常不穩定，起起伏伏，這時候就需要來看看資料庫到底哪邊慢，以及看看哪個語法造成 CPU 飆高？&lt;/p&gt;
&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/FbcbJ75SVSEmNb94X6z9JsjkhKmuzjEGUesnTVxwcP2SGYWJpblQaD5ks02brR9kP9HYqP7KpbQAaoa7RUuBWi8EnXdN2eTCzekyGVmKAY4ltnmEnNrWerAzZkHIp9gGKieO71WUhJk=w1920-h1080" alt=""&gt;&lt;/p&gt;
&lt;p&gt;接著為了看 MongoDB 的 Log 紀錄，把 Grafana 推出的 &lt;a href="https://grafana.com/oss/loki/"&gt;Loki&lt;/a&gt;，也導入專案系統，將容器所有的 Log 都導向 Loki，底下可以看看 docker-compose 將 Log 輸出到 loki&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-6"&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-7"&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logging:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; driver: loki
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; loki-url: &amp;#34;http://xxxxxxx/loki/api/v1/push&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; loki-retries: &amp;#34;5&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; loki-batch-size: &amp;#34;400&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; loki-external-labels: &amp;#34;environment=production,project=mongo&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/TooE3Q49jzI_FpbjXm4b3A_9aho8J4Qws64XmhVzDVbe6NPMCmgYmuw5bMRwnMgmk_lXxNHDU1n6RXwFGvoZvPxLuM6clRJ_ZGRC9S47rvFbm3k9v6v8qaHhC6vqsFkXENQYlRAqKn0=w1920-h1080" alt=""&gt;&lt;/p&gt;
&lt;p&gt;先看看結論，做法其實很簡單，找出相對應 Slow Query，把相關的欄位加上 Index，就可以解決了&lt;/p&gt;
&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/WgyOX8OOff6KGKlOvSvoNxzDsPGyiXBwPa_PX3O7L9AYSBfQ9VoNAP5s_HkbmMa7rokTnF--ZLnJ4p6oLqoTCV2Gyq7B696SEbTIrGIi1kDVtijVpZlYTklq3qbLFtpKGAQHeXxHE-Q=w1920-h1080" alt=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/nzKkL7J5x_LmoqTFYav5kKA8Jkp4E4s8OCOekd-fz2HAeU2ySC3DopumqMIevqelMN_bvw7Ug7BB2f6ZJeubCQzz4w1Uby709NqsqTEkQcJK7IwVkcHt_ZkArRjSlKfZvyWBE6ZBLnY=w1920-h1080" alt=""&gt;&lt;/p&gt;</description></item><item><title>使用 RESTful API 串接 Open Policy Agent</title><link>https://blog.wu-boy.com/2021/05/comunicate-with-open-policy-agent-using-resful-api/</link><pubDate>Tue, 04 May 2021 02:14:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/05/comunicate-with-open-policy-agent-using-resful-api/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/qLGheyjm3eVL-TRP_MT1X9j2QrNrtIIAlVPmLbvNGWcLkqfUTpH87D2GCzYmce8eU88oMF-82lSqT6DwOByPWEKVZP4nGWT-IZFDvpVwnil2AeXZaYxZN5J33IpfsYfP6mljV3S51R4=w1920-h1080" title="Open Policy Agent"&gt;&lt;img src="https://lh3.googleusercontent.com/qLGheyjm3eVL-TRP_MT1X9j2QrNrtIIAlVPmLbvNGWcLkqfUTpH87D2GCzYmce8eU88oMF-82lSqT6DwOByPWEKVZP4nGWT-IZFDvpVwnil2AeXZaYxZN5J33IpfsYfP6mljV3S51R4=w1920-h1080" alt="Open Policy Agent" title="Open Policy Agent"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上一篇『&lt;a href="https://blog.wu-boy.com/2021/04/setup-rbac-role-based-access-control-using-open-policy-agent/"&gt;初探 Open Policy Agent 實作 RBAC (Role-based access control) 權限控管&lt;/a&gt;』介紹了如何透過 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;直接嵌入 Open Policy Agent (簡稱 OPA)設定檔，並透過 Go 套件直接查詢使用者權限。由於目前 OPA 只有支援三種模式串接各種不同的 Application，一種是透過 Go 語言直接整合，詳細請看上一篇教學，另一種是透過 RESTful API，也就是本篇的教學，最後一種是透過 &lt;a href="https://webassembly.org/"&gt;WebAssembly&lt;/a&gt; 讓其他 application 可以直接讀取。之後有機會再來寫 WebAssembly 教學。而本篇將帶您了解如何透過 RESTful API 方式來完成 &lt;a href="https://en.wikipedia.org/wiki/Role-based_access_control"&gt;RBAC 權限控管&lt;/a&gt;，其實我比較期待支援 &lt;a href="https://grpc.io/"&gt;gRPC&lt;/a&gt; 模式，但是看到這篇 &lt;a href="https://github.com/open-policy-agent/opa/issues/841"&gt;issue 提到&lt;/a&gt;，OPA 現在已經支援 Plugin 模式，大家想擴充的，可以自行處理。&lt;/p&gt;</description></item><item><title>初探 Open Policy Agent 實作 RBAC (Role-based access control) 權限控管</title><link>https://blog.wu-boy.com/2021/04/setup-rbac-role-based-access-control-using-open-policy-agent/</link><pubDate>Sun, 18 Apr 2021 07:24:13 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/04/setup-rbac-role-based-access-control-using-open-policy-agent/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/qLGheyjm3eVL-TRP_MT1X9j2QrNrtIIAlVPmLbvNGWcLkqfUTpH87D2GCzYmce8eU88oMF-82lSqT6DwOByPWEKVZP4nGWT-IZFDvpVwnil2AeXZaYxZN5J33IpfsYfP6mljV3S51R4=w1920-h1080" title="Open Policy Agent"&gt;&lt;img src="https://lh3.googleusercontent.com/qLGheyjm3eVL-TRP_MT1X9j2QrNrtIIAlVPmLbvNGWcLkqfUTpH87D2GCzYmce8eU88oMF-82lSqT6DwOByPWEKVZP4nGWT-IZFDvpVwnil2AeXZaYxZN5J33IpfsYfP6mljV3S51R4=w1920-h1080" alt="Open Policy Agent" title="Open Policy Agent"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最近公司內部多個專案都需要用到 &lt;a href="https://zh.wikipedia.org/wiki/%E4%BB%A5%E8%A7%92%E8%89%B2%E7%82%BA%E5%9F%BA%E7%A4%8E%E7%9A%84%E5%AD%98%E5%8F%96%E6%8E%A7%E5%88%B6"&gt;RBAC&lt;/a&gt; (Role-based access control) 權限控管，所以決定來找尋 Go 語言的解決方案及套件，在 Go 語言比較常聽到的就是 &lt;a href="https://casbin.org/"&gt;Casbin&lt;/a&gt;，大家眾所皆知，但是隨著專案變大，系統複雜性更高，希望未來可以打造一套可擴充性的權限機制，故網路上看到一篇 &lt;a href="https://gist.github.com/Wang-Kai/18fe4e662ef795805c14b1ec94932834"&gt;ladon vs casbin&lt;/a&gt; 的介紹文章，文章留言有中國開發者對於 Casbin 的一些看法，以及最後他推薦另一套 &lt;a href="https://www.cncf.io/"&gt;CNCF&lt;/a&gt; 的專案叫 &lt;a href="https://www.openpolicyagent.org/"&gt;Open Policy Agent&lt;/a&gt; 來實作權限控管機制。本篇直接來針對 Open Policy Agent 簡稱 (OPA) 來做介紹，並且用 Go 語言來驗證 RBAC 權限。底下是文章內其他開發者用過 Casbin 的感想&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1.使用覺得ladon的質量更好，支持類ACL和RBAC的權限系統，跟亞馬遜AWS的IAM非常契合 2.casbin那些庫的質量真的是無力吐槽，都沒有經常測試的東西就往github發，UI也到處bug，全都是畢業生寫的一樣，試用便知 3.casbin這個項目不讓提問題，提問題就給你關閉，作者很涉別人提問題 4.這些確實是本人的經歷，大家慎重選擇吧&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最後的推薦&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;強烈推薦CNCF今年畢業的策略引擎OPA（維護團隊主要是Google，微軟，Styra等），可以實現ABAC，RBAC，PBAC等各種權限模型，目前我們已經在生產環境中使用。 也是基於OPA實現的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本篇所使用的範例程式碼請從&lt;a href="https://github.com/go-training/opa-demo/tree/v0.0.1"&gt;這邊下載或觀看&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>為什麼 signal.Notify 要使用 buffered channel</title><link>https://blog.wu-boy.com/2021/03/why-use-buffered-channel-in-signal-notify/</link><pubDate>Tue, 30 Mar 2021 03:19:16 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/03/why-use-buffered-channel-in-signal-notify/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果不了解什麼是 buffer 或 unbuffer &lt;a href="https://tour.golang.org/concurrency/2"&gt;channel&lt;/a&gt; 的朋友們，可以參考&lt;a href="https://blog.wu-boy.com/2019/04/understand-unbuffered-vs-buffered-channel-in-five-minutes/"&gt;這篇文章&lt;/a&gt;先做初步了解，本文要跟大家介紹為什麼 signal.Notify 要使用 buffered channel 才可以，底下先來看看如何使用 signal.Notify，當我們要做 &lt;a href="https://blog.wu-boy.com/2020/02/what-is-graceful-shutdown-in-golang/"&gt;graceful shutdown&lt;/a&gt; 都會使用到這功能，想要正常關閉服務或連線，透過 signal 可以偵測訊號來源，執行後續相關工作 (關閉 DB 連線，檢查 Job 是否結束 &amp;hellip; 等)。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-15"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-16"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-17"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-18"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-18"&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-19"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-19"&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;package&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;main&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;import&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;os&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;os/signal&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008b45"&gt;main&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;// Set up channel on which to send signal notifications.&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;// We must use a buffered channel or risk missing the signal&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;// if we&amp;#39;re not ready to receive when the signal is sent.&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;c&lt;span style="color:#bbb"&gt; &lt;/span&gt;:=&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#658b00"&gt;make&lt;/span&gt;(&lt;span style="color:#8b008b;font-weight:bold"&gt;chan&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;os.Signal,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b452cd"&gt;1&lt;/span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;signal.&lt;span style="color:#008b45"&gt;Notify&lt;/span&gt;(c,&lt;span style="color:#bbb"&gt; &lt;/span&gt;os.Interrupt)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;// Block until a signal is received.&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;s&lt;span style="color:#bbb"&gt; &lt;/span&gt;:=&lt;span style="color:#bbb"&gt; &lt;/span&gt;&amp;lt;-c&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;fmt.&lt;span style="color:#008b45"&gt;Println&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;Got signal:&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;s)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;上面例子可以很清楚看到說明，假如沒有使用 buffered channel 的話，你有一定的風險會沒抓到 Signal。那為什麼會有這段說明呢？底下用其他例子來看看。&lt;/p&gt;</description></item><item><title>即時效能分析工具 Pyroscope</title><link>https://blog.wu-boy.com/2021/03/debug-performance-issues-using-pyroscope/</link><pubDate>Mon, 01 Mar 2021 13:20:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/03/debug-performance-issues-using-pyroscope/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/PIRK3Qj4WiToHgB0QDDf6fMHZxDmEswjWJdTIfVJ8xY7UtSau5C0mosjALev5qbJMflIfrIWsC3bPjjxHRRWQNAiFZSCLbVlin-r1-ICV-lOnopbnpRj4BiMKJnTbslpdo-n3CS2zbQ=w1920-h1080" alt=""&gt;&lt;/p&gt;
&lt;p&gt;當網站上線後，流量增加或短暫功能故障，都會造成使用者體驗相當不好，而這時該怎麼快速找到效能的瓶頸呢？通常 CPU 衝到 100% 時，有時候也蠻難複製及找出關鍵問題點。本篇會介紹一套工具叫 &lt;a href="https://pyroscope.io/"&gt;pyroscope&lt;/a&gt;，讓開發者可以快速找到效能瓶頸的程式碼。之前也寫了相關的效能瓶頸文章，可以參考看看『&lt;a href="https://blog.wu-boy.com/2020/06/golang-benchmark-pprof/"&gt;Go 語言用 pprof 找出程式碼效能瓶頸&lt;/a&gt;』或『&lt;a href="https://blog.wu-boy.com/2020/11/improve-parser-performance-using-go-benchmark-tool/"&gt;善用 Go 語言效能測試工具來提升執行效率&lt;/a&gt;』，上述兩篇都是針對 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;的效能分析文章，而 pyroscope 目前可以支援在 &lt;a href="https://www.python.org/"&gt;Python&lt;/a&gt;, &lt;a href="https://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; 或 &lt;a href="https://golang.org"&gt;Go&lt;/a&gt; 的環境。底下筆者會針對 Go 環境做介紹。&lt;/p&gt;</description></item><item><title>兩台電腦透過 croc 工具來傳送檔案 (簡單, 加密, 快速)</title><link>https://blog.wu-boy.com/2021/02/share-files-between-two-computer-using-croc-tool/</link><pubDate>Tue, 16 Feb 2021 03:46:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/02/share-files-between-two-computer-using-croc-tool/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/VHlioiLpLfqBnh5PnGjYhU6l7dZ2V3PURxz5RfulFL74xYYr4kL5EgkOa-OfLQyIALLgmRIcKlLHnbIENFe0cyv82XQW5ia0HgeNwm4u2ijNsjSQQjkrY4JJjloB_pHTOT-EtxzxOlw=w1920-h1080" alt="croc"&gt;&lt;/p&gt;
&lt;p&gt;兩台電腦之間該如何傳送檔案，其實方法有超多種的，像是 FTP 或透過 SSH 方式來傳送檔案，但是這些方法步驟都有點複雜，FTP 需要架設 FTP 服務，SSH 要學習 SCP 指令，那有沒有更好的方式從單一電腦點對點傳送檔案到另一台呢？傳送過程需要快速又要安全，本篇介紹一套用 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;寫的工具叫 &lt;a href="https://github.com/schollz/croc"&gt;croc&lt;/a&gt;，詳細的介紹可以參考看看&lt;a href="https://schollz.com/blog/croc6/"&gt;作者的 Blog 介紹&lt;/a&gt;，此工具有底下功能及優勢。&lt;/p&gt;</description></item><item><title>搶救 Terraform State 檔案</title><link>https://blog.wu-boy.com/2021/02/recovering-terraform-state/</link><pubDate>Sun, 14 Feb 2021 13:59:28 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/02/recovering-terraform-state/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/3ZDBZ2vZbRS1NTRzSg1ftpwIhEltm9iPe4-DFNE4y6yuLxbsvxGd6UQfLwcSvHb-AhGBcmtK36NiWBT1BeUzE8ra713qNV-cFnDk2pSVP_mqpz_MG5bpNg0Yx8jZc2-wlkOTb-xk1FE=w1920-h1080" alt="recovery the terraform state file"&gt;&lt;/p&gt;
&lt;p&gt;近期其中一個專案使用 Terraform 來管理 AWS 雲平台，初期預計只有我一個人在使用 Terraform，所以就沒有將 &lt;a href="https://www.terraform.io/docs/language/settings/backends/index.html"&gt;Backend State&lt;/a&gt; 放在 AWS S3 進行備份管理，這個粗心大意讓我花了大半時間來搶救 State (.tfstate) 檔案，而搶救過程也是蠻順利的，只是需要花時間用 &lt;strong&gt;&lt;a href="https://www.terraform.io/docs/cli/import/index.html"&gt;terraform import&lt;/a&gt;&lt;/strong&gt; 指令將所有的 State 狀態全部轉回來一次，當然不是每個 Resource 都可以正常運作，還是需要搭配一些修正才能全部轉換。&lt;/p&gt;
&lt;p&gt;結論: 請使用 &lt;code&gt;terraform import&lt;/code&gt; 指令，這是最終解法。&lt;/p&gt;</description></item><item><title>初探 Pulumi 上傳靜態網站到 AWS S3 (二)</title><link>https://blog.wu-boy.com/2021/02/upload-static-content-to-aws-s3-using-pulumi-02/</link><pubDate>Thu, 11 Feb 2021 07:55:36 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/02/upload-static-content-to-aws-s3-using-pulumi-02/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/pw/ACtC-3f_62JD9fB_bxTcLFJRGhsADlda4hjJjFkzsuDAx0SnMTGZNlX0kl1j4n3WMpjBcPP9BpNOYrIVsy80vqXwjhKSLP7hH_d01FqpdCjA_S9cCdrBXnqE14LndovknJXimWkPHVKo56bcaJgP0SpqDw3Vog=w1283-h571-no?authuser=0" title="cover"&gt;&lt;img src="https://lh3.googleusercontent.com/pw/ACtC-3f_62JD9fB_bxTcLFJRGhsADlda4hjJjFkzsuDAx0SnMTGZNlX0kl1j4n3WMpjBcPP9BpNOYrIVsy80vqXwjhKSLP7hH_d01FqpdCjA_S9cCdrBXnqE14LndovknJXimWkPHVKo56bcaJgP0SpqDw3Vog=w1283-h571-no?authuser=0" alt="cover" title="cover"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上一篇『&lt;a href="https://blog.wu-boy.com/2021/02/upload-static-content-to-aws-s3-using-pulumi-01/"&gt;初探 Pulumi 上傳靜態網站到 AWS S3 (一)&lt;/a&gt;』主要介紹 Pulumi 基本使用方式，而本篇會延續上一篇教學把剩下的章節教完，底下是本篇會涵蓋的章節內容:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;設定 Pulumi Stack 環境變數&lt;/li&gt;
&lt;li&gt;建立第二個 Pulumi Stack 環境&lt;/li&gt;
&lt;li&gt;刪除 Pulumi Stack 環境&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;讓開發者可以自由新增各種不同環境，像是 Testing 或 Develop 環境，以及該如何動態帶入不同環境的變數內容，最後可以透過單一指令將全部資源刪除。&lt;/p&gt;</description></item><item><title>初探 Pulumi 上傳靜態網站到 AWS S3 (一)</title><link>https://blog.wu-boy.com/2021/02/upload-static-content-to-aws-s3-using-pulumi-01/</link><pubDate>Thu, 11 Feb 2021 07:29:56 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/02/upload-static-content-to-aws-s3-using-pulumi-01/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/pw/ACtC-3f_62JD9fB_bxTcLFJRGhsADlda4hjJjFkzsuDAx0SnMTGZNlX0kl1j4n3WMpjBcPP9BpNOYrIVsy80vqXwjhKSLP7hH_d01FqpdCjA_S9cCdrBXnqE14LndovknJXimWkPHVKo56bcaJgP0SpqDw3Vog=w1283-h571-no?authuser=0" title="cover"&gt;&lt;img src="https://lh3.googleusercontent.com/pw/ACtC-3f_62JD9fB_bxTcLFJRGhsADlda4hjJjFkzsuDAx0SnMTGZNlX0kl1j4n3WMpjBcPP9BpNOYrIVsy80vqXwjhKSLP7hH_d01FqpdCjA_S9cCdrBXnqE14LndovknJXimWkPHVKo56bcaJgP0SpqDw3Vog=w1283-h571-no?authuser=0" alt="cover" title="cover"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上一篇作者提到了兩套 &lt;a href="https://www.pulumi.com/docs/get-started/install/"&gt;Infrastructure as Code&lt;/a&gt; 工具，分別是 &lt;a href="https://www.terraform.io/"&gt;Terraform&lt;/a&gt; 跟 &lt;a href="https://www.pulumi.com/"&gt;Pulumi&lt;/a&gt;，大家對於前者可能會是比較熟悉，那本篇用一個實際案例『建立 AWS S3 並上傳靜態網站』來跟大家分享如何從無開始一步一步使用 Pulumi。本教學使用的程式碼都可以在 &lt;a href="https://github.com/go-training/infrastructure-as-code-workshop/tree/main/pulumi/labs/lab01-modern-infrastructure-as-code"&gt;GitHub 上面瀏覽及下載&lt;/a&gt;。教學會拆成七個章節:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;建立 Pulumi 新專案&lt;/li&gt;
&lt;li&gt;設定 AWS 環境&lt;/li&gt;
&lt;li&gt;初始化 Pulumi 架構 (建立 S3 Bucket)&lt;/li&gt;
&lt;li&gt;更新 AWS 架構 (S3 Hosting)&lt;/li&gt;
&lt;li&gt;設定 Pulumi Stack 環境變數 (&lt;a href="https://blog.wu-boy.com/2021/02/upload-static-content-to-aws-s3-using-pulumi-02/"&gt;教學二&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;建立第二個 Pulumi Stack 環境 (&lt;a href="https://blog.wu-boy.com/2021/02/upload-static-content-to-aws-s3-using-pulumi-02/"&gt;教學二&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;刪除 Pulumi Stack 環境 (&lt;a href="https://blog.wu-boy.com/2021/02/upload-static-content-to-aws-s3-using-pulumi-02/"&gt;教學二&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>初探 Infrastructure as Code 工具 Terraform vs Pulumi</title><link>https://blog.wu-boy.com/2021/02/introduction-to-infrastructure-as-code-terraform-vs-pulumi/</link><pubDate>Mon, 08 Feb 2021 03:41:15 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/02/introduction-to-infrastructure-as-code-terraform-vs-pulumi/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/4DRj7S_2u3Tw8P-_p0FOQ_RH25eDbx_Edasx9h52-1ouo-GGL31CuiLa2EcbPyu8uEkf5GTw45_4bfzO3IFCfDwBZol7D69mX1KP3EHAOFoNT1nKyUpdpmSUyTC8Y49ej02OEteWWLU=w1920-h1080" title="cover pulumi and terraform"&gt;&lt;img src="https://lh3.googleusercontent.com/pw/ACtC-3fJUweEGX-VoiJgesBpEaNM-N0ozaNkTrcCvzRxPCL22RzhuZNaA1fXVi0Gy_aNIAhP0mHlUHzV89DV9cr4Lwcmd6JTZ5ISTTzOvzyuLSOxraPtYK3lMDpcR1bKXv1dwLw5oApcmFwKhijmRi12fAiNkQ=w1228-h741-no?authuser=0" alt="cover pulumi and terraform" title="cover pulumi and terraform"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;想必大家對於 &lt;a href="https://en.wikipedia.org/wiki/Infrastructure_as_code"&gt;Infrastructure as Code&lt;/a&gt; 簡稱 (IaC) 並不陌生，而這個名詞在很早以前就很火熱，本篇最主要介紹為什麼我們要導入 IaC，以及該選擇哪些工具來管理雲平台 (AWS, GCP, Azure 等&amp;hellip;)。觀看現在很火紅的 &lt;a href="https://www.terraform.io/"&gt;Terraform&lt;/a&gt; 及後起之秀 &lt;a href="https://www.pulumi.com/"&gt;Pulumi&lt;/a&gt; 是大家可以作為選擇的參考，而底下會來歸納優缺點及技術比較，以及為什麼我最後會選擇 Pulumi。這兩套都是由 &lt;a href="https://golang.org/"&gt;Go 語言&lt;/a&gt;所開發，現在選擇工具前，都要先考慮看看什麼語言寫的，以及整合進團隊自動化部署流程難易度。&lt;/p&gt;</description></item><item><title>使用 GraphQL Gateway 串接多個 Data Schema</title><link>https://blog.wu-boy.com/2021/02/graphql-gateway-in-golang/</link><pubDate>Sat, 06 Feb 2021 01:12:54 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2021/02/graphql-gateway-in-golang/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/eWR5fi9ipIuscey-E940I6fhwU5ZySehbItzPLyPVchJxBlq8N1uXT-psLHdX_wV6xojac3_EeCFZH6vs6C1R910vzDV1mY2uOo33so6QqpWgNqbDjGZPB6ar2NwspITQ7paTfjqSo8=w1920-h1080" title="infra"&gt;&lt;img src="https://lh3.googleusercontent.com/eWR5fi9ipIuscey-E940I6fhwU5ZySehbItzPLyPVchJxBlq8N1uXT-psLHdX_wV6xojac3_EeCFZH6vs6C1R910vzDV1mY2uOo33so6QqpWgNqbDjGZPB6ar2NwspITQ7paTfjqSo8=w1920-h1080" alt="infra" title="infra"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;不久之前寫過一篇『&lt;a href="https://blog.wu-boy.com/2020/04/switch-graphql-go-to-gqlgen-in-golang/"&gt;從 graphql-go 轉換到 gqlgen&lt;/a&gt;』，目前團隊舊有的專案還是繼續用 &lt;a href="https://github.com/graphql-go/graphql"&gt;graphql-go&lt;/a&gt; 來撰寫，不過之後需求量越來越大，維護 graphql-go 就越來越困難，故有在想怎麼把 &lt;a href="https://gqlgen.com/"&gt;gqlgen&lt;/a&gt; 跟 graphql-go 相容在一起，那就是把這兩個套件想成不同的服務，再透過 Gateway 方式完成 &lt;a href="https://principledgraphql.com/integrity#1-one-graph"&gt;single data graph&lt;/a&gt;。至於怎麼選擇 GraphQL Gateway 套件，最容易的方式就是使用 &lt;a href="https://www.apollographql.com/docs/federation/gateway/"&gt;@apollo/gateway&lt;/a&gt;，但是由於個人比較偏好 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;的解決方案，就稍微找看看有無人用 Go 實現了 Gateway，後來找到 &lt;a href="https://github.com/nautilus/gateway"&gt;nautilus/gateway&lt;/a&gt;，官方有&lt;a href="https://gateway.nautilus.dev/"&gt;提供文件&lt;/a&gt;以及&lt;a href="https://medium.com/@aaivazis/a-guide-to-schema-federation-part-1-995b639ac035"&gt;教學 Blog&lt;/a&gt; 可以供開發者參考。底下會教大家使用 nautilus/gateway 將兩個不同的服務串接在一起。&lt;/p&gt;</description></item><item><title>用 Go 語言撰寫簡單的 Command Line 工具</title><link>https://blog.wu-boy.com/2020/12/write-the-simple-cli-tool-in-golang/</link><pubDate>Sun, 27 Dec 2020 13:50:54 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/12/write-the-simple-cli-tool-in-golang/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;之前介紹了一個開源工具『&lt;a href="https://blog.wu-boy.com/2020/12/docker-image-to-periodically-backup-your-database-mysql-postgres-or-mongodb-to-s3/"&gt;用 Docker 每天自動化備份 MySQL, Postgres 或 MongoDB 並上傳到 AWS S3&lt;/a&gt;』，讓開發者可以快速透過 Docker 方式來備份資料庫，而本篇要介紹我如何用 Go 語言來撰寫 CLI 並且整合 Docker 來實現備份。此工具都是透過各大資料庫官方提供的 CLI 指令 (&lt;a href="https://docs.postgresql.tw/reference/client-applications/pg_dump"&gt;pg_dump&lt;/a&gt;, &lt;a href="https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html"&gt;mysqldump&lt;/a&gt; &amp;hellip; 等)，故大家不用猜想是什麼神奇的技巧。底下來依序介紹整個目錄結構，及我如何實現。&lt;/p&gt;</description></item><item><title>Go 1.16 推出 Embedding Files</title><link>https://blog.wu-boy.com/2020/12/embedding-files-in-go-1-16/</link><pubDate>Sun, 27 Dec 2020 08:32:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/12/embedding-files-in-go-1-16/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;官方維護團隊 rsc 之前在 &lt;a href="https://github.com/golang/go/issues/41191"&gt;GitHub Issue&lt;/a&gt; 上面提出要在 go command line 直接支援 Embedding Files，沒想到過沒幾個月，就直接實現出來了，並且預計在 2021 的 &lt;a href="https://tip.golang.org/doc/go1.16"&gt;go 1.16&lt;/a&gt; 版本直接支援 &lt;a href="https://tip.golang.org/pkg/embed/"&gt;embed 套件&lt;/a&gt;。有了這個功能，就可以將靜態檔案或專案設定檔直接包起來，這樣部署就更方便了。底下來看看官方怎麼使用。&lt;/p&gt;</description></item><item><title>用 Docker 每天自動化備份 MySQL, Postgres 或 MongoDB 並上傳到 AWS S3</title><link>https://blog.wu-boy.com/2020/12/docker-image-to-periodically-backup-your-database-mysql-postgres-or-mongodb-to-s3/</link><pubDate>Sat, 12 Dec 2020 12:07:50 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/12/docker-image-to-periodically-backup-your-database-mysql-postgres-or-mongodb-to-s3/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/2SGJ7LZpgVIVuKfhXSgm8fP90GLk7r1jgc4Sm-vAptUx43d28wjbv3r7x6U5BfDmJmfDfTlkhABWU9q20UA5Neg5-CITdqbN-djIeftrhdy2SZde-J2iHQTVdDNh9Ah7MEAzYiYyjDE=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/2SGJ7LZpgVIVuKfhXSgm8fP90GLk7r1jgc4Sm-vAptUx43d28wjbv3r7x6U5BfDmJmfDfTlkhABWU9q20UA5Neg5-CITdqbN-djIeftrhdy2SZde-J2iHQTVdDNh9Ah7MEAzYiYyjDE=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;由於備份 &lt;a href="https://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt; 的指令 &lt;a href="https://docs.postgresql.tw/reference/client-applications/pg_dump"&gt;pg_dump&lt;/a&gt; 需要限定特定版本才可以備份，故自己製作用 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 容器方式來備份，此工具支援 &lt;a href="https://www.mysql.com/"&gt;MySQL&lt;/a&gt;, PostgreSQL 跟 &lt;a href="https://www.mongodb.com/"&gt;MongoDB&lt;/a&gt;，只要一個 docker-compose yaml 檔案就可以進行線上的備份，並且上傳到 &lt;a href="https://aws.amazon.com/tw/s3/"&gt;AWS S3&lt;/a&gt;，另外也可以設定每天晚上固定時間點進行時間備份，也就是平常所設定的 cron job。沒使用 &lt;a href="https://aws.amazon.com/tw/rds/"&gt;AWS RDS&lt;/a&gt;，或自行管理機房的朋友們，就可以透過這小工具，進行每天半夜線上備份，避免資料被誤砍。底下教學程式碼都可以&lt;a href="https://github.com/appleboy/docker-backup-database"&gt;在這邊找到&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>善用 Go 語言效能測試工具來提升執行效率</title><link>https://blog.wu-boy.com/2020/11/improve-parser-performance-using-go-benchmark-tool/</link><pubDate>Mon, 02 Nov 2020 08:46:30 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/11/improve-parser-performance-using-go-benchmark-tool/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在 AI 訓練模型前，都需要經過大量的資料處理，而資料處理的速度在整個流程內扮演很重要的角色，寫出高效能的 Parser 能降低整體處理時間，那如何評估程式效能如何，以及如何快速找到效能瓶頸？本議程會帶大家了解 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;內建的效能測試工具，透過 &lt;a href="https://blog.wu-boy.com/2018/06/how-to-write-benchmark-in-go/"&gt;Benchmark&lt;/a&gt; 來找出程式效能瓶頸的地方，快速改善及優化，讓整個系統流程更順暢。也會順道分享 Go 在字串處理優化的一些小技巧。聽過此議程相信您對 Go 語言會有更深入的了解，如果你想寫出有效率的程式碼，本議程一定不能錯過。&lt;/p&gt;</description></item><item><title>用 GitHub Actions, Drone CI 或 GitLab CI 部署 AWS Lambda</title><link>https://blog.wu-boy.com/2020/10/deploy-lambda-github-actions-drone-ci-gitlab-ci/</link><pubDate>Mon, 26 Oct 2020 03:39:02 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/10/deploy-lambda-github-actions-drone-ci-gitlab-ci/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/43711539730/in/dateposted-public/" title="Screen Shot 2018-10-24 at 9.37.49 AM"&gt;&lt;img src="https://i1.wp.com/farm2.staticflickr.com/1956/43711539730_7bd9f610c3_z.jpg?w=840&amp;#038;ssl=1" alt="Screen Shot 2018-10-24 at 9.37.49 AM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最近剛好把 &lt;a href="https://github.com/appleboy/drone-lambda"&gt;drone-lambda&lt;/a&gt; 新增了一些新的功能，也就是可以透過 CI/CD 的方式來更新 &lt;a href="https://aws.amazon.com/tw/lambda/"&gt;AWS Lambda&lt;/a&gt; 基本設定，像是 Memory Size, Handler, Timeout, Runtime 或 Role 等 &amp;hellip;，趁這機會寫篇教學紀錄如何透過 &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;, &lt;a href="https://cloud.drone.io"&gt;Drone CI&lt;/a&gt; 或 &lt;a href="https://docs.gitlab.com/ee/ci/"&gt;GitLab CI&lt;/a&gt; 部署 AWS Lambda。這三套部署方式都是透過 &lt;a href="https://github.com/appleboy/drone-lambda"&gt;drone-lambda&lt;/a&gt; 包好的 Image 來進行。底下的程式碼都可以在&lt;a href="https://github.com/go-training/drone-lambda-demo"&gt;這邊找到&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>Go 語言 Select Multiple Channel 注意事項</title><link>https://blog.wu-boy.com/2020/10/select-multiple-channel-in-golang/</link><pubDate>Mon, 12 Oct 2020 07:44:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/10/select-multiple-channel-in-golang/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;相信大家都知道 Select 可以用來處理多個 Channel，但是大家有沒有想過一個情境，如果是 for 搭配 select 時，肯定會用一個 Timer 或 context 來處理 Timeout 或手動 Cancel，假設如果跟其他 Channel 同時到達時，官方說法是 Select 會隨機選擇一個狀況來執行，如果並非選到我們所要的 case 那就會造成情境或流程上的錯誤，而本影片就是講解該如何解決此問題，請大家務必詳細了解業務的需求，來決定程式碼架構該如何寫。&lt;/p&gt;</description></item><item><title>用 Go 語言打造多台機器 Scale 架構</title><link>https://blog.wu-boy.com/2020/09/golang-scale-in-cloud-summit-taiwan/</link><pubDate>Thu, 10 Sep 2020 06:27:25 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/09/golang-scale-in-cloud-summit-taiwan/</guid><description>&lt;h2 id="演講投影片"&gt;演講投影片&lt;/h2&gt;
&lt;p&gt;底下是 2020 的 &lt;a href="https://cloudsummit.ithome.com.tw/"&gt;Cloud Summit&lt;/a&gt; 演講投影片，歡迎大家參考看看&lt;/p&gt;
&lt;script async class="speakerdeck-embed" data-id="cf53a56cdf324a57bd8ab6b1437c10ed" data-ratio="1.33333333333" src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;</description></item><item><title>用 Go 語言實戰 Limit Concurrency 方法</title><link>https://blog.wu-boy.com/2020/09/limit-concurrency-in-golang/</link><pubDate>Sun, 06 Sep 2020 02:31:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/09/limit-concurrency-in-golang/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最近看到一篇文章討論的非常熱烈，就是『&lt;a href="https://utcc.utoronto.ca/~cks/space/blog/programming/GoConcurrencyStillNotEasy"&gt;concurrency is still not easy&lt;/a&gt;』這篇文章甚至上了 &lt;a href="https://news.ycombinator.com/item?id=24359650"&gt;Hack News&lt;/a&gt;，大家有興趣可以點進去看看，而本篇會用一個實際案例介紹為什麼作者會說寫 Concurrency 不是這麼容易。大家都知道在 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;內，要寫 Concurrency 只要透過一個關鍵字 &lt;code&gt;go&lt;/code&gt; 就可以輕易寫出，而多個 Goroutine 要溝通就是需要透過 Channel 方式，而網路上有一堆 Concurrency Pattern 提供給各位開發者，但是官方 Go 的標準庫內並沒有包含這些 Pattern，所以實作之後，說實在很難看出問題。文章內提到 &lt;a href="https://github.com/google/gops"&gt;gops&lt;/a&gt; 實作 Limit Concurrency 遇到系統整個 hang 住的問題？什麼是 Limit Concurrency，就是當系統有多個工作需要同時執行，但是需要限制 Concurrency 數量，避免整個資源都被吃光。底下來介紹文章內遇到的問題。&lt;/p&gt;</description></item><item><title>在 Go 語言內管理 Concurrency 的三種方式</title><link>https://blog.wu-boy.com/2020/08/three-ways-to-manage-concurrency-in-go/</link><pubDate>Sun, 09 Aug 2020 07:58:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/08/three-ways-to-manage-concurrency-in-go/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;相信大家踏入 &lt;a href="https://golang.org/"&gt;Go 語言&lt;/a&gt;的世界，肯定是被強大的 Concurrency 所吸引，Go 語言用最簡單的關鍵字 &lt;code&gt;go&lt;/code&gt; 就可以將任務丟到背景處理，但是怎麼有效率的控制 Concurrency，這是入門 Go 語言必學的項目，本篇會介紹三種方式來帶大家認識 Concurrency，而這三種方式分別對應到三個不同的名詞: &lt;a href="https://gobyexample.com/waitgroups"&gt;WaitGroup&lt;/a&gt;, &lt;a href="https://tour.golang.org/concurrency/2"&gt;Channel&lt;/a&gt;, 及 &lt;a href="https://blog.wu-boy.com/2020/05/understant-golang-context-in-10-minutes/"&gt;Context&lt;/a&gt;，底下用簡單的範例帶大家了解。&lt;/p&gt;</description></item><item><title>如何將前端網站打包成 Docker Image</title><link>https://blog.wu-boy.com/2020/07/how-to-create-docker-image-in-reactjs-or-vuejs/</link><pubDate>Sun, 26 Jul 2020 14:09:09 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/07/how-to-create-docker-image-in-reactjs-or-vuejs/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/2oJnx10msYCEJymUjCFZy3VspTSETeOGLcH8M5tHP2l2SP1yVtR7cUCZSO-3nc1Z6qQuc0FZMUFHViyfkhIFOz60ZocVZ8TxsneH2qZW7Hkio-TvCSxQ1GUM1sEpUSxRH284tP_VsSk=w1920-h1080" title="cover"&gt;&lt;img src="https://lh3.googleusercontent.com/2oJnx10msYCEJymUjCFZy3VspTSETeOGLcH8M5tHP2l2SP1yVtR7cUCZSO-3nc1Z6qQuc0FZMUFHViyfkhIFOz60ZocVZ8TxsneH2qZW7Hkio-TvCSxQ1GUM1sEpUSxRH284tP_VsSk=w1920-h1080" alt="cover" title="cover"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以現在開發網站流程，前後端分離已經不稀奇了。前端使用 &lt;a href="https://reactjs.org/"&gt;React.js&lt;/a&gt; 或 &lt;a href="https://vuejs.org/"&gt;Vue.js&lt;/a&gt;，後端使用 &lt;a href="https://golang.org"&gt;Golang&lt;/a&gt;，是我現在擅長的合作模式。其實後端在開發上面不太需要將前端的開發流程放在自己的電腦上，也就是後端只需要專注開發後端，跟前端的溝通都會是透過 &lt;a href="https://graphql.org/"&gt;GraphQL&lt;/a&gt; 的 &lt;a href="https://graphql.org/learn/schema/"&gt;Schema&lt;/a&gt; 當作討論。目前團隊各自維護專案的部署流程會是最好的方式，前端有兩種方式部署，一種是透過打包靜態檔案方式丟到遠端伺服器，另一種就是打包成 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; Image，再連線到遠端伺服器更新，兩者都有人使用，本篇會教大家如何將前端網站打包成 Docker Image，用 Image 來部署會是最方便的。&lt;/p&gt;</description></item><item><title>用 Postgres 計算員工上下班紀錄</title><link>https://blog.wu-boy.com/2020/07/count-employee-punch-in-out-with-postgres/</link><pubDate>Wed, 08 Jul 2020 05:51:39 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/07/count-employee-punch-in-out-with-postgres/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/vbqq3rLa3xH1e2c1snKm4u0hhkm4mYaT7IRpVBQC22AYa_9xbzuCois2EXQT7-RvZNofhz2TJpz0-Wlfrs870jAn3fyfove-6uF_I8cSe89jI-zmq8BQ2XQS1_hRZJN5587iNVG6pvY=w1920-h1080" title="postgres"&gt;&lt;img src="https://lh3.googleusercontent.com/vbqq3rLa3xH1e2c1snKm4u0hhkm4mYaT7IRpVBQC22AYa_9xbzuCois2EXQT7-RvZNofhz2TJpz0-Wlfrs870jAn3fyfove-6uF_I8cSe89jI-zmq8BQ2XQS1_hRZJN5587iNVG6pvY=w400" alt="postgres" title="postgres"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;這應該算是一個蠻簡單的情境，公司都需要去紀錄每位員工上下班紀錄，或者是紀錄每天刷卡補助餐點，在一定的時間內刷卡才會進行公司補助，非在約定的時間點刷卡則不補助，底下看看公司可能會想要的表格紀錄。在後台頁面會進行時間區域的選擇。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;起始日期: 2020-06-01 結束日期: 2020-06-30 早上時間: 08:00 ~ 09:00 晚上時間: 18:00 ~ 19:00&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>將 Postgres 資料轉換到 CSV 格式</title><link>https://blog.wu-boy.com/2020/06/convert-postgres-data-to-csv-file/</link><pubDate>Mon, 29 Jun 2020 04:12:50 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/06/convert-postgres-data-to-csv-file/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/vbqq3rLa3xH1e2c1snKm4u0hhkm4mYaT7IRpVBQC22AYa_9xbzuCois2EXQT7-RvZNofhz2TJpz0-Wlfrs870jAn3fyfove-6uF_I8cSe89jI-zmq8BQ2XQS1_hRZJN5587iNVG6pvY=w1920-h1080" title="postgres"&gt;&lt;img src="https://lh3.googleusercontent.com/vbqq3rLa3xH1e2c1snKm4u0hhkm4mYaT7IRpVBQC22AYa_9xbzuCois2EXQT7-RvZNofhz2TJpz0-Wlfrs870jAn3fyfove-6uF_I8cSe89jI-zmq8BQ2XQS1_hRZJN5587iNVG6pvY=w400" alt="postgres" title="postgres"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;時常用到 &lt;a href="https://www.postgresql.org/" title="Postgres"&gt;Postgres&lt;/a&gt; 轉換資料的功能，來即時協助 PM 了解目前使用者實際狀況，底下紀錄常用的指令。首先安裝 Postgres 環境，這邊其實就是用 Docker 方式來啟動一個全新的 Postgres DB。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;db&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;image&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;postgres:12&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;restart&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;always&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;volumes&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- pg-data:/var/lib/postgresql/data&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;logging&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;options&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;max-size&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;100k&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;max-file&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;3&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;environment&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;POSTGRES_USER&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;db&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;POSTGRES_DB&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;db&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;POSTGRES_PASSWORD&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;db&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;上面的 &lt;code&gt;environment&lt;/code&gt; 參數可以自由調整，接著透過 &lt;code&gt;docker-compose up -d&lt;/code&gt; 來啟動資料庫進行 App 串接。&lt;/p&gt;</description></item><item><title>為什麼要學 GraphQL?</title><link>https://blog.wu-boy.com/2020/06/why-we-need-to-learn-graphql/</link><pubDate>Sat, 20 Jun 2020 04:57:38 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/06/why-we-need-to-learn-graphql/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/2N2CsbTrA9I78S376IqY4LYiw02t8a6xNwO96lZG3CAENy4bSX8dRFrdFYxQnmIesEjLBQoG1tccIjKF944I7M91-POoYrHhHOS6kgiuKt39QuTI5zZ9NSAjbCrQYmktjct3YZfiJ4I=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/2N2CsbTrA9I78S376IqY4LYiw02t8a6xNwO96lZG3CAENy4bSX8dRFrdFYxQnmIesEjLBQoG1tccIjKF944I7M91-POoYrHhHOS6kgiuKt39QuTI5zZ9NSAjbCrQYmktjct3YZfiJ4I=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;身為網站工程師，您不能不知道什麼是 &lt;a href="https://graphql.org/"&gt;GraphQL&lt;/a&gt;，這是一個前端跟後端溝通的 API Query 語法，大幅改善了前後端的合作模式，這篇會跟大家介紹為什麼麼要學 GraphQL，以及整理出三大 GraphQL 優勢，讓大家了解跟傳統 RESTful API 有什麼不同。當然不是叫開發者捨棄 RESTful API，而是根據專案的不同，來決定不同的技術 Stack。像是服務跟服務之前您說要用 GraphQL，肯定被打槍，而是要用更輕量的 RESTful API 或 &lt;a href="https://grpc.io/"&gt;gRPC&lt;/a&gt;。好了，底下來說明三點 GraphQL 的優勢。&lt;/p&gt;</description></item><item><title>Go 1.15 新增 Module cache 環境變數</title><link>https://blog.wu-boy.com/2020/06/go-module-cache-variable-gomodcache/</link><pubDate>Sat, 13 Jun 2020 13:45:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/06/go-module-cache-variable-gomodcache/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;相信各位開發者在寫 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;專案，現在肯定都是使用 &lt;a href="https://blog.golang.org/using-go-modules"&gt;Go module&lt;/a&gt; 了，而 Go Module 檔案預設寫在 &lt;code&gt;/go/pkg/mod&lt;/code&gt; 目錄內，要串 CI/CD 流程時，由於不在專案路徑底下，所以每一個 Container 無法共用 &lt;code&gt;/go/pkg/mod&lt;/code&gt; 路徑，造成重複下載第三方套件，其實跨容器的解決方式可以透過 &lt;a href="https://cloud.drone.io"&gt;Drone&lt;/a&gt; 的 &lt;a href="https://docs.drone.io/pipeline/docker/syntax/volumes/temporary/"&gt;Temporary Volumes&lt;/a&gt; 方式解決，但是最終希望跑完編譯流程時，可以將最後的 mod 目錄打包留到下次的 CI/CD 部署流程使用，這時候如果可以改變 &lt;code&gt;/go/pkg/mod&lt;/code&gt; 路徑，就可以動態調整目錄結構了。底下是針對 Drone 這套部署工具進行解說。&lt;/p&gt;</description></item><item><title>Go 語言用 pprof 找出程式碼效能瓶頸</title><link>https://blog.wu-boy.com/2020/06/golang-benchmark-pprof/</link><pubDate>Sun, 07 Jun 2020 05:11:37 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/06/golang-benchmark-pprof/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;除了內建強大的測試工具 (&lt;a href="https://golang.org/pkg/testing/"&gt;go test&lt;/a&gt;) 之外，也提供了效能評估的工具 (&lt;a href="https://blog.golang.org/pprof"&gt;go tool pprof&lt;/a&gt;)，整個生態鏈非常完整，這也是我推薦大家使用 Go 語言的最大原因，這篇會介紹如何使用 pprof 來找出效能瓶頸的地方。假設開發者在寫任何邏輯功能時，發現跑出來的速度不是想像的這麼快，或者是在串接服務流程時，整個回覆時間特別久，這時候可以透過 benchmark 先找出原因。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go &lt;span style="color:#658b00"&gt;test&lt;/span&gt; -bench=. -benchtime=3s ./lexer/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>用 10 分鐘了解 Go 語言 context package 使用場景及介紹</title><link>https://blog.wu-boy.com/2020/05/understant-golang-context-in-10-minutes/</link><pubDate>Sun, 03 May 2020 02:45:07 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/05/understant-golang-context-in-10-minutes/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://golang.org/pkg/context/"&gt;context&lt;/a&gt; 是在 &lt;a href="https://golang.org/"&gt;Go 語言&lt;/a&gt; 1.7 版才正式被納入官方標準庫內，為什麼今天要介紹 context 使用方式呢？原因很簡單，在初學 Go 時，寫 API 時，常常不時就會看到在 http handler 的第一個參數就會是 &lt;code&gt;ctx context.Context&lt;/code&gt;，而這個 context 在這邊使用的目的及含義到底是什麼呢，本篇就是帶大家了解什麼是 context，以及使用的場景及方式，內容不會提到 context 的原始碼，而是用幾個實際例子來了解。&lt;/p&gt;</description></item><item><title>使用 Docker BuildKit 加速編譯 Image</title><link>https://blog.wu-boy.com/2020/04/speed-up-docker-build-using-docker-buildkit/</link><pubDate>Sun, 26 Apr 2020 05:29:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/04/speed-up-docker-build-using-docker-buildkit/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/fr-DxVaFf3lryJs-FUfDOp-azBpG7_atca4zJGuipRMUshXX-ICZXB9PdrqevF8DHRwUhG8gVrfI8jSv5LjS0Yj4R-dovaucEyCZ8U6hz68iYYU30RTFqdjO-u8ozGaPmPsyD5Ax-4c=w1920-h1080" title="docker buildkit"&gt;&lt;img src="https://lh3.googleusercontent.com/fr-DxVaFf3lryJs-FUfDOp-azBpG7_atca4zJGuipRMUshXX-ICZXB9PdrqevF8DHRwUhG8gVrfI8jSv5LjS0Yj4R-dovaucEyCZ8U6hz68iYYU30RTFqdjO-u8ozGaPmPsyD5Ax-4c=w1920-h1080" alt="docker buildkit" title="docker buildkit"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/go-training/docker-buildkit-demo"&gt;程式碼範例請看這邊&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;之前就有看到 &lt;a href="https://docker.com"&gt;Docker&lt;/a&gt; 推出 &lt;a href="https://docs.docker.com/develop/develop-images/build_enhancements/"&gt;BuildKit&lt;/a&gt; 功能，這次跟大家介紹什麼是 BuildKit。現在部署編譯流程肯定都會用到 Docker，不管測試及部署都盡量在 Docker 內實現，來做到環境隔離，但是要怎麼縮短 Docker 在編譯 Image 時間，這又是另外的議題，本篇跟大家介紹一個實驗性的功能就是 &lt;a href="https://docs.docker.com/develop/develop-images/build_enhancements/"&gt;BuildKit&lt;/a&gt;，原始碼可以&lt;a href="https://github.com/moby/buildkit"&gt;參考這邊&lt;/a&gt;，希望未來這實驗性的功能可以正式納入 Docker 官方，網路上其實可以找到很多方式來做 Docker Layer 的 Cache，我個人最常用的就是 &lt;code&gt;--cache-from&lt;/code&gt; 機制，可以適用在任何 CI/CD 流程，詳細說明可以參考這篇『&lt;a href="https://blog.wu-boy.com/2019/02/using-cache-from-can-speed-up-your-docker-builds/"&gt;在 docker-in-docker 環境中使用 cache-from 提升編譯速度&lt;/a&gt;』，下面使用到的程式碼都可以直接參考&lt;a href="https://github.com/go-training/docker-buildkit-demo"&gt;此 Repository&lt;/a&gt;，我還是使用 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;當作參考範例。&lt;/p&gt;</description></item><item><title>[Go 語言] 從 graphql-go 轉換到 gqlgen</title><link>https://blog.wu-boy.com/2020/04/switch-graphql-go-to-gqlgen-in-golang/</link><pubDate>Thu, 16 Apr 2020 07:05:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/04/switch-graphql-go-to-gqlgen-in-golang/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;相信各位開發者對於 &lt;a href="https://graphql.org/"&gt;GraphQL&lt;/a&gt; 帶來的好處已經非常清楚，如果對 GraphQL 很陌生的朋友們，可以直接參考之前作者寫的一篇『&lt;a href="https://blog.wu-boy.com/2018/07/graphql-in-go/"&gt;Go 語言實戰 GraphQL&lt;/a&gt;』，內容會講到用 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;實戰 GraphQL 架構，教開發者如何撰寫 GraphQL 測試及一些開發小技巧，不過內容都是以 &lt;a href="https://github.com/graphql-go/graphql"&gt;graphql-go&lt;/a&gt; 框架為主。而本篇主題會講為什麼我從 &lt;a href="https://github.com/graphql-go/graphql"&gt;graphql-go&lt;/a&gt; 框架轉換到 &lt;a href="https://gqlgen.com/"&gt;gqlgen&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>用 GitHub Actions 上傳 Docker Image 到 AWS ECR</title><link>https://blog.wu-boy.com/2020/04/upload-docker-image-to-aws-ecr-using-github-actions/</link><pubDate>Mon, 06 Apr 2020 05:39:21 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/04/upload-docker-image-to-aws-ecr-using-github-actions/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/t5MID_dNklCmkU2VFrKkhHV89tta8i-9GMebbSyfd_uvvdyQlo6Q4JbhRkA0jCO84vcSLW8zbn4Nqvzm1PYmAgrBQ4e2J1aZiUOZ7p_NGNinNF7Svsld_JRBv5rwCouNEJ_oBxk-Vqs=w1920-h1080" alt=""&gt;&lt;/p&gt;
&lt;p&gt;最近正打算使用 &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt; 來串接 &lt;a href="https://aws.amazon.com"&gt;AWS&lt;/a&gt; 服務 (&lt;a href="https://aws.amazon.com/tw/ecr/"&gt;ECR&lt;/a&gt; + &lt;a href="https://aws.amazon.com/tw/ecs/"&gt;ECS&lt;/a&gt;)，上網找了一堆 &lt;a href="https://github.com/marketplace?type=actions&amp;amp;query=ECR"&gt;ECR 套件&lt;/a&gt;，發現就連 &lt;a href="https://github.com/aws-actions/amazon-ecr-login"&gt;AWS 官方&lt;/a&gt;都只有實作 Login 進 ECR，後面編譯跟上傳動作就需要自己寫，可以看看底下是 AWS 官方套件的範例:&lt;/p&gt;</description></item><item><title>Docker 推出官方 GitHub Actions 套件</title><link>https://blog.wu-boy.com/2020/03/docker-release-github-actions-plugin/</link><pubDate>Sun, 29 Mar 2020 13:32:28 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/03/docker-release-github-actions-plugin/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/HM1o-XLKQSuzYOobmH10dENcm8KwZ3eMqHt99LWMLHMw_14CBHJEr8xuktBUvQFInGX1oLetjI97GkoHCTWFzaXLT_-YBVNv0_jsHYS1Fd2mDXk-v68I4itwP54-4eSZiQ3MewsF47U=w1920-h1080" title="cover"&gt;&lt;img src="https://lh3.googleusercontent.com/HM1o-XLKQSuzYOobmH10dENcm8KwZ3eMqHt99LWMLHMw_14CBHJEr8xuktBUvQFInGX1oLetjI97GkoHCTWFzaXLT_-YBVNv0_jsHYS1Fd2mDXk-v68I4itwP54-4eSZiQ3MewsF47U=w1920-h1080" alt="cover" title="cover"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;去年 &lt;a href="https://github.com"&gt;GitHub&lt;/a&gt; 推出 &lt;a href="https://github.com/features/actions"&gt;Actions&lt;/a&gt;，就有不少開發者相繼把 CI/CD 流程內會使用到的 Plugin 都丟到 &lt;a href="https://github.com/marketplace?type=actions"&gt;Marktetplace&lt;/a&gt;，而在這 &lt;a href="https://docker.com"&gt;Docker&lt;/a&gt; 容器時代，肯定是需要用自動化上傳容器到 Docker Registry，而官方也在&lt;a href="https://www.docker.com/blog/first-docker-github-action-is-here/"&gt;上週正式釋出第一版 GitHub Actions&lt;/a&gt;，雖然在 Marktet 尚有不少開發者已經有實現了此功能，但是官方既然推出了，就採用官方的套件會比較適合。底下我們來看看如何使用 Docker 推出的 GitHub Aciton 來自動化上傳 Docker Image。除了介紹如何使用 GitHub Action 上傳 Image 外，我也會拿 &lt;a href="https://drone.io/"&gt;Drone&lt;/a&gt; 的 &lt;a href="http://plugins.drone.io/drone-plugins/drone-docker/"&gt;Docker Plugin&lt;/a&gt; 來進行比較。&lt;/p&gt;</description></item><item><title>停止 Go 服務前先處理完 Worker 內的 Job</title><link>https://blog.wu-boy.com/2020/03/shutdown-the-service-after-job-completely/</link><pubDate>Sat, 28 Mar 2020 05:40:25 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/03/shutdown-the-service-after-job-completely/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在閱讀本文章之前，作者有寫過一篇『&lt;a href="https://blog.wu-boy.com/2020/02/graceful-shutdown-with-multiple-workers/"&gt;graceful shutdown with multiple workers&lt;/a&gt;』介紹了在服務停止前做一些正確的 Shutdown 流程，像是處理 Http Handler 或關閉資料庫連線等等，假設有服務內有實作 Worker 處裡多個 Job，那該如何等到全部的 Job 都執行完畢才正確關閉且刪除服務 (使用 &lt;a href="https://docker.com"&gt;Docker&lt;/a&gt;) 呢？底下是整個運作流程:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/bsmMhN5bVzpyDy-741CsS8s_wTyPfRpbLeZvJ0u7hOmCkXhBmS0qmVwkky4zveLxtNqQgGTUufWeNi2OVvOyXwx6QrADvt5n_6tAJlSzmRJK27U9C1EgOhzziZmLqNp_FTyqf4NAits=w1920-h1080" alt=""&gt;&lt;/p&gt;</description></item><item><title>Go Modules 處理 Private GIT Repository 流程</title><link>https://blog.wu-boy.com/2020/03/read-private-module-in-golang/</link><pubDate>Wed, 04 Mar 2020 14:41:21 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/03/read-private-module-in-golang/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/_swpUXXC6aFQLaC3ooXMAgebOkHkgCl7M3RVH6Yrs2vDF-4T_dlUhHUz3MMmdtsV5H_vi6r5-fu_fpSI0RFtmYtmwVIK_zzRIO_YhrmIa3-PATRnyUtfVPtU4J7sxhkF_aQzXjGDdbU=w1920-h1080" alt="golang"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://golang.org/"&gt;Golang&lt;/a&gt; 在 &lt;a href="https://golang.org/doc/go1.14#introduction"&gt;1.14&lt;/a&gt; 正式說明可以將 &lt;a href="https://github.com/golang/go/wiki/Modules"&gt;Go Modules&lt;/a&gt; 用在正式環境上了，還沒換上 Go Modules 的團隊，現在可以開始轉換了，轉換方式也相當容易啦，只要在原本的專案底下執行底下指令，就可以無痛轉移&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go mod init project_path
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go mod tidy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;假設專案內有用到私有 Git Repository 該怎麼解決了？現在 go mod 會預設走 &lt;code&gt;proxy.golang.org&lt;/code&gt; 去抓取最新的資料，但是要抓私有的，就需要透過其他方式:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go env -w &lt;span style="color:#00688b"&gt;GOPRIVATE&lt;/span&gt;=github.com/appleboy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;上面代表告訴 go 指令，只要遇到 &lt;code&gt;github.com/appleboy&lt;/code&gt; 就直接讀取，不需要走 Proxy 流程。拿 GitHub 當作範例，在本機端開發該如何使用？首先要先去申請 &lt;a href="https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line"&gt;Personal Access Token&lt;/a&gt;，接著設定 Git&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global url.&lt;span style="color:#cd5555"&gt;&amp;#34;https://&lt;/span&gt;&lt;span style="color:#00688b"&gt;$USERNAME&lt;/span&gt;&lt;span style="color:#cd5555"&gt;:&lt;/span&gt;&lt;span style="color:#00688b"&gt;$ACCESS_TOKEN&lt;/span&gt;&lt;span style="color:#cd5555"&gt;@github.com&amp;#34;&lt;/span&gt;.insteadOf &lt;span style="color:#cd5555"&gt;&amp;#34;https://github.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;其中 Username 就是 GitHub 帳號，Access token 就是上面的 &lt;a href="https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line"&gt;Personal Access Token&lt;/a&gt;。如果在本機端執行，本身有 SSH Key 的話，就不需要這個 Access Token，直接用 SSH Key 就可以了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global url.ssh://git@your.private.git/.insteadOf https://your.private.git/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>用五分鐘安裝好 Drone 搭配 GitHub 自動化環境</title><link>https://blog.wu-boy.com/2020/02/install-drone-with-github-in-five-minutes/</link><pubDate>Wed, 26 Feb 2020 03:07:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/02/install-drone-with-github-in-five-minutes/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/vD-ucUYf5HyaiqFcboabD13gP0b_ZQeTKdceFqim75J5z3jiA-D_H4BZEbd0hPf9Go1h-kN06yPcYoT-qpym7jLbFNAjadLvhWMx8XdAQRdAa7Bg61I5pYO2U3fqVEh6n6D4I38sdoo=w1920-h1080" alt=""&gt;&lt;/p&gt;
&lt;p&gt;之前寫過一篇『&lt;a href="https://blog.wu-boy.com/2019/08/install-drone-with-gitlab-in-10-minutes/"&gt;用 10 分鐘安裝好 Drone 搭配 GitLab&lt;/a&gt;』。團隊內還沒導入自動化 CI/CD 測試部署環境的朋友們，可以來嘗試看看用 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;打造的 Drone CI/CD 開源專案，不用五分鐘的時間就可以在您的電腦上安裝好 CI/CD 的流程，真的是簡單到不行，只要一個 docker-compose 檔案就可以完成架設了。&lt;/p&gt;</description></item><item><title>用 Drone 部署靜態檔案到 GitHub Pages</title><link>https://blog.wu-boy.com/2020/02/deploy-static-files-to-github-using-drone/</link><pubDate>Sat, 22 Feb 2020 06:34:20 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/02/deploy-static-files-to-github-using-drone/</guid><description>&lt;blockquote&gt;
&lt;p&gt;新課程上架:『&lt;a href="https://www.udemy.com/course/docker-practice/?couponCode=20200222" title="Docker 容器實用實戰"&gt;Docker 容器實用實戰&lt;/a&gt;』目前特價 &lt;strong&gt;$800 TWD&lt;/strong&gt;，優惠代碼『&lt;strong&gt;20200222&lt;/strong&gt;』，也可以直接匯款（價格再減 &lt;strong&gt;100&lt;/strong&gt;），如果想搭配另外兩門課程合購可以透過 &lt;a href="http://facebook.com/appleboy46"&gt;FB 聯絡我&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/vD-ucUYf5HyaiqFcboabD13gP0b_ZQeTKdceFqim75J5z3jiA-D_H4BZEbd0hPf9Go1h-kN06yPcYoT-qpym7jLbFNAjadLvhWMx8XdAQRdAa7Bg61I5pYO2U3fqVEh6n6D4I38sdoo=w1920-h1080" alt=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com"&gt;GitHub&lt;/a&gt; 提供一個非常方便的功能，就是可以將&lt;a href="https://pages.github.com"&gt;靜態檔案&lt;/a&gt;部署在 GitHub 上，基本上開發者不用負擔任何 Host 費用，就可以使用靜態檔案來做 Demo 介紹，或者是文件系統。而本篇將教您如何用 &lt;a href="https://drone.io"&gt;Drone&lt;/a&gt; 來自動化部署靜態檔案到 GitHub 上。作者直接用 Vue.js 來介紹整個流程。&lt;/p&gt;</description></item><item><title>使用 Docker 五分鐘安裝好 Gitea (自架 Git Hosting 最佳選擇)</title><link>https://blog.wu-boy.com/2020/02/install-gitea-using-docker/</link><pubDate>Sat, 15 Feb 2020 02:25:58 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/02/install-gitea-using-docker/</guid><description>&lt;blockquote&gt;
&lt;p&gt;新課程上架:『&lt;a href="https://www.udemy.com/course/docker-practice/?couponCode=20200222" title="Docker 容器實用實戰"&gt;Docker 容器實用實戰&lt;/a&gt;』目前特價 &lt;strong&gt;$800 TWD&lt;/strong&gt;，優惠代碼『&lt;strong&gt;20200222&lt;/strong&gt;』，也可以直接匯款（價格再減 &lt;strong&gt;100&lt;/strong&gt;），如果想搭配另外兩門課程合購可以透過 &lt;a href="http://facebook.com/appleboy46"&gt;FB 聯絡我&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/SrQvhDJm5NMkrxrut0lACspnz6iQSFCX3vlbtGCuAcwO-i_4iJCJ6trK3V2F6Q6s6fQ_EcSglwAL0qO0aLaTRtk4Ca32EI7Ks1H7u_nI9jC6xn3PF9hhgccjkbN3irX5pGi9kV-vIxk=w1920-h1080" title="Gitea"&gt;&lt;img src="https://lh3.googleusercontent.com/SrQvhDJm5NMkrxrut0lACspnz6iQSFCX3vlbtGCuAcwO-i_4iJCJ6trK3V2F6Q6s6fQ_EcSglwAL0qO0aLaTRtk4Ca32EI7Ks1H7u_nI9jC6xn3PF9hhgccjkbN3irX5pGi9kV-vIxk=w1920-h1080" alt="Gitea" title="Gitea"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gitea.io"&gt;Gitea&lt;/a&gt; 在本週發佈了 &lt;a href="https://blog.gitea.io/2020/02/gitea-1.11.0-is-released/"&gt;1.11.0 版本&lt;/a&gt;，本篇就使用 Docker 方式來安裝 Gitea，執行時間不會超過五分鐘。Gitea 是一套開源的 Git Hosting，除了 Gitea 之外，您可以選擇 GitHub 或自行安裝 GitLab，但是我為什麼選擇 Gitea 呢？原因有底下幾點&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Gitea 是&lt;a href="https://github.com/go-gitea/gitea"&gt;開源專案&lt;/a&gt;，全世界的開發者都可以進行貢獻&lt;/li&gt;
&lt;li&gt;Gitea 是 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;所開發，啟動速度超快&lt;/li&gt;
&lt;li&gt;Gitea 開源社區非常完整，每年固定挑選三位為主要負責人&lt;/li&gt;
&lt;li&gt;Gitea 可以使用執行檔或 Docker 方式進行安裝&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Gitea 目前發展方向就是自己服務自己，大家可能有發現原本在 GitHub 上面的 Repository 已經全面轉到 &lt;a href="https://gitea.com/gitea"&gt;Gitea 自主服務&lt;/a&gt;了，這也代表著未來會全面轉過去，只是時間上的問題。Gitea 目前的功能其實相當完整，大家有興趣可以看這張&lt;a href="https://docs.gitea.io/en-us/comparison/"&gt;比較表&lt;/a&gt;，新創團隊我都強烈建議使用 Gitea。&lt;/p&gt;</description></item><item><title>[Go 教學] graceful shutdown 搭配 docker-compose 實現 rolling update</title><link>https://blog.wu-boy.com/2020/02/graceful-shutdown-using-docker-compose-with-rolling-update/</link><pubDate>Sat, 08 Feb 2020 14:50:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/02/graceful-shutdown-using-docker-compose-with-rolling-update/</guid><description>&lt;blockquote&gt;
&lt;p&gt;線上課程:『&lt;a href="https://www.udemy.com/course/golang-fight/?couponCode=202002" title="Docker 容器實用實戰"&gt;Go 語言實戰&lt;/a&gt;』目前特價 &lt;strong&gt;$2100 TWD&lt;/strong&gt;，優惠代碼『&lt;strong&gt;202003&lt;/strong&gt;』，也可以直接匯款（價格再減 &lt;strong&gt;100&lt;/strong&gt;），如果想搭配另外兩門課程合購可以透過 &lt;a href="http://facebook.com/appleboy46"&gt;FB 聯絡我&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上一篇作者有提到『&lt;a href="https://blog.wu-boy.com/2020/02/what-is-graceful-shutdown-in-golang/"&gt;什麼是 graceful shutdown?&lt;/a&gt;』，本篇透過 docker-compose 方式來驗證 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;的 graceful shutdown 是否可以正常運作。除了驗證之外，單機版 &lt;a href="https://docker.com"&gt;Docker&lt;/a&gt; 本身就可以設定 scale 容器數量，那這時候又該如何搭配 graceful shutdown 來實現 rolling update 呢？相信大家對於 rolling update 並不陌生，現在的 &lt;a href="https://kubernetes.io/"&gt;kubernetes&lt;/a&gt; 已經有實現這個功能，用簡單的指令就可以達到此需求，但是對於沒有在用 k8s 架構的開發者，可能網站也不大，那該如何透過單機本的 docker 來實現呢？底下先來看看為什麼會出現這樣的需求。&lt;/p&gt;</description></item><item><title>[Go 教學] 什麼是 graceful shutdown?</title><link>https://blog.wu-boy.com/2020/02/what-is-graceful-shutdown-in-golang/</link><pubDate>Sat, 08 Feb 2020 03:29:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/02/what-is-graceful-shutdown-in-golang/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我們該如何升級 Web 服務，你會說很簡單啊，只要關閉服務，上程式碼，再開啟服務即可，可是很多時候開發者可能沒有想到現在服務上面是否有正在處理的資料，像是購物車交易？也或者是說背景有正在處理重要的事情，如果強制關閉服務，就會造成下次啟動時會有一些資料上的差異，那該如何優雅地關閉服務，這就是本篇的重點了。底下先透過簡單的 gin http 服務範例介紹簡單的 web 服務&lt;/p&gt;</description></item><item><title>[Go 教學] graceful shutdown with multiple workers</title><link>https://blog.wu-boy.com/2020/02/graceful-shutdown-with-multiple-workers/</link><pubDate>Sun, 02 Feb 2020 14:53:48 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/02/graceful-shutdown-with-multiple-workers/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在閱讀本文章之前請先預習『&lt;a href="https://blog.wu-boy.com/2019/11/implement-job-queue-using-buffer-channel-in-golang/"&gt;用 Go 語言 buffered channel 實作 Job Queue&lt;/a&gt;』，本篇會針對&lt;a href="https://www.slideshare.net/appleboy/job-queue-in-golang-184064840"&gt;投影片&lt;/a&gt; p.26 到 p.56 做詳細的介紹，教大家如何從無到有寫一個簡單的 multiple worker，以及如何處理 graceful shutdown with workers，為什麼要處理 graceful shutdown? 原因是中途手動執行 ctrl + c 或者是部署新版程式都會遇到該如何確保 job 執行完成後才結束 main 函式。&lt;/p&gt;</description></item><item><title>[SQL] 如何從單一資料表取得每個 key 前 n 筆資料</title><link>https://blog.wu-boy.com/2020/02/how-to-select-top-n-rows-from-each-key-in-sql/</link><pubDate>Sat, 01 Feb 2020 13:38:24 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/02/how-to-select-top-n-rows-from-each-key-in-sql/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/TPxdqjL5VJkLQ0FQASqErBaBMi8w6uyPZLGEQ-s6ZX9_6-JMF21n5uD6CZyc_kJ31ZTBlyevmKsjYrIZK0Ts61eqd93wqsmx66uvSVhGn4JKAWb6i_1_ClO_j4G8NQ-pR31QRrqtgu4=w1920-h1080" title="postgres"&gt;&lt;img src="https://lh3.googleusercontent.com/TPxdqjL5VJkLQ0FQASqErBaBMi8w6uyPZLGEQ-s6ZX9_6-JMF21n5uD6CZyc_kJ31ZTBlyevmKsjYrIZK0Ts61eqd93wqsmx66uvSVhGn4JKAWb6i_1_ClO_j4G8NQ-pR31QRrqtgu4=w1920-h1080" alt="postgres" title="postgres"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最近專案需求需要實現單筆資料的版本控制，所以會有一張表 (foo) 專門儲存 key 資料，而有另外一張表 (bar) 專門存 Data 資料，那在 bar 這張表怎麼拿到全部 key 的最新版本資料？底下先看看 schema 範例&lt;/p&gt;</description></item><item><title>使用 Go Channel 及 Goroutine 時機</title><link>https://blog.wu-boy.com/2020/01/when-to-use-go-channel-and-goroutine/</link><pubDate>Sat, 18 Jan 2020 06:11:54 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2020/01/when-to-use-go-channel-and-goroutine/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;相信不少開發者肯定聽過 Go 語言之所以讓人非常喜歡，就是因為 Go concurrency，如果您對於 concurrency 不了解的朋友們，可以直接參考&lt;a href="https://tour.golang.org/concurrency/1"&gt;官網的範例&lt;/a&gt;開始了解，範例會帶您一步一步了解什麼是 Channel 什麼是 Go concurrency？本篇會介紹 Channel 使用時機，在大部分寫 application 時，老實說很少用到 Channel，所以很多人其實不知道該在哪種場景需要使用 Channel，底下這句名言大家肯定聽過:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Do not communicate by sharing memory; instead, share memory by communicating.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本篇會用簡單的例子來帶大家理解上述名言。&lt;/p&gt;</description></item><item><title>用 GitHub Actions 部署 Go 語言服務</title><link>https://blog.wu-boy.com/2019/12/deploy-golang-app-using-github-actions/</link><pubDate>Sat, 14 Dec 2019 11:44:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/12/deploy-golang-app-using-github-actions/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/NI2lnMOEhkrZJ-x_bmre_RoQxLnzYcpPXVB_p6eBMmPQ73yDgoftVmUHvk0P86Tt2MM_Q23IHNu7qq7j99RXzTEzG95BU1u1vdpell9krVGHlUmW3Ng7J7egj1LHugWHcHoezCty9o0=w1920-h1080" alt=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt; 也推出一陣子了，相信有不少雷，也是有很多優勢，未來在 GitHub 上面串接任何開源專案，都可以免費使用，過幾年可以看看 GitHub Actions 對 &lt;a href="https://travis-ci.org/"&gt;Travis&lt;/a&gt; 的影響是多少？本篇要來介紹如何透過 GitHub Actions 來部署 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;服務，會用一個簡單 httpd 範例教大家如何透過 &lt;a href="https://docker.com"&gt;Docker&lt;/a&gt; 方式來更新。使用 Go 語言基本服務流程大致上會是『測試 -&amp;gt; 編譯 -&amp;gt; 上傳 -&amp;gt; 啟動』，透過這四個步驟來學習 GitHub Actions 該如何設定。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;測試: Unit Testing 多一層保護&lt;/li&gt;
&lt;li&gt;編譯: 透過 go build 編譯出 Binary 檔案&lt;/li&gt;
&lt;li&gt;上傳: 寫 Dockerfile 將 Binary 包進容器內&lt;/li&gt;
&lt;li&gt;啟動: 透過 docker-compose 方式來更新服務&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>用 15 分鐘快速打造 Laravel 開發環境</title><link>https://blog.wu-boy.com/2019/12/setup-laravel-environment-in-15-minutes/</link><pubDate>Fri, 06 Dec 2019 02:00:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/12/setup-laravel-environment-in-15-minutes/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/pjvNN9g1j3Viepuj7ujFJxOOaXPW4GalM1N0nTEmtrH84y36YVJuDfLDmoVv9PgmsuyEJ9o1iwSnItKfyg91fLGETDSsxGXCnquhs1qy_SDYNw5S0MuS0caVbnWZzx9hB13LqRN7JYw=w1920-h1080" title="cover page"&gt;&lt;img src="https://lh3.googleusercontent.com/pjvNN9g1j3Viepuj7ujFJxOOaXPW4GalM1N0nTEmtrH84y36YVJuDfLDmoVv9PgmsuyEJ9o1iwSnItKfyg91fLGETDSsxGXCnquhs1qy_SDYNw5S0MuS0caVbnWZzx9hB13LqRN7JYw=w1920-h1080" alt="cover page" title="cover page"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;相信大家對 Laravel 都很熟悉，但是初學者或是新進同事要快速入門 Laravel 最大的門檻就是該如何在短時間內在本機電腦快速安裝好公司專案。這時候使用 Laradock 就是一個最佳時機，透過 Docker 容器話，快速切換 PHP 版本，或者是安裝額外的服務像是 MySQL, MariaDB, phpMyAdmin 或 nginx 等服務，讓本機端不受到自訂安裝套件的困擾，用完隨時關閉，完全不會影響到電腦環境。底下我會介紹使用 Laradock 該注意的事情。完整詳細的操作步驟可以直接看 Youtube 影片。&lt;/p&gt;</description></item><item><title>Go 語言使用 Select 四大用法</title><link>https://blog.wu-boy.com/2019/11/four-tips-with-select-in-golang/</link><pubDate>Sat, 23 Nov 2019 01:36:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/11/four-tips-with-select-in-golang/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/CXyuE0Z1x4_dEciwiP9HRfXD2kHiola3SI-dAsU_HciuBxb3nA_NyZewO70gGlvA59eLapIRAEO0TZbAAx_z85Uqp-OGWx06-3lZ3HilrhnXvbr3nsilF1TcYIhSOtud_G7-wldkZNo=w1920-h1080" title="photo"&gt;&lt;img src="https://lh3.googleusercontent.com/CXyuE0Z1x4_dEciwiP9HRfXD2kHiola3SI-dAsU_HciuBxb3nA_NyZewO70gGlvA59eLapIRAEO0TZbAAx_z85Uqp-OGWx06-3lZ3HilrhnXvbr3nsilF1TcYIhSOtud_G7-wldkZNo=w1920-h1080" alt="photo" title="photo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本篇教學要帶大家認識 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;的 &lt;a href="https://tour.golang.org/concurrency/5"&gt;Select&lt;/a&gt; 用法，相信大家對於 switch 並不陌生，但是 &lt;code&gt;select&lt;/code&gt; 跟 &lt;code&gt;switch&lt;/code&gt; 有個共同特性就是都過 case 的方式來處理，但是 select 跟 switch 處理的事情完全不同，也完全不相容。來看看 switch 有什麼特性: 各種類型及型別操作，接口 &lt;code&gt;interface{}&lt;/code&gt; 型別判斷 &lt;code&gt;variable.(type)&lt;/code&gt;，重點是會依照 case &lt;strong&gt;順序依序執行&lt;/strong&gt;。底下看個例子:&lt;/p&gt;</description></item><item><title>初探 Go 語言 Project Layout (新人必看)</title><link>https://blog.wu-boy.com/2019/11/how-to-define-the-golang-folder-layout/</link><pubDate>Fri, 15 Nov 2019 23:30:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/11/how-to-define-the-golang-folder-layout/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/pKaq_CvDy37QrubxGcYfXpOoORzOO0t1zJ0eSDpiyNzl0IlrbXeY3zNRGmBVUkK6QdjcfE514j2MxeNdVQRfl8S9wfdEmbeK54414LFUVZLSob62AVimIlmbI7qiQhH_mPjqNDZoL18=w1920-h1080" title="cover photo"&gt;&lt;img src="https://lh3.googleusercontent.com/pKaq_CvDy37QrubxGcYfXpOoORzOO0t1zJ0eSDpiyNzl0IlrbXeY3zNRGmBVUkK6QdjcfE514j2MxeNdVQRfl8S9wfdEmbeK54414LFUVZLSob62AVimIlmbI7qiQhH_mPjqNDZoL18=w1920-h1080" alt="cover photo" title="cover photo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;很多人初次進入 Go 語言，肯定都會尋找在 Go 裡面是否有一套標準且最多人使用的 Framework 來學習，但是在 Go 語言就是沒有這樣的標準，所有的開源專案架構目錄都是由各團隊自行設計，沒有誰對誰錯，也沒任何一個是最標準的。那你一定會問，怎樣才是最好的呢？很簡單，如果可以定義出一套結構是讓團隊所有成員可以一目瞭然的目錄結構，知道發生問題要去哪個地方找，要加入新的功能，就有相對應的目錄可以存放，那這個專案就是最好的。當然這沒有標準答案，只是讓團隊有個共識，未來有新人進入專案，可以讓他在最短時間內吸收整個專案架構。&lt;/p&gt;</description></item><item><title>用 Go 語言 buffered channel 實作 Job Queue</title><link>https://blog.wu-boy.com/2019/11/implement-job-queue-using-buffer-channel-in-golang/</link><pubDate>Sat, 02 Nov 2019 14:53:39 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/11/implement-job-queue-using-buffer-channel-in-golang/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/7QKuBYqzmOWPCbAnS6EMG2ypPSeUYU7VEl9sF66zv9cIUCWwErs4CF1qNkWcwKdM7TmR-ygyqWkBvGhPnPQemG1bJl6bxj6ZcNNcS_uecl2xXFXp9qRFJyCqUzYnCfneOPgRPrInO8U=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/7QKuBYqzmOWPCbAnS6EMG2ypPSeUYU7VEl9sF66zv9cIUCWwErs4CF1qNkWcwKdM7TmR-ygyqWkBvGhPnPQemG1bJl6bxj6ZcNNcS_uecl2xXFXp9qRFJyCqUzYnCfneOPgRPrInO8U=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上個月在高雄 mopcon 講了一場『&lt;a href="https://www.slideshare.net/appleboy/job-queue-in-golang-184064840"&gt;Job Queue in Golang&lt;/a&gt;』，裡面提到蠻多技術細節，但是要在一場 40 分鐘的演講把大家教會，或者是第一次聽到 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;的，可能都很難在 40 分鐘內吸收完畢，所以我打算分好幾篇部落格來分享細部的實作，本篇會講解投影片第 19 ~ 25 頁，透過本篇你可以清楚學到什麼是 &lt;a href="https://tour.golang.org/concurrency/3"&gt;buffered channel&lt;/a&gt;，以及實作的注意事項。&lt;/p&gt;</description></item><item><title>Drone CI/CD 支援 Auto cancellation 機制</title><link>https://blog.wu-boy.com/2019/10/auto-cancellation-in-drone-ci-cd/</link><pubDate>Sun, 20 Oct 2019 02:27:53 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/10/auto-cancellation-in-drone-ci-cd/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/RK0neP9RNsD1P5N5zGL0BqgvUFnDDb1YuzyIUKLlD01ejmM87JNaU29bweqw_CyD0v39FYfi5wAh6wCls1CIxaMMiOdHX6WQ4p7hFU5Qlt052uya0NZ6pjJJAA24rfhbpDFDwKmivfU=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/RK0neP9RNsD1P5N5zGL0BqgvUFnDDb1YuzyIUKLlD01ejmM87JNaU29bweqw_CyD0v39FYfi5wAh6wCls1CIxaMMiOdHX6WQ4p7hFU5Qlt052uya0NZ6pjJJAA24rfhbpDFDwKmivfU=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;大家一定會問什麼是『Auto cancellation』呢？中文翻作自動取消，這機制會用在 CI/CD 的哪個流程或步驟呢？我們先來探討一個情境，不知道大家有無遇過在同一個 branch 陸續發了 3 個 commit，會發現在 CI/CD 會依序啟動 3 個 Job 來跑這 3 個 commit，假設您有設定同時間只能跑一個 Job，這樣最早的 commit 會先開始啟動，後面兩個 commit 則會處於 &lt;code&gt;Penging&lt;/code&gt; 的狀態，等到第一個 Job 完成後，後面兩個才會繼續執行。&lt;/p&gt;</description></item><item><title>用 Go 語言實作 Job Queue 機制</title><link>https://blog.wu-boy.com/2019/10/job-queue-in-golang/</link><pubDate>Sat, 19 Oct 2019 13:54:34 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/10/job-queue-in-golang/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;很高興可以在 &lt;a href="https://mopcon.org/2019/"&gt;Mopcon&lt;/a&gt; 分享『用 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;實現 Job Queue 機制』，透過簡單的 &lt;a href="https://tour.golang.org/concurrency/1"&gt;goroutine&lt;/a&gt; 跟 &lt;a href="https://tour.golang.org/concurrency/2"&gt;channel&lt;/a&gt; 就可以實現簡單 Queue 機制，並且限制同時可以執行多少個 Job，才不會讓系統超載。最後透過編譯放進 Docker 容器內，就可以跑在各種環境上，加速客戶安裝及部署。&lt;/p&gt;</description></item><item><title>在 Docker 內設定使用者及群組權限的三種方式</title><link>https://blog.wu-boy.com/2019/10/three-ways-to-setup-docker-user-and-group/</link><pubDate>Thu, 10 Oct 2019 23:04:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/10/three-ways-to-setup-docker-user-and-group/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/CDrKX9nVEAkUnrVNX26Mf0HY1iW73gM6z8WCITgo5QUWx3yXZPOzAI6op59p-YxKYgPkBQalH-rWUb2gElpc2gwjZ3M5jgKeHQ4MI88DkMXjxzkAhQX-zgIqjbGpRrlV38uXLFDxcMU=w1920-h1080" title="docker"&gt;&lt;img src="https://lh3.googleusercontent.com/CDrKX9nVEAkUnrVNX26Mf0HY1iW73gM6z8WCITgo5QUWx3yXZPOzAI6op59p-YxKYgPkBQalH-rWUb2gElpc2gwjZ3M5jgKeHQ4MI88DkMXjxzkAhQX-zgIqjbGpRrlV38uXLFDxcMU=w1920-h1080" alt="docker" title="docker"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果平常本身有在玩 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 的開發者肯定知道透過 docker command 啟動的容器預設是使用 &lt;code&gt;root&lt;/code&gt; 來當作預設使用者及群組，這邊會遇到一個問題，當 Host 環境你有 root 權限就沒有此問題，如果你沒有 root 權限，又有需求在 Docker 容器內掛上 Volume，會發現產生出來的檔案皆會是 root 權限，這時候在 Host 完全無法寫入。本篇教大家使用三種方式來設定容器使用者權限。&lt;/p&gt;</description></item><item><title>Ansible 設定 Google Container Registry 搭配 Drone 自動上傳</title><link>https://blog.wu-boy.com/2019/10/ansible-setup-google-container-registry-and-upload-image-via-drone-ci-cd/</link><pubDate>Thu, 03 Oct 2019 02:14:07 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/10/ansible-setup-google-container-registry-and-upload-image-via-drone-ci-cd/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/mese3VEnyNElOz7iL-z3w0nxM4PcNjC6lfPWxLbPrHTFr3PvKeyxGwIxTXoRztpidxN7gX8WlRtzBsfxkOVb_Pt-jEwCbZtYDD3l0DLeBger7XaC40XVyPUgAyT6yU_FdqJeAUCSQik=w1920-h1080" alt="blog logo"&gt;&lt;/p&gt;
&lt;p&gt;最近剛好有需求要串接 &lt;a href="https://cloud.google.com/container-registry/"&gt;GCR&lt;/a&gt; (Google Container Registry)，專案如果是搭配 GCP 服務，個人建議就直接用 GCR 了。本篇要教大家如何透過 Ansible 管理遠端機器直接登入 GCR，透過特定的帳號可以直接拉 Image，接著用 &lt;a href="https://docs.docker.com/compose/"&gt;docker-compose&lt;/a&gt; 來重新起動服務，這算是最基本的部署流程，那該如何用 &lt;a href="https://www.ansible.com/"&gt;Ansible&lt;/a&gt; 登入呢？請看底下教學。&lt;/p&gt;</description></item><item><title>用 Drone 自動化上傳 Docker Image 到 GitHub Docker Registry</title><link>https://blog.wu-boy.com/2019/09/upload-docker-image-to-github-registry-using-drone/</link><pubDate>Sat, 07 Sep 2019 02:42:42 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/09/upload-docker-image-to-github-registry-using-drone/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/tR9wbUwpzzbEUnDDsZlo0jnL1AaTZRLo-T4D7Dz-PE5mN9cj6vQ94bJVzoOdUPlZtJEjxkxJvCe5WFgzKyclj94HBZdo9FMCnY5_b98ZG88pGN5v9A6jLSbY-dnz2oetLiuSi1pYI7E=w1920-h1080" title="github"&gt;&lt;img src="https://lh3.googleusercontent.com/tR9wbUwpzzbEUnDDsZlo0jnL1AaTZRLo-T4D7Dz-PE5mN9cj6vQ94bJVzoOdUPlZtJEjxkxJvCe5WFgzKyclj94HBZdo9FMCnY5_b98ZG88pGN5v9A6jLSbY-dnz2oetLiuSi1pYI7E=w1920-h1080" alt="github" title="github"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;很高興收到 &lt;a href="https://github.com"&gt;GitHub&lt;/a&gt; 的 Beta 邀請函來開始試用 &lt;a href="https://help.github.com/en/articles/about-github-package-registry"&gt;GitHub Package Registry&lt;/a&gt; 相關功能，從說明文件可以知道目前 Registry 支援了好幾種 Package 像是 &lt;a href="https://help.github.com/en/articles/configuring-npm-for-use-with-github-package-registry/"&gt;npm&lt;/a&gt;, &lt;a href="https://help.github.com/en/articles/configuring-rubygems-for-use-with-github-package-registry/"&gt;gem&lt;/a&gt;, &lt;a href="https://help.github.com/en/articles/configuring-docker-for-use-with-github-package-registry/"&gt;docker&lt;/a&gt;, &lt;a href="https://help.github.com/en/articles/configuring-apache-maven-for-use-with-github-package-registry/"&gt;mvn&lt;/a&gt; 及 &lt;a href="https://help.github.com/en/articles/configuring-nuget-for-use-with-github-package-registry/"&gt;nuget&lt;/a&gt;，這篇主要跟大家介紹如何用 Drone 快速串接 CI/CD 流程的『自動上傳 Docker Image 到 GitHub Registry』，底下來看看如何使用 GitHub 提供的 Docker Registry。&lt;/p&gt;</description></item><item><title>Go 語言目錄結構與實踐</title><link>https://blog.wu-boy.com/2019/08/golang-project-layout-and-practice/</link><pubDate>Sat, 31 Aug 2019 10:53:29 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/08/golang-project-layout-and-practice/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;很高興今年錄取 &lt;a href="https://modernweb.tw/"&gt;Modernweb&lt;/a&gt; 講師，又有機會去宣傳 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;，這次的議程最主要跟大家介紹 Go 專案的目錄該如何設計，一個基本的專案該需要有哪些功能，以及如何實現。大家剛入門 Go 時，肯定會開始找是否有一套 Web Framework 可以參考實踐，可惜的是，在 Go 語言沒有定義任何的目錄結構，所有的結構都可以根據團隊的狀況而有所改變，而這邊我想強調的是如果能讓團隊看到結構後，一目瞭然知道什麼功能該放哪個目錄，或什麼目錄內大概有什麼功能，那其實就夠了。看了許多開源專案，每個設計方式都是不同，但是當你要找什麼功能時，其實從根目錄就可以很清楚的知道要進入哪個地方可以找到您想要的功能及程式碼。這次在 Moderweb 上面的議題，就是分享我在開源專案所使用的目錄結構，以及結構內都放哪些必要的功能。&lt;/p&gt;</description></item><item><title>用 10 分鐘安裝好 Drone 搭配 GitLab</title><link>https://blog.wu-boy.com/2019/08/install-drone-with-gitlab-in-10-minutes/</link><pubDate>Fri, 23 Aug 2019 01:05:48 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/08/install-drone-with-gitlab-in-10-minutes/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/UBBk430Fl5KSAbDHuu0gyb6VXrjdGM5aj9JV7LqyFbubYDYuUu3KfahdarNJn0SHyEUCN_lWXfhb2BsNxjgD--kFt-MRkDguj1pWRNEpgiTL_zaVn9BDJPmm7wkIFmv0oEm6pt0NHkY=w1920-h1080" title="Drone+GitLab"&gt;&lt;img src="https://lh3.googleusercontent.com/UBBk430Fl5KSAbDHuu0gyb6VXrjdGM5aj9JV7LqyFbubYDYuUu3KfahdarNJn0SHyEUCN_lWXfhb2BsNxjgD--kFt-MRkDguj1pWRNEpgiTL_zaVn9BDJPmm7wkIFmv0oEm6pt0NHkY=w1920-h1080" alt="Drone+GitLab" title="Drone+GitLab"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果你沒在使用 &lt;a href="https://about.gitlab.com/product/continuous-integration/"&gt;GitLab CI&lt;/a&gt;，那可以來嘗試看看 &lt;a href="https://drone.io/"&gt;Drone CI/CD&lt;/a&gt;，用不到 10 分鐘就可以快速架設好 Drone，並且上傳一個 &lt;code&gt;.drone.yml&lt;/code&gt; 並且開啟第一個部署或測試流程，安裝步驟非常簡單，只需要對 &lt;a href="https://docker.com"&gt;Docker&lt;/a&gt; 有基本上的了解，通常都可以在短時間完成 Drone CI/CD 架設。&lt;/p&gt;</description></item><item><title>Minio 從 Docker 容器移除 healthcheck 腳本</title><link>https://blog.wu-boy.com/2019/08/minio-remove-healthcheck-script-for-docker-image/</link><pubDate>Sun, 18 Aug 2019 05:20:45 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/08/minio-remove-healthcheck-script-for-docker-image/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/3lAv9HlhI9mxCfow0jHY5-G6H-tvXJLCv3S2QvzKReV_R-61oywRIXW6sruwPrS69CXpMAuIrccgVH8HY5hIzDGvenyhFhKcGmBk0CmU1c36k6NrjSvYESSmAEAejlxmxdW_gduXZio=w1920-h1080" title="minio golang"&gt;&lt;img src="https://lh3.googleusercontent.com/3lAv9HlhI9mxCfow0jHY5-G6H-tvXJLCv3S2QvzKReV_R-61oywRIXW6sruwPrS69CXpMAuIrccgVH8HY5hIzDGvenyhFhKcGmBk0CmU1c36k6NrjSvYESSmAEAejlxmxdW_gduXZio=w1920-h1080" alt="minio golang" title="minio golang"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://min.io/"&gt;Minio&lt;/a&gt; 是一套開源專案的 Object 儲存容器，如果你有使用 &lt;a href="https://aws.amazon.com/tw/s3/"&gt;AWS S3&lt;/a&gt;，相信要找一套代替 S3 的替代品，一定會想到這套用 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;開發的 Minio 專案。讓您在公司內部也可以享有 S3 的儲存容器，不需要變動任何程式碼就可以無痛從 AWS S3 搬到公司內部。剛好最近在整合 Traefik 搭配 Minio，由於 Minio 原先已經內建 healthcheck 腳本，所以當運行 Minio 時，使用 &lt;code&gt;docker ps&lt;/code&gt; 正常來說可以看到類似 &lt;code&gt;Up 7 weeks (healthy)&lt;/code&gt; 字眼，但是 Minio 運行了三分鐘之後，狀態就會從 &lt;code&gt;healthy&lt;/code&gt; 變成 &lt;code&gt;unhealthy&lt;/code&gt;，造成 Traefik 會自動移除 frontend 的對應設定，這樣 Web 就無法顯示了。我在 Udemy 上面有介紹如&lt;a href="https://www.udemy.com/course/golang-fight/learn/lecture/9962004#overview"&gt;何用 Golang 寫 healthcheck&lt;/a&gt;，大家有興趣可以參考看看，coupon code 可以輸入 &lt;strong&gt;GOLANG2019&lt;/strong&gt; 。&lt;/p&gt;</description></item><item><title>[Drone] 將單一 Job 分配到多台機器，降低部署執行時間</title><link>https://blog.wu-boy.com/2019/08/drone-multiple-machine/</link><pubDate>Mon, 05 Aug 2019 05:40:22 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/08/drone-multiple-machine/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/q2Z5tLXdw_GINCveZ4860CTUhfnJtrhdSuWt4VItXWggiPnKqc0sI_0lvxz4lfB4v-MoCPNW50H16QwzQUzOwuIfgug6fvwemQme0Km9c9UeEdCYL2cZzHuK7lhZ4lMClDZ07CBVLiM=w1920-h1080" title="drone multiple machine"&gt;&lt;img src="https://lh3.googleusercontent.com/q2Z5tLXdw_GINCveZ4860CTUhfnJtrhdSuWt4VItXWggiPnKqc0sI_0lvxz4lfB4v-MoCPNW50H16QwzQUzOwuIfgug6fvwemQme0Km9c9UeEdCYL2cZzHuK7lhZ4lMClDZ07CBVLiM=w1920-h1080" alt="drone multiple machine" title="drone multiple machine"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在傳統 CI/CD 流程，都是會在同一台機器上進行，所以當有一個 Job 吃了很大的資源時，其他工作都必須等待該 Job 執行完畢，釋放出資源後，才可以繼續進行。現在 Drone 推出一個新功能，叫做 &lt;a href="https://docs.drone.io/user-guide/pipeline/multi-machine/"&gt;Multiple Machine&lt;/a&gt; 機制，現在開發者可以將同一個 Job 內，拆成很多步驟，將不同的步驟丟到不同機器上面去執行，降低部署執行時間，假設現在有兩台機器 A 及 B，你可以將前端的測試丟到 A 機器，後端的測試，丟到 B 機器，來達到平行處理，並且享受兩台機器的資源，在沒有這機制之前，只能在單一機器上面跑平行處理，沒有享受到多台機器的好處。&lt;/p&gt;</description></item><item><title>透過 Drone CLI 手動觸發 CI/CD 流程</title><link>https://blog.wu-boy.com/2019/07/trigger-the-drone-job-via-promotion/</link><pubDate>Tue, 30 Jul 2019 15:12:31 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/07/trigger-the-drone-job-via-promotion/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/72xMoCcL6pClsS5eH08zTP2ksHlV2XaRVhtSDuyYnZ-nDBtXR5dxVyGp6WIE-RJ48WL4ZEwTyAijcmua7ade_GGzJ6yDfcolY2h4ejUGASUjWoDXHQ1okvElcJY7tpf7bxnVc3rrZ7Y=w1920-h1080" title="drone promotion"&gt;&lt;img src="https://lh3.googleusercontent.com/72xMoCcL6pClsS5eH08zTP2ksHlV2XaRVhtSDuyYnZ-nDBtXR5dxVyGp6WIE-RJ48WL4ZEwTyAijcmua7ade_GGzJ6yDfcolY2h4ejUGASUjWoDXHQ1okvElcJY7tpf7bxnVc3rrZ7Y=w1920-h1080" alt="drone promotion" title="drone promotion"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;相信大家對於 &lt;a href="https://cloud.drone.io/"&gt;Drone&lt;/a&gt; 並不陌生，這次來介紹 Drone 1.0 的新功能 (更多的 1.0 功能會陸續介紹，也可以參考&lt;a href="https://blog.wu-boy.com/2019/04/cicd-drone-1-0-feature/"&gt;之前的文章&lt;/a&gt;)，叫做 promotion，為什麼作者會推出這功能呢？大家在團隊工作時，有些步驟真的無法導入 CI/CD 自動化流程，而是需要人工介入後，再做後續處理？相信一定會遇到此狀況，PM 或老闆看過沒問題後，才需要手動觸發流程，在此功能以前，都會麻煩工程師幫忙做後續自動化流程，但是有了 &lt;a href="https://docs.drone.io/user-guide/pipeline/promotion/"&gt;promotion&lt;/a&gt;，現在連 PM 都可以透過 Drone CLI 來自己做部署啦，這邊就是介紹給大家，如何透過 &lt;a href="https://github.com/drone/drone-cli"&gt;Drone CLI&lt;/a&gt; 指令來觸發已存在的工作項目。&lt;/p&gt;</description></item><item><title>架設 Go Proxy 服務加速 go module 下載速度</title><link>https://blog.wu-boy.com/2019/07/speed-up-go-module-download-using-go-proxy-athens/</link><pubDate>Wed, 10 Jul 2019 22:54:14 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/07/speed-up-go-module-download-using-go-proxy-athens/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;在 1.11 推出 go module 來統一市面上不同管理 Go 套件的工具，像是 &lt;a href="https://github.com/golang/dep"&gt;dep&lt;/a&gt; 或 govendor 等，還不知道如何使用 go module，可以參考之前寫的一篇文章『&lt;a href="https://blog.wu-boy.com/2018/12/go-module-integrate-with-travis-or-drone/"&gt;Go Module 導入到專案內且搭配 Travis CI 或 Drone 工具&lt;/a&gt;』，在團隊內如果每個人在開發專案時，都透過網路去下載專案使用到的套件，這樣 10 個人就會浪費 10 個人的下載時間，並且佔用公司網路頻寬，所以我建議在公司內部架設一台 Go Proxy 服務，減少團隊在初始化專案所需要的時間，也可以減少在跑 CI/CD 流程時，所需要花費的時間，測試過公司 CI/CD 流程，有架設 Go Proxy，一般來說可以省下 1 ~ 2 分鐘時間，根據專案使用到的相依性套件用量來決定花費時間。本篇來介紹如何架設 &lt;a href="https://github.com/gomods/athens"&gt;ATHENS&lt;/a&gt; 這套開源 Go Proxy 專案。&lt;/p&gt;</description></item><item><title>用 Ansible 安裝 Drone CI/CD 開源專案</title><link>https://blog.wu-boy.com/2019/06/install-drone-ci-cd-using-ansible/</link><pubDate>Mon, 17 Jun 2019 07:18:39 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/06/install-drone-ci-cd-using-ansible/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/HZqWLZjp96azorhAZseeSbSj9Q5-dj99lM8cX4ApJjnDL0grXaMEoIHJl3dQEx-ZyFcI713_CeQlPSFMOLgxD19tBOLMmgdQlwMe_QMhwGKrh2pQDWE2bj4cul4ENt21sWRFOYq6agc=w1920-h1080" title="drone and ansible"&gt;&lt;img src="https://lh3.googleusercontent.com/HZqWLZjp96azorhAZseeSbSj9Q5-dj99lM8cX4ApJjnDL0grXaMEoIHJl3dQEx-ZyFcI713_CeQlPSFMOLgxD19tBOLMmgdQlwMe_QMhwGKrh2pQDWE2bj4cul4ENt21sWRFOYq6agc=w1920-h1080" alt="drone and ansible" title="drone and ansible"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;相信大家對於 &lt;a href="https://github.com/drone/drone"&gt;Drone 開源專案&lt;/a&gt;並不陌生，如果對於 Drone 不了解的朋友們，可以直接看之前寫的&lt;a href="https://blog.wu-boy.com/?s=drone"&gt;系列文章&lt;/a&gt;，本篇要教大家如何使用 &lt;a href="https://www.ansible.com/"&gt;Ansible&lt;/a&gt; 來安裝 Drone CI/CD 開源專案。目前 Drone 可以支援兩種安裝方式: 1. 使用 Docker 2. 使用 binary，如果您是進階開發者，可以使用 binary 方式來安裝，像是在 Debug 就可以透過 build binary 方式來測試。一般來說都是使用 Docker 方式來安裝，在使用 ansible 之前，請先準備一台 Ubuntu 或 Debian 作業系統的 VM 來測試。&lt;/p&gt;</description></item><item><title>Go Module 如何發佈 v2 以上版本</title><link>https://blog.wu-boy.com/2019/06/how-to-release-the-v2-or-higher-version-in-go-module/</link><pubDate>Fri, 07 Jun 2019 02:54:51 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/06/how-to-release-the-v2-or-higher-version-in-go-module/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/golang/go/wiki/Modules#semantic-import-versioning"&gt;Go Module&lt;/a&gt; 是 &lt;a href="https://golang.org"&gt;Golang&lt;/a&gt; 推出的一套件管理系統，在 Go 1.11 推出後，許多 Package 也都陸續支援 Go Module 取代舊有的套件管理系統，像是 govendor 或 dep 等，而再過不久之後，保留 vendor 的方式也會被移除，畢竟現在開發已經不需要在 &lt;code&gt;GOPATH&lt;/code&gt; 目錄底下了。對於 Go Module 不熟的話，建議先看官方今年寫的一篇&lt;a href="https://blog.golang.org/using-go-modules"&gt;教學部落格&lt;/a&gt;，底下是教學會涵蓋的範圍&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creating a new module.&lt;/li&gt;
&lt;li&gt;Adding a dependency.&lt;/li&gt;
&lt;li&gt;Upgrading dependencies.&lt;/li&gt;
&lt;li&gt;Adding a dependency on a new major version.&lt;/li&gt;
&lt;li&gt;Upgrading a dependency to a new major version.&lt;/li&gt;
&lt;li&gt;Removing unused dependencies.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而本篇最主要會跟大家探討如何發佈 v2 以上的套件版本。&lt;/p&gt;</description></item><item><title>GitHub 推出 CI/CD 服務 Actions 之踩雷經驗</title><link>https://blog.wu-boy.com/2019/05/introduction-to-github-actions/</link><pubDate>Tue, 21 May 2019 09:12:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/05/introduction-to-github-actions/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/vs6XKU4keYmwiBUeWrTVbYl4WKH7cTcmu6Lcggv0QWEBK81D06mbPg7skrmlnYrUf0JlEzhwjJwtmjVJ4p9wLXmbTs4mmzviiCK1RRwBhRXGom5w_3JSQwnV6UUbfH5Pd9uNNU5SCQE=w1920-h1080" title="GitHub Actions 簡介"&gt;&lt;img src="https://lh3.googleusercontent.com/vs6XKU4keYmwiBUeWrTVbYl4WKH7cTcmu6Lcggv0QWEBK81D06mbPg7skrmlnYrUf0JlEzhwjJwtmjVJ4p9wLXmbTs4mmzviiCK1RRwBhRXGom5w_3JSQwnV6UUbfH5Pd9uNNU5SCQE=w1920-h1080" alt="GitHub Actions 簡介" title="GitHub Actions 簡介"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今年很高興又去 &lt;a href="https://cloudsummit.ithome.com.tw/"&gt;Cloud Summit 研討會&lt;/a&gt;給一場議程『初探 GitHub 自動化流程工具 Actions』，這場議程沒有講很多如何使用 &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;，反倒是講了很多設計上的缺陷，以及為什麼我現在不推薦使用。GitHub Actions 在去年推出來，在這麼多 CI/CD 的免費服務，GitHub 自家出來做很正常，我還在想到底什麼時候才會推出，beta 版出來馬上就申請來試用，但是使用下來體驗非常的不好，有蠻多不方便的地方，底下我們就來聊聊 GitHub Acitons 有哪些缺陷以及該改進的地方。&lt;/p&gt;</description></item><item><title>15 分鐘學習 Go 語言如何處理多個 Channel 通道</title><link>https://blog.wu-boy.com/2019/05/handle-multiple-channel-in-15-minutes/</link><pubDate>Mon, 13 May 2019 02:37:51 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/05/handle-multiple-channel-in-15-minutes/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;大家在初學 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;時，肯定很少用到 Go Channel，也不太確定使用的時機點，其實在官方 Blog 有提供一篇不錯的文章『&lt;a href="https://blog.golang.org/pipelines"&gt;Go Concurrency Patterns: Pipelines and cancellation&lt;/a&gt;』，相信大家剛跨入學習新語言時，不會馬上看 Go Channel，底下我來用一個簡單的例子來說明如何使用 Go Channel，使用情境非常簡單，就是假設今天要同時處理 20 個背景工作，一定想到要使用 &lt;a href="https://tour.golang.org/concurrency/1"&gt;Goroutines&lt;/a&gt;，但是又想要收到這 20 個 JOB 處理的結果，並顯示在畫面上，如果其中一個 Job 失敗，就跳出 main 函式，當然又會希望這 20 個 JOB 預期在一分鐘內執行結束，如果超過一分鐘，也是一樣跳出 main 函式。針對這個問題，我們可以整理需要三個 Channel + 一個 Timeout 機制。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 outChan 顯示各個 JOB 完成狀況&lt;/li&gt;
&lt;li&gt;使用 errChan 顯示 JOB 發生錯誤並且跳出 main 主程式&lt;/li&gt;
&lt;li&gt;使用 finishChan 通知全部 JOB 已經完成&lt;/li&gt;
&lt;li&gt;設定 Timeout 機制 (1 秒之內要完成所有 job)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在看此文章之前，也許可以先理解什麼是『&lt;a href="https://blog.wu-boy.com/2019/04/understand-unbuffered-vs-buffered-channel-in-five-minutes/"&gt;buffer vs unbuffer channel&lt;/a&gt;』。&lt;/p&gt;</description></item><item><title>[Go 語言教學影片] 在 struct 內的 pointers 跟 values 差異</title><link>https://blog.wu-boy.com/2019/05/what-is-different-between-pointer-and-value-in-golang/</link><pubDate>Mon, 06 May 2019 07:29:36 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/05/what-is-different-between-pointer-and-value-in-golang/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gobyexample.com/methods"&gt;Struct Method&lt;/a&gt; 在 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;開發上是一個很重大的功能，而新手在接觸這塊時，通常會搞混為什麼會在 function 內的 struct name 前面多一個 &lt;code&gt;*&lt;/code&gt; pointer 符號，而有時候又沒有看到呢？以及如何用 struct method 實現 Chain 的實作，本影片會實際用寄信當作範例講解什麼時候該用 &lt;code&gt;pointer&lt;/code&gt; 什麼時候該用用 &lt;code&gt;Value&lt;/code&gt;。也可以參考我之前的一篇文章『&lt;a href="https://blog.wu-boy.com/2017/05/go-struct-method-pointer-or-value/"&gt;Go 語言內 struct methods 該使用 pointer 或 value 傳值?&lt;/a&gt;』&lt;/p&gt;</description></item><item><title>CI/CD 大亂鬥: Drone 1.0 功能介紹</title><link>https://blog.wu-boy.com/2019/04/cicd-drone-1-0-feature/</link><pubDate>Mon, 22 Apr 2019 03:34:16 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/04/cicd-drone-1-0-feature/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/8kk2MLpEg38HGO6sYA2r1EOaJ6mNjhsS65H1tRwKSbmSgdhr-mRh6UH2tQwVucMNtMAbbIoa5DHn1mu-lcX-P6fKbRrs-sRJ3N9DjdaHwE-RS4RqxqYdwE6GO1mtyTtdvgdAFTAJ7ws=w1920-h1080" title="drone ci/cd"&gt;&lt;img src="https://lh3.googleusercontent.com/8kk2MLpEg38HGO6sYA2r1EOaJ6mNjhsS65H1tRwKSbmSgdhr-mRh6UH2tQwVucMNtMAbbIoa5DHn1mu-lcX-P6fKbRrs-sRJ3N9DjdaHwE-RS4RqxqYdwE6GO1mtyTtdvgdAFTAJ7ws=w1920-h1080" alt="drone ci/cd" title="drone ci/cd"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;很高興受到 &lt;a href="https://www.facebook.com/groups/DevOpsTaiwan/"&gt;Devops Taiwan&lt;/a&gt; 邀請到台北講『&lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; CI/CD 1.0 新功能』，現場太多 CI/CD 工具一起 PK，有興趣可以看&lt;a href="https://devopstw.club/"&gt;活動網頁&lt;/a&gt;。其實我在其他場合講過很多次 &lt;a href="https://www.slideshare.net/appleboy/drone-cicd-platform"&gt;Drone 的基礎&lt;/a&gt;，所以這次上台北最主要探討 Drone 在今年 2019 Release 1.0 的一些重大功能，我相信大家在用舊的版本已經很順了，其實如果不升級到新的版本也是沒差。底下我會一一介紹 1.0 的新功能。有&lt;a href="https://hackmd.io/ijAIcc3KRZmBHwrrB96epg"&gt;共筆紀錄&lt;/a&gt;，大家可以先參考看看。&lt;/p&gt;</description></item><item><title>在 appveyor 內指定 Go 語言編譯版本</title><link>https://blog.wu-boy.com/2019/04/install-specific-go-version-in-appveyor/</link><pubDate>Sun, 14 Apr 2019 08:45:06 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/04/install-specific-go-version-in-appveyor/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;相信比較少人知道 &lt;a href="https://www.appveyor.com/"&gt;appveyor&lt;/a&gt; 這服務，我會接觸到此服務最大的原因是，要提供 &lt;a href="https://www.microsoft.com"&gt;Windows&lt;/a&gt; 的 Docker Image，並且上傳到 &lt;a href="https://hub.docker.com/"&gt;DockrHub&lt;/a&gt;，此服務提供了 Windows 環境，讓開發者可以透過此服務編譯 Windows 的 Binary 檔案，並且在 Windows 上執行測試，這對於我在寫 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;開源專案非常有幫助，畢竟平常開發真的沒有 Windows 相關的環境可以使用。但是 appveyor 在更新&lt;a href="https://www.appveyor.com/docs/windows-images-software/#golang"&gt;第三方套件&lt;/a&gt;非常的慢，這時候我們想要用 GO 的 1.12 版本就需要自行來安裝，安裝方式其實也不難，請參考底下設定。&lt;/p&gt;</description></item><item><title>用 Go 語言讀取專案內 .env 環境變數</title><link>https://blog.wu-boy.com/2019/04/how-to-load-env-file-in-go/</link><pubDate>Thu, 11 Apr 2019 08:38:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/04/how-to-load-env-file-in-go/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在現代開發專案時，一定會用到環境變數，像是讀取 AWS Secret Key 等等，在部署上面也會透過設定變數讓專案依據不同環境讀取不同環境變數，而 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;內如何實現讀取環境變數，又可以讓開發者透過 .env 檔案動態改變環境變數，本影片用簡單的套件來實現。這個在其他語言的 Framework 都有實現，像是 &lt;a href="https://laravel.com/docs/5.8/configuration"&gt;Laravel 的 .env 設定&lt;/a&gt;。透過本篇例子也教大家如何 import Go 語言的 Package。&lt;/p&gt;</description></item><item><title>用五分鐘了解什麼是 unbuffered vs buffered channel</title><link>https://blog.wu-boy.com/2019/04/understand-unbuffered-vs-buffered-channel-in-five-minutes/</link><pubDate>Thu, 04 Apr 2019 01:05:53 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/04/understand-unbuffered-vs-buffered-channel-in-five-minutes/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本篇要跟大家聊聊在 &lt;a href="https://golang.org" title="Go 語言"&gt;Go 語言&lt;/a&gt;內什麼是『unbuffered vs buffered channel』，在初學 Go 語言時，最大的挑戰就是了解 Channel 的使用時機及差異，而 Channel 又分為兩種，一種是 buffered channel，另一種是 unbuffered channel，底下我來用幾個簡單的例子帶大家了解這兩種 channel 的差異，讓初學者可以很快的了解 channel 使用方式。&lt;/p&gt;</description></item><item><title>10 分鐘內用 Traefik 架設 Drone 搭配 GitHub 服務</title><link>https://blog.wu-boy.com/2019/03/setup-traefik-with-drone-ci-cd-in-ten-minutes/</link><pubDate>Fri, 22 Mar 2019 06:12:41 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/03/setup-traefik-with-drone-ci-cd-in-ten-minutes/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/HIVQn1cNncIZ8EdJ7P-Nc9ohmuoSgGfnhB0Nfjl3fxsSoZ_RUBrz0yPB73EQy2Plc5NB1919QKsU7gwioFV0A9f-kD46qFovSkeJBO64iKPnTxZ860YGjdhRDMxseJ67OjSVSsEoskY=w2400"&gt;&lt;img src="https://lh3.googleusercontent.com/HIVQn1cNncIZ8EdJ7P-Nc9ohmuoSgGfnhB0Nfjl3fxsSoZ_RUBrz0yPB73EQy2Plc5NB1919QKsU7gwioFV0A9f-kD46qFovSkeJBO64iKPnTxZ860YGjdhRDMxseJ67OjSVSsEoskY=w2400" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;這標題也許有點誇張，但是如果實際操作一次，肯定可以在 10 分鐘內操作完成。本篇來教大家如何用 &lt;a href="https://traefik.io/"&gt;Traefik&lt;/a&gt; 當作前端 Proxy，後端搭配 &lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; 服務接 &lt;a href="https://github.com"&gt;GitHub&lt;/a&gt;，為什麼會用 Traefik，原因很簡單，你可以把 Traefik 角色想成是 &lt;a href="https://www.nginx.com/"&gt;Nginx&lt;/a&gt;，但是又比 Nginx 更簡單設定，另外一點就是，Traefik 自動整合了 &lt;a href="https://letsencrypt.org/"&gt;Let&amp;rsquo;s Encrypt&lt;/a&gt; 服務，您就不用擔心憑證會過期的問題。假如機器只會有一個 Drone 當 Host 的話，其實也可以不使用 Traefik，因為 Drone 其實也是內建自動更新憑證的功能。如果您對 Traefik 有興趣，可以直接參考底下兩篇文章&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.wu-boy.com/2019/01/deploy-service-using-traefik-and-docker/"&gt;用 Traefik 搭配 Docker 快速架設服務&lt;/a&gt; (內附教學影片)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.wu-boy.com/2019/01/traefik-docker-and-lets-encrypt/"&gt;Traefik 搭配 Docker 自動更新 Let’s Encrypt 憑證&lt;/a&gt; (內附教學影片)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>開源專案 Gitea 支援 OAuth Provider</title><link>https://blog.wu-boy.com/2019/03/gitea-support-oauth-provider/</link><pubDate>Sat, 09 Mar 2019 04:52:49 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/03/gitea-support-oauth-provider/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/SrQvhDJm5NMkrxrut0lACspnz6iQSFCX3vlbtGCuAcwO-i_4iJCJ6trK3V2F6Q6s6fQ_EcSglwAL0qO0aLaTRtk4Ca32EI7Ks1H7u_nI9jC6xn3PF9hhgccjkbN3irX5pGi9kV-vIxk=w1920-h1080" title="Gitea"&gt;&lt;img src="https://lh3.googleusercontent.com/SrQvhDJm5NMkrxrut0lACspnz6iQSFCX3vlbtGCuAcwO-i_4iJCJ6trK3V2F6Q6s6fQ_EcSglwAL0qO0aLaTRtk4Ca32EI7Ks1H7u_nI9jC6xn3PF9hhgccjkbN3irX5pGi9kV-vIxk=w1920-h1080" alt="Gitea" title="Gitea"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;很高興看到 &lt;a href="https://gitea.io" title="Gitea"&gt;Gitea&lt;/a&gt; 正式支援 &lt;a href="https://github.com/go-gitea/gitea/pull/5378" title="OAuth Provider "&gt;OAuth Provider&lt;/a&gt; 了，此功能經歷了四個月終於正式合併進 master 分支，預計會在 &lt;a href="https://github.com/go-gitea/gitea/milestone/32" title="1.18 版本"&gt;1.8 版本&lt;/a&gt;釋出，由於此功能已經進 master，這樣我們就可以把原本 Drone 透過帳號密碼登入，改成使用 OAtuh 方式了，增加安全性。但是在使用之前，Drone 需要合併 &lt;a href="https://github.com/drone/go-login/pull/3" title="drone/go-login"&gt;drone/go-login@3&lt;/a&gt; 及 &lt;a href="https://github.com/drone/drone/pull/2622" title="drone/drone@2622"&gt;drone/drone@2622&lt;/a&gt;。如果您會使用 Go 語言，不妨現在就可以來試試看了，透過 go build 來編譯原始碼。&lt;/p&gt;</description></item><item><title>在 docker-in-docker 環境中使用 cache-from 提升編譯速度</title><link>https://blog.wu-boy.com/2019/02/using-cache-from-can-speed-up-your-docker-builds/</link><pubDate>Sun, 24 Feb 2019 12:37:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/02/using-cache-from-can-speed-up-your-docker-builds/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/NxYD5o3PrenPHddPaNvv8EMK6u-cUdx5KnmmdYMXpxLzD9oDcTAchd0q4GRJxsOLJkeAhhVxzDmcJoWIzHqyo6hTV1FYZXzUbQ-elJNzlqKTYcBJcAOhkansgWHPTleQGOz92xwv_zE=w1920-h1080" title="提升 docker build 時間"&gt;&lt;img src="https://lh3.googleusercontent.com/NxYD5o3PrenPHddPaNvv8EMK6u-cUdx5KnmmdYMXpxLzD9oDcTAchd0q4GRJxsOLJkeAhhVxzDmcJoWIzHqyo6hTV1FYZXzUbQ-elJNzlqKTYcBJcAOhkansgWHPTleQGOz92xwv_zE=w1920-h1080" alt="提升 docker build 時間" title="提升 docker build 時間"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在現代 CI/CD 的環境流程中，使用 &lt;a href="https://github.com/jpetazzo/dind"&gt;Docker In Docker&lt;/a&gt; 來編譯容器已經相當流行了，像是 &lt;a href="https://about.gitlab.com/product/continuous-integration/"&gt;GitLab CI&lt;/a&gt; 或 &lt;a href="https://github.com/drone/drone" title="Drone"&gt;Drone&lt;/a&gt; 都是全走 &lt;a href="https://www.docker.com/" title="Docker"&gt;Docker&lt;/a&gt; 環境，然而有很多人建議盡量不要在 CI 環境使用 Docker In Docker，原因在於 CI 環境無法使用 Host Image 資料，導致每次要上傳 Image 到 &lt;a href="https://hub.docker.com/" title="Docker Hub"&gt;Docker Hub&lt;/a&gt; 時都需要重新下載所有的 Docker Layer，造成每次跑一次流程都會重複花費不少時間，而這個問題在 &lt;a href="https://github.com/docker/docker/releases/tag/v1.13.0"&gt;v1.13&lt;/a&gt; 時被解決，現在只要在編譯過程指定一個或者是多個 Image 列表，先把 Layer 下載到 Docker 內，接著對照 Dockerfile 內只要有被 Cache 到就不會重新再執行，講得有點模糊，底下直接拿實際例子來看看。&lt;/p&gt;</description></item><item><title>快速部署網站到 Heroku 雲平台</title><link>https://blog.wu-boy.com/2019/02/deploy-golang-app-to-heroku/</link><pubDate>Mon, 18 Feb 2019 02:56:19 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/02/deploy-golang-app-to-heroku/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jx4kYMmehnuyhVbEhvZKNEQwjCAgcTg2JIQamusY9-SuIbEEvJl2zXLJidfq-m9Oy1PQrROA9GQxdjjSiRVsvAGIj3tikwT0ZNB9XhciyCwjE60XE_jDJIqqEMmaKqwDzCMirK0u7Hw=w1920-h1080" title="部署網站到 Heroku 平台"&gt;&lt;img src="https://lh3.googleusercontent.com/jx4kYMmehnuyhVbEhvZKNEQwjCAgcTg2JIQamusY9-SuIbEEvJl2zXLJidfq-m9Oy1PQrROA9GQxdjjSiRVsvAGIj3tikwT0ZNB9XhciyCwjE60XE_jDJIqqEMmaKqwDzCMirK0u7Hw=w1920-h1080" alt="部署網站到 Heroku 平台" title="部署網站到 Heroku 平台"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;大家在寫開源專案時，一定需要一個免費的雲空間來放置網站，方便其他開發者在 &lt;a href="https://github.com" title="GitHub"&gt;GitHub&lt;/a&gt; 看到時，可以先點選 Demo 網站來試用，也許開發者可以使用 GitHub 提供的免&lt;a href="https://pages.github.com/" title="費靜態網站"&gt;費靜態網站&lt;/a&gt;，但是如果是跑 &lt;a href="https://golang.org" title="Golang"&gt;Golang&lt;/a&gt; 或是其他語言 &lt;a href="https://nodejs.org/" title="Node.js"&gt;Node.js&lt;/a&gt; 就不支援了，本篇來介紹 &lt;a href="https://www.heroku.com/" title="Ｈeroku 雲平台"&gt;Heroku 雲平台&lt;/a&gt;，它提供了開發者免費的方案，您可以將 GitHub 儲存庫跟 Heroku 結合，快速的將程式碼部署上去，Heroku 會給開發者一個固定的 URL (含有 HTTPS 憑證)，也可以動態的用自己買的網域。最重要的是 Heroku 提供了兩種更新方式，第一為 Git，只要開發者將程式碼 Push 到 Heroku 儲存庫，Heroku 就可以自動判斷開發者上傳的語言，並進行相對應的部署，另一種方式為 &lt;a href="https://www.docker.com/" title="Docker"&gt;Docker&lt;/a&gt; 部署，只要在儲存庫內放上 Dockerfile，透過 &lt;a href="https://devcenter.heroku.com/articles/heroku-cli" title="Heroku CLI"&gt;Heroku CLI&lt;/a&gt; 指令就可以將 Docker 容器上傳到 &lt;a href="https://devcenter.heroku.com/articles/container-registry-and-runtime" title="Heroku Docker Registry"&gt;Heroku Docker Registry&lt;/a&gt;，並且自動部署網站。底下我們來透過簡單的 Go 語言專案: &lt;a href="https://github.com/go-training/facebook-account-kit" title="Facebook Account Kit"&gt;Facebook Account Kit&lt;/a&gt; 來說明如何快速部署到 Heroku。&lt;/p&gt;</description></item><item><title>有效率的用 jsonnet 撰寫 Drone CI/CD 設定檔</title><link>https://blog.wu-boy.com/2019/01/converts-a-jsonnet-configuration-file-to-a-yaml-in-drone/</link><pubDate>Fri, 25 Jan 2019 07:40:34 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/01/converts-a-jsonnet-configuration-file-to-a-yaml-in-drone/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/z8q-kl8yaWy9LtUDNEluPfDiHouz0Q7GnQZDStid8j4CmOwgP9uZJsTOCXjmSzTTApmL6fukANr6UbEGAaebb5_iJ1j5LoXPFKtrrf_FdLOGFpt9zyYvdPo8OdpzrZ3qJDDx9CkanNM=w1920-h1080" title="Jsonnet + Drone"&gt;&lt;img src="https://lh3.googleusercontent.com/z8q-kl8yaWy9LtUDNEluPfDiHouz0Q7GnQZDStid8j4CmOwgP9uZJsTOCXjmSzTTApmL6fukANr6UbEGAaebb5_iJ1j5LoXPFKtrrf_FdLOGFpt9zyYvdPo8OdpzrZ3qJDDx9CkanNM=w1920-h1080" alt="Jsonnet + Drone" title="Jsonnet + Drone"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; 在 1.0 版本推出了用 &lt;a href="https://jsonnet.org"&gt;jsonnet&lt;/a&gt; 來撰寫 &lt;a href="https://en.wikipedia.org/wiki/YAML"&gt;YAML&lt;/a&gt; 設定檔，方便開發者可以維護多個專案設定。不知道大家有無遇過在啟動新的專案後，需要從舊的專案複製設定到新專案，或者是在 &lt;code&gt;.drone.yml&lt;/code&gt; 內有非常多重複性的設定，假設 &lt;a href="https://golang.org" title="Go 語言"&gt;Go 語言&lt;/a&gt;的開源專案需要將執行檔包成 ARM64 及 AMD64 的映像檔，並且上傳到 &lt;a href="https://hub.docker.com/" title="Docker Hub"&gt;Docker Hub&lt;/a&gt;，底下是 AMD64 的設定檔範例。剛好在 &lt;a href="https://www.udemy.com/devops-oneday" title="Udemy 課程"&gt;Udemy 課程&lt;/a&gt;內有學員詢問到&lt;a href="https://www.udemy.com/devops-oneday/learn/v4/questions/6162884"&gt;相關問題&lt;/a&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-15"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-16"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-17"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-18"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-18"&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-19"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-19"&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-20"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-20"&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-21"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-21"&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-22"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-22"&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-23"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-23"&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-24"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-24"&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-25"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-25"&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-26"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-26"&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-27"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-27"&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-28"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-28"&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-29"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-29"&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-30"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-30"&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-31"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-31"&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-32"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-32"&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-33"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-33"&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-34"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-34"&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-35"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-35"&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-36"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-36"&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-37"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-37"&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-38"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-38"&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-39"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-39"&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-40"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-40"&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-41"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-41"&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-42"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-42"&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-43"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-43"&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-44"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-44"&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-45"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-45"&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-46"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-46"&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-47"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-47"&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-48"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-48"&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-49"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-49"&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-50"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-50"&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-51"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-51"&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-52"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-52"&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-53"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-53"&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-54"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-54"&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-55"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-55"&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-56"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-56"&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-57"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-57"&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-58"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-58"&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-59"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-59"&gt;59&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-60"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-60"&gt;60&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-61"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-61"&gt;61&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-62"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-62"&gt;62&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-63"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-63"&gt;63&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-64"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-64"&gt;64&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-65"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-65"&gt;65&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-66"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-66"&gt;66&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-67"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-67"&gt;67&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-68"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-68"&gt;68&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-69"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-69"&gt;69&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-70"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-70"&gt;70&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-71"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-71"&gt;71&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-72"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-72"&gt;72&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-73"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-73"&gt;73&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-74"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-74"&gt;74&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-75"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-75"&gt;75&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-76"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-76"&gt;76&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008b45;text-decoration:underline"&gt;---&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;kind&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;pipeline&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;linux-arm64&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;platform&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;os&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;linux&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;arch&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;arm64&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;steps&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#8b008b;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;build-push&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;pull&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;always&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;image&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;golang:1.11&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;commands&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#cd5555"&gt;&amp;#34;go build -v -ldflags \&amp;#34;-X main.build=${DRONE_BUILD_NUMBER}\&amp;#34; -a -o release/linux/arm64/drone-discord&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;environment&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;CGO_ENABLED&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b452cd"&gt;0&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;GO111MODULE&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;on&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;when&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;event&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- push&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- pull_request&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#8b008b;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;build-tag&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;pull&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;always&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;image&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;golang:1.11&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;commands&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#cd5555"&gt;&amp;#34;go build -v -ldflags \&amp;#34;-X main.version=${DRONE_TAG##v} -X main.build=${DRONE_BUILD_NUMBER}\&amp;#34; -a -o release/linux/arm64/drone-discord&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;environment&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;CGO_ENABLED&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b452cd"&gt;0&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;GO111MODULE&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;on&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;when&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;event&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- tag&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#8b008b;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;executable&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;pull&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;always&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;image&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;golang:1.11&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;commands&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- ./release/linux/arm64/drone-discord --help&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#8b008b;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;dryrun&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;pull&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;always&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;image&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;plugins/docker:linux-arm64&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;settings&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;dockerfile&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;docker/Dockerfile.linux.arm64&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;dry_run&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;true&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;password&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;from_secret&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;docker_password&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;repo&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;appleboy/drone-discord&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;tags&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;linux-arm64&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;username&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;from_secret&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;docker_username&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;when&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;event&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- pull_request&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#8b008b;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;publish&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;pull&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;always&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;image&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;plugins/docker:linux-arm64&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;settings&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;auto_tag&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;true&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;auto_tag_suffix&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;linux-arm64&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;dockerfile&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;docker/Dockerfile.linux.arm64&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;password&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;from_secret&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;docker_password&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;repo&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;appleboy/drone-discord&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;username&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;from_secret&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;docker_username&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;when&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;event&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- push&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- tag&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;trigger&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;branch&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- master&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Traefik 搭配 Docker 自動更新 Let’s Encrypt 憑證</title><link>https://blog.wu-boy.com/2019/01/traefik-docker-and-lets-encrypt/</link><pubDate>Sun, 20 Jan 2019 10:54:20 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/01/traefik-docker-and-lets-encrypt/</guid><description>&lt;p&gt;&lt;strong&gt;2019.10.23 本篇教學以 Traefik 1.7 版本為主&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/sggr23jjw2BJb3HMIpM9RtSTetm8TeEuk1CCbV6658ZZO5CCwEPK2YdGpOYPFrw4fansfS-aMNE5h-uv-8s7quNiuj4EU-UF0DBaNbKZt3YyNruAICq6JxUss9S5IPAC7TQfQlHbL2M=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/sggr23jjw2BJb3HMIpM9RtSTetm8TeEuk1CCbV6658ZZO5CCwEPK2YdGpOYPFrw4fansfS-aMNE5h-uv-8s7quNiuj4EU-UF0DBaNbKZt3YyNruAICq6JxUss9S5IPAC7TQfQlHbL2M=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;之前寫過蠻多篇 &lt;a href="https://blog.wu-boy.com/?s=+Let%27s+Encrypt" title="Let's Encrypt 的使用教學"&gt;Let&amp;rsquo;s Encrypt 的使用教學&lt;/a&gt;，但是這次要跟大家介紹一套非常好用的工具 &lt;a href="https://traefik.io/" title="Traefik"&gt;Traefik&lt;/a&gt; 搭配自動化更新 Let&amp;rsquo;s Encrypt 憑證，為什麼會推薦 Traefik 呢，原因在於 Traefik 可以自動偵測 Docker 容器內的 Label 設定，並且套用設定在 Traefik 服務內，也就是只要修改服務的 docker-compose 內容，重新啟動，Traefik 就可以抓到新的設定。這點在其它工具像是 &lt;a href="https://www.nginx.com/" title="Nginx"&gt;Nginx&lt;/a&gt; 或 &lt;a href="https://caddyserver.com" title="Caddy"&gt;Caddy&lt;/a&gt; 是無法做到的。底下我們來一步一步教大家如何設定啟用前後端服務。全部程式碼都放在 &lt;a href="https://github.com/go-training/training/tree/master/example25-traefik-golang-app-lets-encrypt" title="GitHub 上面"&gt;GitHub 上面&lt;/a&gt;了。&lt;/p&gt;</description></item><item><title>Seagate 2.5吋 4TB 外接硬碟 好市多 2699 元</title><link>https://blog.wu-boy.com/2019/01/costco-seagate-usb-hard-disk-2699/</link><pubDate>Sun, 20 Jan 2019 05:50:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/01/costco-seagate-usb-hard-disk-2699/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/cIef9ELcqruDTCeCpZ5TOgmLhfocUgbNXF_miVkMF10PtnCGHDSWLpZEwSZHZUCb_Wlwhj2ksKdYFPqTlKtQByWU9Re0JEM21HVLRRM0SmWDDhzYEiK3LBGa8Kmq1T0_G6uw7NDNrHM=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/cIef9ELcqruDTCeCpZ5TOgmLhfocUgbNXF_miVkMF10PtnCGHDSWLpZEwSZHZUCb_Wlwhj2ksKdYFPqTlKtQByWU9Re0JEM21HVLRRM0SmWDDhzYEiK3LBGa8Kmq1T0_G6uw7NDNrHM=w1920-h1080" alt="Seagate 2.5吋 4TB 外接硬碟 好市多 2699 元"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本週 &lt;a href="https://www.costco.com.tw/" title="Costco"&gt;Costco&lt;/a&gt; 正在特價 &lt;a href="https://www.seagate.com/" title="Seagate"&gt;Seagate&lt;/a&gt; 4TB 外接硬碟特價 2699 元，本來只有 3TB 特價 2699 元活動，後來廠商供應數量不夠，只好拿 4TB 一起來特價 2699 元，所以我去賣場發現一樣價錢，但是足足多了 1 TB 容量啊，只有在本週特價喔 01/18 ~ 01/27 數量有限，賣完就沒了。目前 &lt;a href="https://www.costco.com.tw/Computers/Hard-Drives-Memory/External-Portable-Hard-Disks/Seagate-4TB-25-Hard-Drive-STEA4000400/p/122839" title="costco 線上版本"&gt;costco 線上版本&lt;/a&gt;已經賣完 4TB 了，大家有需要的可以快去現場看看。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/LJiQGwrKj9ItOl49BgI7KuWdP-NTJzjV645iCSygyKT0bFdWy8bwKBy_tQgcUclVeDc-oWfvKs2Pazi0UpaxoRY1KFqjAyl3dxc8q8c2WqX8fHz-bocfiqtVW_lLz-Ww7lzEpdGRVdY=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/LJiQGwrKj9ItOl49BgI7KuWdP-NTJzjV645iCSygyKT0bFdWy8bwKBy_tQgcUclVeDc-oWfvKs2Pazi0UpaxoRY1KFqjAyl3dxc8q8c2WqX8fHz-bocfiqtVW_lLz-Ww7lzEpdGRVdY=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>用 Traefik 搭配 Docker 快速架設服務</title><link>https://blog.wu-boy.com/2019/01/deploy-service-using-traefik-and-docker/</link><pubDate>Tue, 08 Jan 2019 03:51:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2019/01/deploy-service-using-traefik-and-docker/</guid><description>&lt;p&gt;&lt;strong&gt;更新: 2019.01.10 新增教學影片&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/TAK3Xi-hQKY1RCRGFLWmUGwdhP8UdI5mrWDyV5rQstQaQMDa27Fp0JOX2lezArNrZEdX227TyajH9wmVO3geDSFGQH9QBU4MANFSCBmPnlL2_eEehszF2tPhm1NNv1xYiCgiSM6air8=w1920-h1080" title="drone traefik docker deploy"&gt;&lt;img src="https://lh3.googleusercontent.com/TAK3Xi-hQKY1RCRGFLWmUGwdhP8UdI5mrWDyV5rQstQaQMDa27Fp0JOX2lezArNrZEdX227TyajH9wmVO3geDSFGQH9QBU4MANFSCBmPnlL2_eEehszF2tPhm1NNv1xYiCgiSM6air8=w1920-h1080" alt="drone traefik docker deploy" title="drone traefik docker deploy"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;相信大家在架設服務肯定會選一套像是 &lt;a href="http://www.haproxy.org/"&gt;HAProxy&lt;/a&gt;, &lt;a href="https://www.nginx.com/" title="Nginx"&gt;Nginx&lt;/a&gt;, &lt;a href="https://httpd.apache.org/" title="Apache"&gt;Apache&lt;/a&gt; 或 &lt;a href="https://caddyserver.com/" title="Caddy"&gt;Caddy&lt;/a&gt;，這四套架設的難度差不多，如果要搭配 &lt;a href="https://letsencrypt.org/" title="Let's Encrypt"&gt;Let&amp;rsquo;s Encrypt&lt;/a&gt; 前面兩套需要自己串接 (Nginx, Apache)，而 Caddy 是用 &lt;a href="https://golang.org/" title="Golang"&gt;Golang&lt;/a&gt; 開發裡面已經內建了 Let&amp;rsquo;s Encrypt，，管理者不用擔心憑證過期，相當方便。但是本篇我要介紹另外一套工具叫 &lt;a href="https://traefik.io/" title="Traefik"&gt;Traefik&lt;/a&gt;，這一套也是用 Go 語言開發，而我推薦這套的原因是，此套可以跟 Docker 很深度的結合，只要服務跑在 Docker 上面，Traefik 都可以自動偵測到，並且套用設定。透過底下的範例讓 Traefik 串接後端兩個服務，分別是 &lt;code&gt;domain1.com&lt;/code&gt; 及 &lt;code&gt;domain2.com&lt;/code&gt;。來看看如何快速設定 Traefik。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/e4VvNhQLdG0agSrE3EbxYURmbZevK8kVUaBhvHE3FVg_9iCRFeDFdFo9PHEm9EGPkYX2Q-ZmdcwyJhsDRbPi0HdZIN1HRjdkgFI8mWrbVWPLscPKI2WxCDIlSkCzB2zoh6pay-3R2Xg=w1920-h1080" title="traefik + docker + golang"&gt;&lt;img src="https://lh3.googleusercontent.com/e4VvNhQLdG0agSrE3EbxYURmbZevK8kVUaBhvHE3FVg_9iCRFeDFdFo9PHEm9EGPkYX2Q-ZmdcwyJhsDRbPi0HdZIN1HRjdkgFI8mWrbVWPLscPKI2WxCDIlSkCzB2zoh6pay-3R2Xg=w1920-h1080" alt="traefik + docker + golang" title="traefik + docker + golang"&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Go Module 導入到專案內且搭配 Travis CI 或 Drone 工具</title><link>https://blog.wu-boy.com/2018/12/go-module-integrate-with-travis-or-drone/</link><pubDate>Sun, 30 Dec 2018 03:07:54 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/12/go-module-integrate-with-travis-or-drone/</guid><description>&lt;p&gt;&lt;a href="https://photos.google.com/share/AF1QipPZ8MkcLAazbfRWwBrT1CQpipCL8N_1uAcYosJmJ-o6du2XRRHNEokVarxey5Bp8w?key=clctLU9JYVMzcEdHYWR2dUlVTVZ6YnZUUjlYRG9B&amp;amp;source=ctrlq.org"&gt;&lt;img src="https://lh3.googleusercontent.com/Q5CP9S-xtRHxnDRvxDpWWkvBsEVw5C5uRyb5EiBh-UpYkrp_dkZp_oN8yi1WtqwruhSgnwNMB5QjJPxO94ABjG9oLBqmcRjlouNTNmrChIWbQcsAAbuV9eWB1wbsK-x-OY6iolb5ahc=w2400" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;相信各位 &lt;a href="http://golang.org"&gt;Go 語言&lt;/a&gt;開發者陸陸續續都將專案從各種 &lt;a href="https://github.com/golang/go/wiki/PackageManagementTools"&gt;Vendor 工具&lt;/a&gt;轉換到 &lt;a href="https://github.com/golang/go/wiki/Modules"&gt;Go Module&lt;/a&gt;，本篇會帶大家一步一步從舊專案轉換到 Go Module，或是該如何導入新專案，最後會結合 CI/CD 著名的兩套工具 &lt;a href="https://travis-ci.org/"&gt;Travis&lt;/a&gt; 或 &lt;a href="https://drone.io/"&gt;Drone&lt;/a&gt; 搭配 Go Module 測試。&lt;/p&gt;</description></item><item><title>用 Docker 整合測試 Flutter 框架</title><link>https://blog.wu-boy.com/2018/12/docker-testing-with-flutter-sdk/</link><pubDate>Wed, 26 Dec 2018 03:56:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/12/docker-testing-with-flutter-sdk/</guid><description>&lt;p&gt;&lt;a href="https://photos.google.com/share/AF1QipPVsiQNMhQf-l7rJBe-Ki9RMxMVz0x-xSDpayq967sskqwi2bzqgHBQyc9xaby8eA?key=b0xKVW5oSlEwZEl2b0FESUNDVFRGV2dYbkVPRVVB&amp;amp;source=ctrlq.org"&gt;&lt;img src="https://lh3.googleusercontent.com/REguGdEy6qgmZyU7hNscYxXV1lGzSTioUb_cBe4uVLdBNUxL2Y9oNwx2J8w6VU8BMcZhBOJoAI091l9lCJuueumNEef7ub75Dvrbl2ZC1Ri9QholsnccGd6txg9rbXP5oZoNIQVl_Fk=w700" alt=""&gt;&lt;/a&gt; &lt;a href="https://flutter.io"&gt;Flutter&lt;/a&gt; 是一套以 &lt;a href="https://www.dartlang.org/"&gt;Dart&lt;/a&gt; 語言為主體的手機 App 開發框架，讓開發者可以寫一種語言產生 iOS 及 Android，只要裝好 Flutter 框架，就可以在個人電腦上面同時測試 iOS 及 Android 流程，如果您需要 Docker 環境，可以直接參考&lt;a href="https://github.com/appleboy/flutter-docker"&gt;此開源專案&lt;/a&gt;，裡面已經將 Flutter 1.0 SDK 包在容器，只要將專案目錄掛載到 Docker 內，就可以透過 &lt;code&gt;flutter test&lt;/code&gt; 指令來完成測試，對於 CI/CD 流程使用 Docker 技術非常方便。&lt;/p&gt;</description></item><item><title>將 Flickr 相簿備份到 Google Photos</title><link>https://blog.wu-boy.com/2018/12/upload-flickr-to-google-photos/</link><pubDate>Thu, 20 Dec 2018 02:43:29 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/12/upload-flickr-to-google-photos/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/D7QDeQ5CKOgRnQoFLn0_uuZ8sYyjsf7o2HedEWYnLYKLx0yUBhNL6FGRQD9UXyzENIpWqUpJPWvzeGxUr1WHi8LA6CJIUYsBF1JlnajNfHSTD6oI-jWthUL9F6ZdmJIEi_09adlnkSU=w2400" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com"&gt;Flickr&lt;/a&gt; 在 &lt;a href="https://www.flickr.com/lookingahead/"&gt;2019 年一月&lt;/a&gt;會開始將免費會員照片刪除到剩下 1000 張，這次透過 &lt;a href="https://github.com/nmrshll/gphotos-uploader-cli"&gt;Go 工具&lt;/a&gt; 來將備份好的 Flickr 相簿上傳到 Google Photos，此工具只適合用在 MacOS 及 Linux 上面，Windows 請改用『&lt;a href="https://www.playpcesor.com/2017/07/google-Backup-and-Sync-photos.html"&gt;Backup and Sync from Google&lt;/a&gt;』工具。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;*Free members with more than 1,000 photos or videos uploaded to Flickr have until Tuesday, January 8, 2019, to upgrade to Pro or download content over the limit. After January 8, 2019, members over the limit will no longer be able to upload new photos to Flickr. After February 5, 2019, free accounts that contain over 1,000 photos or videos will have content actively deleted &amp;ndash; starting from oldest to newest date uploaded &amp;ndash; to meet the new limit.&lt;/p&gt;</description></item><item><title>Drone CI/CD 推出 Cloud 服務支援開源專案</title><link>https://blog.wu-boy.com/2018/12/drone-cloud-service/</link><pubDate>Sun, 09 Dec 2018 11:25:30 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/12/drone-cloud-service/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/46191388892/in/dateposted-public/" title="Screen Shot 2018-12-08 at 10.36.20 PM"&gt;&lt;img src="https://i1.wp.com/farm2.staticflickr.com/1956/46191388892_1446150027_z.jpg?w=840&amp;#038;ssl=1" alt="Screen Shot 2018-12-08 at 10.36.20 PM" data-recalc-dims="1" /&gt;&lt;/a&gt; &lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; 在上個月宣布推出 &lt;a href="https://blog.drone.io/drone-cloud/"&gt;Cloud 服務&lt;/a&gt; 整合 &lt;a href="https://github.com"&gt;GitHub&lt;/a&gt; 帳戶內的 Repo，只要登入後就可以跑 GitHub 上面的專案自動化整合及測試，原先在 GitHub 上面常見的就是 &lt;a href="https://travis-ci.org/"&gt;Travis&lt;/a&gt; 或 &lt;a href="https://circleci.com/"&gt;CircleCI&lt;/a&gt;，現在 Drone 也正式加入角逐行列，但是從文中內可以看到其實是由 &lt;a href="http://packet.net/"&gt;Packet&lt;/a&gt; 這間公司獨家贊助硬體及網路給 Drone，兩台實體機器，一台可以跑 X86 另外一台可以跑 ARM，也就是如果有在玩 ARM 開發版，現在可以直接在 Drone Cloud 上面直接跑測試。底下是硬體規格:&lt;/p&gt;</description></item><item><title>Flutter 推出 1.0 版本</title><link>https://blog.wu-boy.com/2018/12/flutter-release-1-0-0-version/</link><pubDate>Wed, 05 Dec 2018 03:51:05 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/12/flutter-release-1-0-0-version/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/46133062882/in/dateposted-public/" title="Screen Shot 2018-12-05 at 10.25.34 AM"&gt;&lt;img src="https://i0.wp.com/farm5.staticflickr.com/4843/46133062882_6aed05cb12_z.jpg?resize=640%2C422&amp;#038;ssl=1" alt="Screen Shot 2018-12-05 at 10.25.34 AM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;很高興看到台灣時間 12/5 號 &lt;a href="https://flutter.io/"&gt;Flutter&lt;/a&gt; 正式推出 &lt;a href="https://developers.googleblog.com/2018/12/flutter-10-googles-portable-ui-toolkit.html"&gt;1.0 版本&lt;/a&gt;，相信很多人都不知道什麼是 Flutter，簡單來說開發者只要學會 Flutter 就可以維護一套程式碼，並且同時編譯出 iOS 及 Android 手機 App，其實就跟 &lt;a href="https://facebook.com"&gt;Facebook&lt;/a&gt; 推出的 &lt;a href="https://facebook.github.io/react-native/"&gt;React Native&lt;/a&gt; 一樣，但是 Flutter 的老爸是 &lt;a href="https://google.com"&gt;Google&lt;/a&gt;。相信大家很常看到這一兩年內，蠻多新創公司相繼找 RN 工程師，而不是分別找兩位 iOS 及 Android 工程師，原因就在後續的維護性及成本。而 Flutter 也有相同好處。我個人覺得 RN 跟 Flutter 比起來，單純對入門來說，RN 是非常好上手的，但是如果您考慮到後續的維護成本，我建議選用 Flutter，雖然 Flutter 要學一套全新的語言 &lt;a href="https://www.dartlang.org/"&gt;Dart&lt;/a&gt;，在初期時要學習如何使用 Widgets，把很多元件都寫成 Widgets 方便後續維護。但是在 RN 後期的維護使用了大量的第三方 Library，您想要升級一個套件可能影響到太多地方，造成不好維護。語言選擇 RN 可以使用純 JavaScript 撰寫，或者是導入 JS Flow + TypeScript 來達到 Statically Type，而 Flutter 則是使用 Dart 直接支援強型別編譯。如果現在要我選擇學 RN 或 Flutter 我肯定選擇後者。那底下來看看這次 Flutter 釋出了哪些新功能？對於 Flutter 還不了解的，可以看底下介紹影片。&lt;/p&gt;</description></item><item><title>Drone 支援單機版安裝 (內附影片)</title><link>https://blog.wu-boy.com/2018/11/install-drone-in-single-machine/</link><pubDate>Mon, 26 Nov 2018 03:43:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/11/install-drone-in-single-machine/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/32181752988/in/dateposted-public/" title="Screen Shot 2018-11-26 at 11.40.28 AM"&gt;&lt;img src="https://i0.wp.com/farm5.staticflickr.com/4820/32181752988_0112dca2a5_z.jpg?w=840&amp;#038;ssl=1" alt="Screen Shot 2018-11-26 at 11.40.28 AM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在上週寫了『&lt;a href="https://blog.wu-boy.com/2018/11/drone-release-1-0-0-rc1/"&gt;Drone 推出 1.0.0 RC1 版本&lt;/a&gt;』介紹，裡面提到一個很重要的改變，就是 Drone 現在支援『單機版』安裝了，你會問什麼是單機版安裝？以前不就是可以支援在單台機器把 Drone 給架設起來，那在 1.0.0 RC1 版本指的是什麼意思？在之前的版本，要完整的安裝完成 Drone，需要架設 drone server 及 drone agent，但是在 1.0 版本之後，只需要一個 drone 服務，裡面就內建了 server 及 agent，這很適合用在團隊非常小的狀況底下來快速安裝 drone，假設團隊專案很多，或者是成長很快，建議還是將 server 及 agent 分開架設，未來只需要擴充 agent 即可，底下來看看該如何架設單機版 drone。&lt;/p&gt;</description></item><item><title>開源專案 Drone 推出 1.0.0 RC1 版本</title><link>https://blog.wu-boy.com/2018/11/drone-release-1-0-0-rc1/</link><pubDate>Mon, 19 Nov 2018 02:26:03 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/11/drone-release-1-0-0-rc1/</guid><description>&lt;img src="https://i2.wp.com/farm5.staticflickr.com/4838/45223480124_b038fd86c1_z.jpg?w=840&amp;#038;ssl=1" alt="Screen Shot 2018-11-19 at 10.12.47 AM" data-recalc-dims="1" /&gt;
&lt;p&gt;終於看到 &lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; 作者 &lt;a href="https://twitter.com/bradrydzewski"&gt;bradrydzewski&lt;/a&gt; 在 &lt;a href="https://blog.drone.io/drone-1-release-candidate-1/"&gt;11/7 號釋出 1.0.0-RC1 版本&lt;/a&gt;，此版本尚未開源在 GitHub 上面，所以目前只能透過 docker 方式來安裝。另外如果您正在用 0.8.x 版本的，不建議現在轉換到 1.0 版本，原因有幾點，第一作者尚未公開原始碼，第二現在公開也才一週而已，還有很多 bug 以及用法都沒有在線上 document 寫很清楚，第三就是作者尚未提供工具從 0.8.x 升級到 1.0.0 RC 版本。根據上述的原因，建議大家先不要轉換，當然如果團隊尚未導入 CI/CD 的話，我強烈建議使用 1.0.0 RC-1 版本。底下來看看 1.0.0 RC-1 做了哪些變動？&lt;/p&gt;</description></item><item><title>高雄 Mopcon 濁水溪以南最大研討會 – Drone CI/CD 介紹</title><link>https://blog.wu-boy.com/2018/11/drone-ci-cd-platform-in-mopconf/</link><pubDate>Tue, 06 Nov 2018 05:28:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/11/drone-ci-cd-platform-in-mopconf/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/45693842842/in/dateposted-public/" title="Screen Shot 2018-11-06 at 1.16.22 PM"&gt;&lt;img src="https://i1.wp.com/farm2.staticflickr.com/1948/45693842842_d5fb6105b5_z.jpg?w=840&amp;#038;ssl=1" alt="Screen Shot 2018-11-06 at 1.16.22 PM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今年又以講者身份參加 &lt;a href="https://mopcon.org"&gt;Mopcon&lt;/a&gt; 南區最大研討會，此次回高雄最主要推廣 &lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; 這套 CI/CD 平台。大家可以從過去的 Blog 或影片可以知道我在北部推廣了很多次 Drone 開源軟體，唯獨南台灣還沒講過，所以透過 Mopcon 研討會終於有機會可以來推廣了。本次把 Drone 的架構圖畫出來，如何架設在 &lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt; 上以及該如何擴展 drone agent，有興趣的可以參考底下投影片:&lt;/p&gt;</description></item><item><title>用 10 分鐘部署專案到 AWS Lambda</title><link>https://blog.wu-boy.com/2018/10/deploy-app-to-aws-lambda-using-up-tool-in-ten-minutes/</link><pubDate>Thu, 25 Oct 2018 03:10:18 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/10/deploy-app-to-aws-lambda-using-up-tool-in-ten-minutes/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/43711539730/in/dateposted-public/" title="Screen Shot 2018-10-24 at 9.37.49 AM"&gt;&lt;img src="https://i1.wp.com/farm2.staticflickr.com/1956/43711539730_7bd9f610c3_z.jpg?w=840&amp;#038;ssl=1" alt="Screen Shot 2018-10-24 at 9.37.49 AM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;看到這標題也許非常聳動，也可能覺得不可思議，今天來探討如何將專案直接部署到 &lt;a href="https://aws.amazon.com/tw/lambda/"&gt;AWS Lambda&lt;/a&gt; 並且自動化將 &lt;a href="https://aws.amazon.com/tw/api-gateway/"&gt;API Gateway&lt;/a&gt; 設定完成。當然要做到完全自動化，必須要使用一些工具才能完成，本篇將介紹由 &lt;a href="https://github.com/tj"&gt;TJ&lt;/a&gt; 所開發的 &lt;a href="https://github.com/apex/up"&gt;apex/up&lt;/a&gt; 工具，如果您不熟悉 EC2 也不太懂 Command line 操作，本文非常適合您，不需要管理任何 EC2 機器，也不需要在熟悉任何 Linux Command 就可以完成簡單的專案部署。首先為什麼我選擇 apex/up 而不是選擇 &lt;a href="https://github.com/apex/apex"&gt;apex/apex&lt;/a&gt;，原因是使用 up 工具，您的專案是不用更動任何程式碼，就可以將專案直接執行在 AWS Lambda，那 API Gateway 部分也會一並設定完成，將所有 Request 直接 Proxy 到該 Lambda function。如果您希望對於 AWS Lambda 有更多進階操作，我會建議您用 &lt;a href="https://github.com/apex/apex"&gt;apex/apex&lt;/a&gt; 或 &lt;a href="https://serverless.com/"&gt;Serverless&lt;/a&gt;。您可以想像使用 up 就可以將 AWS Lambda 當作小型的 EC2 服務，但是不用自己管理 EC2，現在 up 支援 &lt;a href="https://golang.org"&gt;Golang&lt;/a&gt;, &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt;, &lt;a href="https://www.python.org/"&gt;Python&lt;/a&gt; 或 Java 程式語言，用一行 command 就可以將專案部署到雲端了。&lt;/p&gt;</description></item><item><title>Go 語言 1.11 版本推出 go module</title><link>https://blog.wu-boy.com/2018/10/go-1-11-support-go-module/</link><pubDate>Tue, 16 Oct 2018 04:48:07 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/10/go-1-11-support-go-module/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/40093179410/in/dateposted-public/" title="Go-Logo_Blue"&gt;&lt;img src="https://i1.wp.com/farm1.staticflickr.com/908/40093179410_53df4bb9e8_z.jpg?w=840&amp;#038;ssl=1" alt="Go-Logo_Blue" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本篇來聊聊 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;在 1.11 版本推出的 &lt;a href="https://github.com/golang/go/wiki/Modules"&gt;新功能&lt;/a&gt;，相信大家也許還不知道此功能是做什麼用的，我們來回顧看看在初學 Go 語言的時候，最令人困擾的就是 &lt;code&gt;GOPATH&lt;/code&gt;，所有的專案都必須要在 GOPATH 底下開發，然而在更久前還沒有 Vendor 時候，兩個專案用不同版本的同一個 Package 就必須要使用多個 GOPATH 來解決，但是隨著 Vendor 在 1.5 版的推出，解決了這問題，所以現在只要把專案放在 GOPATH 底下，剩下的 Package 管理都透過 Vendor 目錄來控管，在很多大型開源專案都可以看到把 Vendor 目錄放入版本控制已經是基本的 Best Practice，而 go module 推出最大功能用來解決 GOPATH 問題，也就是未來開發專案，&lt;strong&gt;隨意讓開發者 clone 專案到任何地方都可以&lt;/strong&gt;，另外也統一個 Package 套件管理，不再需要 &lt;code&gt;Vendor&lt;/code&gt; 目錄，底下舉個實際例子來說明。&lt;/p&gt;</description></item><item><title>gofight 支援多個檔案上傳測試</title><link>https://blog.wu-boy.com/2018/09/gofight-support-upload-file-testing/</link><pubDate>Tue, 25 Sep 2018 01:20:29 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/09/gofight-support-upload-file-testing/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/appleboy/gofight"&gt;gofight&lt;/a&gt; 是一套用 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;撰寫的 HTTP API 測試套件，之前已經寫過&lt;a href="https://blog.wu-boy.com/2016/04/gofight-tool-for-api-handler-testing-in-golang/"&gt;一篇介紹用法&lt;/a&gt;，當時候尚未支援檔案上傳測試，也就是假設寫了一個&lt;a href="https://github.com/gin-gonic/gin/#upload-files"&gt;檔案上傳的 http handler&lt;/a&gt; 在專案內如何寫測試，底下來看看該如何使用。&lt;/p&gt;</description></item><item><title>Go 語言專案程式碼品質</title><link>https://blog.wu-boy.com/2018/09/golang-project-quality/</link><pubDate>Thu, 20 Sep 2018 01:58:00 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/09/golang-project-quality/</guid><description>&lt;p&gt;&lt;a href="https://i2.wp.com/farm1.staticflickr.com/805/39050902230_b1d91bc120_z.jpg?ssl=1"&gt;&lt;img src="https://i2.wp.com/farm1.staticflickr.com/805/39050902230_b1d91bc120_z.jpg?w=840&amp;#038;ssl=1" alt="" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本篇想介紹我在寫開源專案會用到的工具及服務，其實在編譯 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;同時，就已經確保了一次程式碼品質，或者是在編譯之前會跑 &lt;code&gt;go fmt&lt;/code&gt; 或 &lt;code&gt;go vet&lt;/code&gt; 的驗證，網路上也蠻多工具可以提供更多驗證，像是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;errcheck (檢查是否略過錯誤驗證)&lt;/li&gt;
&lt;li&gt;unused (檢查沒用到的 func, variable or const)&lt;/li&gt;
&lt;li&gt;structcheck (檢查 struct 內沒有用到的 field)&lt;/li&gt;
&lt;li&gt;varcheck (拿掉沒有用到的 const 變數)&lt;/li&gt;
&lt;li&gt;deadcode (沒有用到的程式碼)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但是這麼多驗證工具，要一一導入專案，實在有點麻煩，我自己在公司內部只有驗證 &lt;code&gt;go fmt&lt;/code&gt; 或 &lt;code&gt;go vet&lt;/code&gt; 或 &lt;a href="github.com/client9/misspell"&gt;misspell-check&lt;/a&gt; (驗證英文單字是否錯誤) 及 &lt;a href="https://github.com/kardianos/govendor"&gt;vendor-check&lt;/a&gt; (驗證開發者是否有去修改過 vendor 而沒有恢復修正)。如果你有在玩開源專案，其實可以不用這麼麻煩，導入兩套工具就可以讓你安心驗證別人發的 PR。底下來介紹一套工具及另外一套雲端服務。&lt;/p&gt;</description></item><item><title>Go 語言的 graphQL-go 套件正式支援 Concurrent Resolvers</title><link>https://blog.wu-boy.com/2018/09/graphql-go-library-support-concurrent-resolvers/</link><pubDate>Sun, 16 Sep 2018 03:35:36 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/09/graphql-go-library-support-concurrent-resolvers/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;要在 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;寫 graphQL，大家一定對 &lt;a href="https://github.com/graphql-go/graphql"&gt;graphql-go&lt;/a&gt; 不陌生，討論度最高的套件，但是我先說，雖然討論度是最高，但是效能是最差的，如果大家很要求效能，可以先參考此&lt;a href="https://github.com/appleboy/golang-graphql-benchmark"&gt;專案&lt;/a&gt;，裡面有目前 Go 語言的 graphQL 套件比較效能，有機會在寫另外一篇介紹。最近 graphql-go 的作者把 Concurrent Resolvers 的解法寫了一篇 &lt;a href="https://github.com/graphql-go/graphql/issues/389"&gt;Issue 來討論&lt;/a&gt;，最終採用了 &lt;a href="https://github.com/graphql-go/graphql/pull/388"&gt;Resolver returns a Thunk&lt;/a&gt; 方式來解決 Concurrent 問題，這個 PR 沒有用到額外的 goroutines，使用方式也最簡單&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;pullRequests&amp;#34;&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&amp;amp;graphql.Field{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Type:&lt;span style="color:#bbb"&gt; &lt;/span&gt;graphql.&lt;span style="color:#008b45"&gt;NewList&lt;/span&gt;(PullRequestType),&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Resolve:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;func&lt;/span&gt;(p&lt;span style="color:#bbb"&gt; &lt;/span&gt;graphql.ResolveParams)&lt;span style="color:#bbb"&gt; &lt;/span&gt;(&lt;span style="color:#8b008b;font-weight:bold"&gt;interface&lt;/span&gt;{},&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;error&lt;/span&gt;)&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ch&lt;span style="color:#bbb"&gt; &lt;/span&gt;:=&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#658b00"&gt;make&lt;/span&gt;(&lt;span style="color:#8b008b;font-weight:bold"&gt;chan&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;[]PullRequest)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;// Concurrent work via Goroutines.&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;go&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;func&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;// Async work to obtain pullRequests.&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ch&lt;span style="color:#bbb"&gt; &lt;/span&gt;&amp;lt;-&lt;span style="color:#bbb"&gt; &lt;/span&gt;pullRequests&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}()&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;func&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;interface&lt;/span&gt;{}&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&amp;lt;-ch&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;},&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;},&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;},&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="使用方式"&gt;使用方式&lt;/h2&gt;
&lt;p&gt;先用一個簡單例子來解釋之前的寫法會是什麼形式&lt;/p&gt;</description></item><item><title>在 PostgreSQL 時區轉換及計算時間</title><link>https://blog.wu-boy.com/2018/09/converting-timestamp-to-timestamp-in-a-specific-time-zone-in-postgres/</link><pubDate>Sun, 02 Sep 2018 07:51:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/09/converting-timestamp-to-timestamp-in-a-specific-time-zone-in-postgres/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/vbqq3rLa3xH1e2c1snKm4u0hhkm4mYaT7IRpVBQC22AYa_9xbzuCois2EXQT7-RvZNofhz2TJpz0-Wlfrs870jAn3fyfove-6uF_I8cSe89jI-zmq8BQ2XQS1_hRZJN5587iNVG6pvY=w1920-h1080" title="postgres"&gt;&lt;img src="https://lh3.googleusercontent.com/vbqq3rLa3xH1e2c1snKm4u0hhkm4mYaT7IRpVBQC22AYa_9xbzuCois2EXQT7-RvZNofhz2TJpz0-Wlfrs870jAn3fyfove-6uF_I8cSe89jI-zmq8BQ2XQS1_hRZJN5587iNVG6pvY=w400" alt="postgres" title="postgres"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;通常在使用資料表時，都會在每一筆紀錄上面寫入當下時間，而這個時間會根據目前系統所在的時區而有所不同，當然我們都會使用 &lt;code&gt;UTC+0&lt;/code&gt; 作為標準時區，而欄位我們則會是使用 timestamp 或者是 unix time 格式，兩者最大的差異就是在前者 (timestamp) 會根據目前系統的時區來記錄，而後者 (unix time) 則是紀錄秒數差異 (Jan 01 1970) 而不會隨著系統時區改變而變化。如果是發展開源專案，則會使用後者居多，這樣不會因為使用者時區變化，而產生不同的差異，在 &lt;a href="https://gitea.io"&gt;Gitea 開源專案&lt;/a&gt;保留了兩者，但是只要計算時間則是用 (unix time) 作轉換。&lt;/p&gt;</description></item><item><title>在 Go 語言內的 URL RawQuery 的改變</title><link>https://blog.wu-boy.com/2018/08/escape-url-rawquery-on-parse-in-golang/</link><pubDate>Mon, 27 Aug 2018 06:00:56 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/08/escape-url-rawquery-on-parse-in-golang/</guid><description>&lt;p&gt;&lt;strong&gt;更新 (2018.08.29) 感謝中國網友幫忙發個 &lt;a href="https://github.com/golang/go/issues/27302"&gt;Issue&lt;/a&gt;，大家有空可以關注看看，等官方怎麼回應&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://golang.org/"&gt;Go 語言&lt;/a&gt;內的 &lt;code&gt;net/url&lt;/code&gt; 函式庫讓開發者可以簡單的 Parse 指定的 URL，最近 Google 上了這個 &lt;a href="https://github.com/golang/go/commit/1040626c0ce4a1bc2b312aa0866ffeb2ff53c1ab"&gt;Patch&lt;/a&gt;，這個 Patch 讓原本的 RawQuery 值產生了變化，原先沒有驗證 RawQuery 是否包含了不合法的字元，現在只要 RawQuesy 內含有任意的不合法字元，就會直接被 &lt;code&gt;QueryEscape&lt;/code&gt; 函式轉換，這個 Patch 不影響這次 &lt;a href="https://blog.golang.org/go1.11"&gt;Go 1.11 版本&lt;/a&gt;，會影響的是明年 2019 年釋出的 Go 1.12 版本，但是大家都知道在 &lt;a href="https://github.com"&gt;GitHub&lt;/a&gt; 上面有在寫測試的話，都會在 &lt;a href="https://travis-ci.org"&gt;Travis&lt;/a&gt; 內加入 &lt;code&gt;master&lt;/code&gt; 版本當作驗證，如果有用到 RawQuery 的話，肯定會遇到這問題，底下來描述為什麼會出現這問題。&lt;/p&gt;</description></item><item><title>用 Drone CI/CD 整合 Packer 自動產生 GCP 或 AWS 映像檔</title><link>https://blog.wu-boy.com/2018/07/drone-with-hashicorp-packer/</link><pubDate>Sun, 29 Jul 2018 10:57:21 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/07/drone-with-hashicorp-packer/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/43657047222/in/dateposted-public/" title="Screen Shot 2018-07-29 at 12.47.51 PM"&gt;&lt;img src="https://i1.wp.com/farm1.staticflickr.com/856/43657047222_387563a137_z.jpg?w=840&amp;#038;ssl=1" alt="Screen Shot 2018-07-29 at 12.47.51 PM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本篇來介紹 &lt;a href="https://www.hashicorp.com/"&gt;Hashicorp&lt;/a&gt; 旗下其中一個產品叫 &lt;a href="https://www.packer.io"&gt;Packer&lt;/a&gt;，其實在 Hashicorp 旗下有很多其他雲端工具都非常好用，如果大家有興趣都可以上&lt;a href="https://www.hashicorp.com/"&gt;官網&lt;/a&gt;參考看看。而 Packer 是用來產生各大雲平台映像檔的工具，平行產生 &lt;a href="https://aws.amazon.com/"&gt;AWS&lt;/a&gt;, &lt;a href="https://cloud.google.com/"&gt;GCP&lt;/a&gt;, &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 或 &lt;a href="https://www.digitalocean.com/"&gt;DigitalOcean&lt;/a&gt; &amp;hellip; 等等眾多雲平台之映像檔對 Packer 來說相當容易，詳細可以&lt;a href="https://www.packer.io/docs/builders/index.html"&gt;參考這邊&lt;/a&gt;，也就是說透過 Packer 來統一管理各大雲平台的映像檔，用 JSON 檔案進行版本控制。假設您有需求要管理工程團隊所使用的 Image，你絕對不能錯過 Packer。Packer 不是用來取代像是 &lt;a href="https://www.ansible.com/"&gt;Ansible&lt;/a&gt; 或是 &lt;a href="https://www.chef.io/chef/"&gt;Chef&lt;/a&gt; 等軟體，而是讓開發者更方便整合 Ansible .. 等第三方工具，快速安裝好系統環境。&lt;/p&gt;</description></item><item><title>用 Caddy 申請 Let’s Encrypt Wildcard 憑證</title><link>https://blog.wu-boy.com/2018/07/caddy-lets-encrypt-wildcard-certificate/</link><pubDate>Fri, 27 Jul 2018 03:33:34 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/07/caddy-lets-encrypt-wildcard-certificate/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/42761134805/in/dateposted-public/" title="Screen Shot 2018-07-27 at 11.29.44 AM"&gt;&lt;img src="https://i2.wp.com/farm1.staticflickr.com/846/42761134805_c4ab2e9168_z.jpg?w=840&amp;#038;ssl=1" alt="Screen Shot 2018-07-27 at 11.29.44 AM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2018 年 3 月 &lt;a href="https://letsencrypt.org/"&gt;Let&amp;rsquo;s Encrypt&lt;/a&gt; 官方正式公告&lt;a href="https://community.letsencrypt.org/t/acme-v2-production-environment-wildcards/55578"&gt;支援 Wildcard Certificate 憑證&lt;/a&gt;，有在玩多個 subdomain 有福了，未來只要申請一張 &lt;code&gt;*.example.com&lt;/code&gt; 就全部通用啦，當然很高興 &lt;a href="https://caddyserver.com/"&gt;Caddy&lt;/a&gt; 也跟進了，在 &lt;a href="https://caddyserver.com/blog/caddy-0_11-released"&gt;v11.0&lt;/a&gt; 正式支援多種 DNS Provider，只要申請 DNS 提供商的 API Key 或 Secret 設定在啟動 Caddy 步驟內就可以了。底下用 &lt;a href="https://tw.godaddy.com/"&gt;Godaddy&lt;/a&gt; 舉例。&lt;/p&gt;</description></item><item><title>Go 語言實戰 GraphQL</title><link>https://blog.wu-boy.com/2018/07/graphql-in-go/</link><pubDate>Thu, 19 Jul 2018 01:12:07 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/07/graphql-in-go/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/41690303080/in/dateposted-public/" title="Screen Shot 2018-07-19 at 8.58.48 AM"&gt;&lt;img src="https://i1.wp.com/farm2.staticflickr.com/1769/41690303080_3d1a278b8a_z.jpg?w=840&amp;#038;ssl=1" alt="Screen Shot 2018-07-19 at 8.58.48 AM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;很高興能在 &lt;a href="http://modernweb.tw/"&gt;2018 ModernWeb&lt;/a&gt; 研討會跟大家分享用 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;實戰 &lt;a href="https://graphql.org/"&gt;GraphQL&lt;/a&gt;，相信大家都知道 GraphQL 帶給前端後端及手機開發者很多好處，強烈推薦大家來嘗試看看。這場議程最主要是推廣 GraphQL 及 Go 語言。底下有投影片大家可以參考看看。&lt;/p&gt;</description></item><item><title>在本機端快速產生網站免費憑證</title><link>https://blog.wu-boy.com/2018/07/mkcert-zero-config-tool-to-make-locally-trusted-development-certificates/</link><pubDate>Fri, 06 Jul 2018 02:36:54 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/07/mkcert-zero-config-tool-to-make-locally-trusted-development-certificates/</guid><description>&lt;p&gt;&lt;a href="https://i1.wp.com/farm2.staticflickr.com/1785/43227213371_a041db0810_o.png?ssl=1"&gt;&lt;img src="https://i1.wp.com/farm2.staticflickr.com/1785/43227213371_a041db0810_o.png?w=840&amp;#038;ssl=1" alt="" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;大家看到網站免費憑證，一定會想到 &lt;a href="https://letsencrypt.org/"&gt;Let&amp;rsquo;s encrypt&lt;/a&gt; 服務商提供一個網域可以使用 100 個免費憑證，如果您有很多 subdomain 需求，還可以申請獨立一張 &lt;a href="https://community.letsencrypt.org/t/acme-v2-and-wildcard-certificate-support-is-live/55579"&gt;wildcard 憑證&lt;/a&gt;，但是這是在伺服器端的操作，假設在本機端開發，該如何快速產生憑證，這樣開啟瀏覽器時，就可以看到綠色的 https 字眼&lt;/p&gt;
&lt;p&gt;&lt;a href="https://i2.wp.com/farm1.staticflickr.com/921/43177490822_974612c015_z.jpg?ssl=1"&gt;&lt;img src="https://i2.wp.com/farm1.staticflickr.com/921/43177490822_974612c015_z.jpg?w=840&amp;#038;ssl=1" alt="" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>如何在 Go 語言內寫效能測試</title><link>https://blog.wu-boy.com/2018/06/how-to-write-benchmark-in-go/</link><pubDate>Tue, 26 Jun 2018 02:18:50 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/06/how-to-write-benchmark-in-go/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" title="golang logo"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt="golang logo" title="golang logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://golang.org/"&gt;Go 語言&lt;/a&gt;不只有內建基本的 &lt;a href="https://golang.org/pkg/testing/"&gt;Testing&lt;/a&gt; 功能，另外也內建了 &lt;a href="https://golang.org/pkg/testing/#hdr-Benchmarks"&gt;Benchmark&lt;/a&gt; 工具，讓開發者可以快速的驗證自己寫的程式碼效能如何？該如何使用基本的 Benchmark 工具，底下用簡單的例子來說明如何寫 Benchmark，透過內建工具可以知道程式碼單次執行多少時間，以及用了多少記憶體。不多說直接用『數字轉字串』來當例子。&lt;/p&gt;</description></item><item><title>Drone 搭配 Kubernetes 部署 Go 語言項目</title><link>https://blog.wu-boy.com/2018/06/drone-kubernetes-with-golang/</link><pubDate>Tue, 05 Jun 2018 02:36:11 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/06/drone-kubernetes-with-golang/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/27678088297/in/dateposted-public/" title="Screen Shot 2018-06-04 at 9.19.46 AM"&gt;&lt;img src="https://i1.wp.com/farm2.staticflickr.com/1738/27678088297_1c6fe64e86_z.jpg?w=840&amp;#038;ssl=1" alt="Screen Shot 2018-06-04 at 9.19.46 AM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在之前寫過一篇『&lt;a href="https://blog.wu-boy.com/2017/10/upgrade-kubernetes-container-using-drone/"&gt;Drone 搭配 Kubernetes 升級應用程式版本&lt;/a&gt;』，裡面內容最主要介紹 &lt;a href="https://github.com/honestbee"&gt;honestbee&lt;/a&gt; 撰寫的 &lt;a href="https://drone.io"&gt;drone&lt;/a&gt; 外掛: &lt;a href="https://github.com/honestbee/drone-kubernetes"&gt;drone-kubernetes&lt;/a&gt;，但是此外掛並非用 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;所撰寫，而是用 Shell Script 透過 &lt;code&gt;kubectl set image&lt;/code&gt; 方式來更新專案項目，但是這邊會有幾個缺點，第一點就是假設在 Develop 環境永遠都是吃 master 分支，也就是讀取 Image 的 &lt;code&gt;latest&lt;/code&gt; 標籤，這時候此外掛就無法作用，第二點此外掛無法讀取 kubernetes YAML 檔案，假設專案要修正一個 ENV 值，此外掛也無法及時更新。綜合這兩點因素，只好捨棄此外掛，而本篇會帶給大家另一個用 Go 語言所撰寫的外掛，是由 &lt;a href="https://github.com/Sh4d1"&gt;@Sh4d1&lt;/a&gt; 所開發的&lt;a href="https://github.com/Sh4d1/drone-kubernetes/"&gt;項目&lt;/a&gt;，用法相當容易，底下會一步一步教大家如何部署 Go 語言項目。&lt;/p&gt;</description></item><item><title>如何在 Go 專案內寫測試</title><link>https://blog.wu-boy.com/2018/05/how-to-write-testing-in-golang/</link><pubDate>Mon, 14 May 2018 03:19:28 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/05/how-to-write-testing-in-golang/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/24407557644/in/dateposted-public/" title="Go-brown-side.sh"&gt;&lt;img src="https://i1.wp.com/farm2.staticflickr.com/1622/24407557644_36087ca6de.jpg?w=840&amp;#038;ssl=1" alt="Go-brown-side.sh" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;相信大家都知道專案內不導入測試，未來越來越多功能，技術債就會越來越多，接手的人罵聲連連，而寫測試的簡單與否決定專案初期是否要先導入。為什麼專案要導入測試，導入測試有什麼好處，對於團隊而言，導入測試好處實在太多了，底下列了幾點是我個人覺得非常重要的。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;減少 Review 時間&lt;/li&gt;
&lt;li&gt;降低修改程式碼產生的的錯誤&lt;/li&gt;
&lt;li&gt;確保程式碼品質&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第一點非常實用，尤其在專案很忙的時候，同事間只有少許的時間可以幫忙看程式碼或討論，如果大家都有寫測試，在時間的壓力下，只要稍微看一下，CI/CD 驗證過無誤，大致上就可以上線了。第二點在於，團隊其他成員需要修改一個不確定的地方，商業邏輯修正可能會造成很大的錯誤，而測試在這時候就發揮效果。最後一點就是程式碼品質，不管是新功能，或者是 Bug，任何時間點都需要補上測試，就算 code coverage 已經很高了，但是只要有任何 bug 就要補測試，測試寫的越多，專案的品質相對會提高。在 Go 語言專案內該如何寫測試了，為什麼專案要導入 Go 語言的原因之一就是『寫測試太簡單』了，底下來介紹如何寫基本的測試。&lt;/p&gt;</description></item><item><title>Go 語言的 vendor 目錄</title><link>https://blog.wu-boy.com/2018/05/what-is-vendor-in-golang/</link><pubDate>Sat, 05 May 2018 07:25:02 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/05/what-is-vendor-in-golang/</guid><description>&lt;p&gt;&lt;img src="https://i1.wp.com/farm1.staticflickr.com/908/40093179410_53df4bb9e8_z.jpg" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;很多朋友剛入門 &lt;a href="https://golang.org"&gt;Go 語言時&lt;/a&gt;，第一個會遇到的問題是，該如何設定專案配置，讓專案可以正常執行，在個人電腦該如何開發多個專案，這邊就會遇到該如何設定 &lt;code&gt;$GOPATH&lt;/code&gt;，我在這邊跟大家講個觀念，開發環境只會有一個 &lt;code&gt;$GOPATH&lt;/code&gt;，不管團隊內有多少專案，都是存放在同一個 GOPATH，避免每次開專案都要重新設定 &lt;code&gt;$GOPATH&lt;/code&gt;，而專案內用到的相依性套件，請各自維護，透過&lt;a href="https://github.com/golang/go/wiki/PackageManagementTools"&gt;官方提供的 wiki&lt;/a&gt;，請選一套覺得好用的來使用吧，沒有最好的工具，找一套適合團隊是最重要的。&lt;/p&gt;</description></item><item><title>Go 語言的 init 函式</title><link>https://blog.wu-boy.com/2018/04/init-func-in-golang/</link><pubDate>Thu, 19 Apr 2018 03:17:00 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/04/init-func-in-golang/</guid><description>&lt;p&gt;&lt;img src="https://i1.wp.com/farm2.staticflickr.com/1622/24407557644_36087ca6de.jpg" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;本篇會帶大家認識 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;的 init 函式，在了解 init func 之前，大家應該都知道在同一個 Package 底下是不可以有重複的變數或者是函式名稱，但是唯獨 init() 可以在同一個 package 內宣告多次都沒問題。底下看&lt;a href="https://play.golang.org/p/AN-6MK4qVVL"&gt;例子&lt;/a&gt;，可以發現的是不管宣告多少次，都會依序從最初宣告到最後宣告依序執行下來。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-15"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-16"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-17"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;package&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;main&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;import&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008b45"&gt;init&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;fmt.&lt;span style="color:#008b45"&gt;Println&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;init 1&amp;#34;&lt;/span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008b45"&gt;init&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;fmt.&lt;span style="color:#008b45"&gt;Println&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;init 2&amp;#34;&lt;/span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008b45"&gt;main&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;fmt.&lt;span style="color:#008b45"&gt;Println&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;Hello, playground&amp;#34;&lt;/span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>[影片教學] 使用 Filter 將專案跑在特定 Drone Agent 服務</title><link>https://blog.wu-boy.com/2018/04/how-to-use-filter-in-drone/</link><pubDate>Sun, 15 Apr 2018 15:26:37 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/04/how-to-use-filter-in-drone/</guid><description>&lt;p&gt;&lt;img src="https://i1.wp.com/c1.staticflickr.com/5/4236/34957940160_435d83114f_z.jpg" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://drone.io"&gt;Drone&lt;/a&gt; 是一套用 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;撰寫的 CI/CD &lt;a href="https://github.com/drone/drone"&gt;開源專案&lt;/a&gt;，是由一個 Server 跟多個 Agent 所組成，Agent 上面必須安裝好 &lt;a href="https://www.docker.com"&gt;Dokcer&lt;/a&gt; 才可以順利測試及部署，但是團隊內會出現一個狀況，每個專案的測試及部署方式不同，有的測試需要 Agent 很多 CPU 或記憶體資源，有的小專案則不需要那麼多，但是當大專案把 agent 系統資源吃光，其他專案都跑不動了，這邊的解決方式就是再建立一台新的 Agent 服務，將需要大量資源的專案跑在該台新的 Agent，Drone 這邊有支援 &lt;code&gt;filter&lt;/code&gt; 功能，讓開發者可以指定專案要跑在哪一台 Agent 上。底下來教大家如何設定 drone filter。&lt;/p&gt;</description></item><item><title>如何使用 Go 語言 Flag 套件 (影片教學)</title><link>https://blog.wu-boy.com/2018/04/how-to-use-golang-flag-package/</link><pubDate>Thu, 12 Apr 2018 03:17:25 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/04/how-to-use-golang-flag-package/</guid><description>&lt;p&gt;&lt;img src="https://i1.wp.com/farm2.staticflickr.com/1622/24407557644_36087ca6de.jpg" alt="coever"&gt;&lt;/p&gt;
&lt;p&gt;之前寫過一篇『&lt;a href="https://blog.wu-boy.com/2017/02/write-command-line-in-golang/"&gt;用 Golang 寫 Command line 工具&lt;/a&gt;』教學，作者我錄了一個教學影片，教大家如何使用 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;的 &lt;a href="https://golang.org/pkg/flag/"&gt;Flag&lt;/a&gt; 套件，套件用法很簡單，相信看了底下的影片教學馬上就會了，但是在這邊強調，用 flag 的時機會是在寫 command line tool 給同事或者是自己用，如果是寫大型 Web Application，不推薦使用 flag，原因是 flag 不支援讀取系統環境變數，如果是 web 服務，想要動態改變 port 或者是 DB 連線資訊，就變得比較複雜，也無法搭配 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 使用，更不用說想結合 &lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt;。如果要寫大專案，請使用 &lt;a href="https://github.com/urfave/cli"&gt;urfave/cli&lt;/a&gt; 或 &lt;a href="https://github.com/spf13/cobra"&gt;spf13/cobra&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>Go 語言基礎實戰教學影片上線了</title><link>https://blog.wu-boy.com/2018/03/golang-introduction-video/</link><pubDate>Thu, 29 Mar 2018 01:45:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/03/golang-introduction-video/</guid><description>&lt;p&gt;&lt;img src="https://i2.wp.com/farm1.staticflickr.com/805/39050902230_b1d91bc120_z.jpg" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;去年在台灣推廣 &lt;a href="https://drone.io/"&gt;Drone&lt;/a&gt; 這套由 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;所撰寫的&lt;a href="https://github.com/drone/drone"&gt;開源專案&lt;/a&gt;，身為維護者之一，也將 Drone 跟 &lt;a href="https://github.com/go-gitea/gitea"&gt;Gitea&lt;/a&gt; 完成整合。如果對於從開發到部署整個流程，還不是很了解的朋友，我個人就是推薦使用 Drone，去年九月也推出 Drone 的教學影片系列:『&lt;a href="https://www.udemy.com/devops-oneday/?couponCode=DRONE-DEVOPS"&gt;一天學會自動化測試及部署&lt;/a&gt;』，在公司使用 Drone 到現在，不曾看到服務中斷，啟動速度也是毫秒等級。為什麼會這麼穩定及快速呢？當然要歸功於 Go 語言。而這次我個人針對 Go 語言，錄製了一份基礎教學『&lt;a href="https://www.udemy.com/golang-fight/?couponCode=GOLANG-INTRO"&gt;GO 語言基礎實戰&lt;/a&gt;』&lt;/p&gt;</description></item><item><title>Go 語言搭配 Docker Healthy Check 檢查</title><link>https://blog.wu-boy.com/2018/03/docker-healthcheck-in-golang/</link><pubDate>Mon, 19 Mar 2018 03:18:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/03/docker-healthcheck-in-golang/</guid><description>&lt;p&gt;&lt;img src="https://i2.wp.com/farm1.staticflickr.com/805/39050902230_b1d91bc120_z.jpg" alt="cover"&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;a href="https://www.docker.com"&gt;Docker&lt;/a&gt; 1.12 版本後，提供了 &lt;code&gt;HEALTHCHECK&lt;/code&gt; 指令，通過指定的一行命令來判斷容器內的服務是否正常運作。在此之前大部分都是透過判斷程式是否 Crash 來決定容器是否存活，但是這地方有點風險的是，假設服務並非 crash，而是沒辦法退出容器，造成無法接受新的請求，這就確保容器存活。現在呢我們可以透過在 &lt;code&gt;Dockerfile&lt;/code&gt; 內指定 &lt;code&gt;HEALTHCHECK&lt;/code&gt; 指令來確保服務是否正常。而用 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;開發的 Web 服務該如何來實現呢？&lt;/p&gt;</description></item><item><title>用 Nginx 來架設線上即時縮圖機</title><link>https://blog.wu-boy.com/2018/03/nginx-reverse-proxy-image-resizing/</link><pubDate>Sat, 17 Mar 2018 02:28:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/03/nginx-reverse-proxy-image-resizing/</guid><description>&lt;p&gt;&lt;a href="https://i0.wp.com/farm1.staticflickr.com/790/26946324088_93725a917b_z.jpg?ssl=1"&gt;&lt;img src="https://i0.wp.com/farm1.staticflickr.com/790/26946324088_93725a917b_z.jpg?w=840&amp;#038;ssl=1" alt="" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在更早以前我們怎麼實現縮圖機制，當使用者上傳一張檔案，後端會固定將圖片縮圖成各種前端網頁需要的大小，不管前端頁面是否有使用，後端都會先產生好，這有什麼缺陷？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;佔用硬碟空間大小&lt;/li&gt;
&lt;li&gt;前端又需要另外一種格式的縮圖?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第二個問題比較麻煩，當前端需要另一種縮圖格式，後端就要開始掃描系統的全部圖片，再重新產生一次。非常耗費後端系統效能。後來才改成透過 URL 定義長寬來決定即時縮圖，在 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;內可以選擇使用 &lt;a href="https://github.com/thoas/picfit"&gt;picfit&lt;/a&gt; 來當作後端即時的縮圖機。本篇則是要提供另一種解法，就是使用 &lt;a href="http://nginx.org"&gt;Nginx&lt;/a&gt; 搭配 &lt;a href="http://nginx.org/en/docs/http/ngx_http_image_filter_module.html"&gt;image_filter&lt;/a&gt; 外掛來達成即時縮圖機制。&lt;/p&gt;</description></item><item><title>Go 語言課程</title><link>https://blog.wu-boy.com/golang-online-course/</link><pubDate>Thu, 15 Mar 2018 01:29:58 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/golang-online-course/</guid><description>&lt;p&gt;&lt;img src="https://i0.wp.com/farm1.staticflickr.com/800/40815293371_85ca0b960f_z.jpg?w=840&amp;amp;" alt="logo"&gt;&lt;/p&gt;
&lt;h2 id="課程緣由"&gt;課程緣由&lt;/h2&gt;
&lt;p&gt;當初想開這課程的原因是，希望可以造福全台灣的朋友，之前跟 &lt;a href="http://learning.ithome.com.tw/course/JjojzNh9P1N9H"&gt;iThome 合作開了一堂實體課程&lt;/a&gt;，但是很多人卡在假日無法出門，再來是實體課程成本比較高，有時候上課沒聽懂，回家也沒有老師可以討論，造成學習效果不是很好，所以我就來錄製線上課程，讓不能北上的朋友們也可以跨入 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;的開發，體會 Go 語言帶給團隊帶來的好處及優勢。希望能透過線上課程可以跟學員有些互動，把 Go 語言 推廣到各大公司及新創。如果您還正在挑選一個高可靠及高流量的後端語言，那 Go 語言肯定不會讓您失望。&lt;/p&gt;
&lt;h2 id="課程簡介"&gt;課程簡介&lt;/h2&gt;
&lt;p&gt;Go 語言 (又稱 Golang) 是 Google 推出新一代的強大語言，2018 年 1 月 Google 公佈了去年底統計的&lt;a href="https://blog.golang.org/survey2017-results"&gt;問卷結果&lt;/a&gt;，發現 61% 用 Go 來寫網站，37% 用來開發系統程式，36% 用來做 DevOps (多重選擇)，可想而知 Go 語言可以拿來從底層寫到上層。高效能的 Goroutine (併發) 表現優於 Parallelism (並行)，語法上簡潔又簡單，這也就是為什麼我們要來嘗試 Go 語言。&lt;/p&gt;
&lt;h2 id="您會學到"&gt;您會學到&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;如何將 Go 導入團隊及說服主管使用&lt;/li&gt;
&lt;li&gt;如何寫跨平台 Command Line 工具&lt;/li&gt;
&lt;li&gt;如何善用 Go 語言特性加快部署速度&lt;/li&gt;
&lt;li&gt;如何有效率的撰寫 Go 語言&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="課程大綱"&gt;課程大綱&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Go 背景介紹&lt;/li&gt;
&lt;li&gt;Go 環境建置&lt;/li&gt;
&lt;li&gt;Go 基本語法&lt;/li&gt;
&lt;li&gt;Go Goroutines 介紹&lt;/li&gt;
&lt;li&gt;Go Channel 介紹&lt;/li&gt;
&lt;li&gt;Go 簡易 HTTP 伺服器&lt;/li&gt;
&lt;li&gt;Go 簡易 Command Line 實作&lt;/li&gt;
&lt;li&gt;Go 跨平台編譯 (Windows, MacOS, Linux)&lt;/li&gt;
&lt;li&gt;Go 搭配 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 介紹&lt;/li&gt;
&lt;li&gt;Go 語言開發實戰案例&lt;/li&gt;
&lt;li&gt;Go 語言專案搭配 Drone 持續整合測試部署&lt;/li&gt;
&lt;li&gt;Go 語言搭配 Kubernetes&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="講師資訊"&gt;講師資訊&lt;/h2&gt;
&lt;p&gt;Appleboy (吳柏毅) 目前服務於聯發科技，擔任後端工程師。長期貢獻於&lt;a href="https://github.com/appleboy"&gt;開源專案&lt;/a&gt;，熱愛開發程式。&lt;/p&gt;</description></item><item><title>用 Go 語言實現單一或多重 Queue 搭配 optimistic concurrency</title><link>https://blog.wu-boy.com/2018/03/simple-queue-with-optimistic-concurrency-in-go/</link><pubDate>Sat, 10 Mar 2018 08:26:38 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/03/simple-queue-with-optimistic-concurrency-in-go/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/25850362427/in/dateposted-public/" title="Screen Shot 2018-03-10 at 3.22.59 PM"&gt;&lt;img src="https://i2.wp.com/farm5.staticflickr.com/4781/25850362427_fb8199a5ee_z.jpg?w=840&amp;#038;ssl=1" alt="Screen Shot 2018-03-10 at 3.22.59 PM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本篇教學會著重在如何使用 Go 語言的 &lt;a href="https://gobyexample.com/goroutines"&gt;goroutine&lt;/a&gt; 及 &lt;a href="https://gobyexample.com/channels"&gt;channel&lt;/a&gt;。&lt;a href="https://www.mongodb.com/"&gt;MongoDB&lt;/a&gt; 是一套具有高效能讀寫的 NoSQL 資料庫，但是不像傳統關連式資料庫，有非常好用的 Transaction 交易模式，而在 MongoDB 也可以透過 &lt;a href="https://docs.mongodb.com/manual/tutorial/perform-two-phase-commits/"&gt;Two Phase Commits&lt;/a&gt; 來達成交易功能，大家可以先打開文件看看，非常冗長，工程師需要花很多時間閱讀文件並且實現出來。而在 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;內，我們可以在 Single Thread 內同一時間點讀寫存取同一筆資料庫來解決此問題。此篇作法只適合運作在單一 application，如果是執行多個 application 則需要透過其他方式來解決，像是 &lt;a href="https://en.wikipedia.org/wiki/Optimistic_concurrency_control"&gt;Optimistic concurrency control&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>將 Go Html Template 存入 String 變數</title><link>https://blog.wu-boy.com/2018/02/simply-output-go-html-template-execution-to-strings/</link><pubDate>Wed, 28 Feb 2018 01:12:52 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/02/simply-output-go-html-template-execution-to-strings/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;a href="https://golang.org/"&gt;Go 語言&lt;/a&gt;內通常都將 &lt;a href="https://golang.org/pkg/text/template/"&gt;Html Temaple&lt;/a&gt; 寫入到 &lt;code&gt;io.Writer interface&lt;/code&gt; 像是 &lt;code&gt;*http.ResponseWriter&lt;/code&gt;，但是有些情境需要將 Template 寫入到 String 變數內，例如實作簡訊 Template，這時候需要將 Html Temaple 轉成 String。該如何實作，非常簡單，只需要在任意變數內實作 &lt;code&gt;io.Writer interface&lt;/code&gt; 即可，而 String 該如何轉換呢？可以使用 buffer&amp;rsquo;s pointer&lt;/p&gt;</description></item><item><title>自動化更新 AWS Lambda 函數</title><link>https://blog.wu-boy.com/2018/01/update-aws-lambda-using-drone-lambda-tool/</link><pubDate>Thu, 25 Jan 2018 02:20:11 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/01/update-aws-lambda-using-drone-lambda-tool/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/38984480815/in/dateposted-public/" title="Snip20180125_1"&gt;&lt;img src="https://i1.wp.com/farm5.staticflickr.com/4745/38984480815_c8284784d4_z.jpg?w=840&amp;#038;ssl=1" alt="Snip20180125_1" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;昨天介紹了『&lt;a href="https://blog.wu-boy.com/2018/01/write-golang-in-aws-lambda/"&gt;在 AWS Lambda 上寫 Go 語言&lt;/a&gt;』，無服務器的時代已經來臨，透過昨天的教學，開發者可以很快的用 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;寫簡易的 &lt;a href="https://ithelp.ithome.com.tw/articles/10157431"&gt;Restful API&lt;/a&gt; 或 &lt;a href="http://graphql.org/learn/"&gt;GraphQL&lt;/a&gt; 服務，直接無痛丟到 &lt;a href="https://aws.amazon.com/tw/lambda/"&gt;AWS Lambda&lt;/a&gt;，然而寫完編譯打包上傳整個流程，是非常枯燥乏味的，如何有效地透過自動化工具像是 &lt;a href="https://jenkins.io"&gt;Jenkins&lt;/a&gt; 或 &lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; 來達到自動化上傳，減少工程師花時間手動上傳，省下的時間，可以讓工程師多寫個幾行程式碼呢。&lt;/p&gt;</description></item><item><title>在 AWS Lambda 上寫 Go 語言搭配 API Gateway</title><link>https://blog.wu-boy.com/2018/01/write-golang-in-aws-lambda/</link><pubDate>Wed, 24 Jan 2018 02:43:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/01/write-golang-in-aws-lambda/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/39154963694/in/dateposted-public/" title="Snip20180124_2"&gt;&lt;img src="https://i2.wp.com/farm5.staticflickr.com/4655/39154963694_d53bc2a73e_z.jpg?w=840&amp;#038;ssl=1" alt="Snip20180124_2" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;這應該不是什麼新消息了，就是 &lt;a href="https://aws.amazon.com/lambda/"&gt;AWS Lambda&lt;/a&gt; 正式&lt;a href="https://aws.amazon.com/blogs/compute/announcing-go-support-for-aws-lambda/"&gt;支援 Go 語言&lt;/a&gt;，也就是可以將 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;編譯出來的二進制檔案直接放進去 Lambda Function 內，前面可以搭配 &lt;a href="https://aws.amazon.com/api-gateway/"&gt;API Gateway&lt;/a&gt;，後面可以搭配 &lt;a href="https://aws.amazon.com/cloudwatch/"&gt;CloudWatch&lt;/a&gt; 或 &lt;a href="https://aws.amazon.com/s3/"&gt;S3&lt;/a&gt;，本文章會教大家如何將 &lt;a href="https://github.com/gin-gonic/gin"&gt;Gin&lt;/a&gt; 打包編譯進 Lambda，官網其實也有提供 &lt;a href="https://github.com/aws/aws-lambda-go"&gt;Library 或範例&lt;/a&gt;方便大家實作，大家可以參考看看。&lt;/p&gt;</description></item><item><title>Drone CI/CD 系統簡介</title><link>https://blog.wu-boy.com/2018/01/introduction-to-drone-cicd/</link><pubDate>Thu, 18 Jan 2018 02:27:31 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/01/introduction-to-drone-cicd/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/38854798135/in/dateposted-public/" title="Screen Shot 2018-01-18 at 10.21.43 AM"&gt;&lt;img src="https://i1.wp.com/farm5.staticflickr.com/4660/38854798135_a4ed025e7f_z.jpg?w=840&amp;#038;ssl=1" alt="Screen Shot 2018-01-18 at 10.21.43 AM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;很高興到 &lt;a href="https://www.facebook.com/groups/GCPUG.TW/"&gt;GCPUG.TW&lt;/a&gt; 分享『Drone CI/CD 系統簡介』，會議介紹了 &lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; 系統架構，這套是由 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;所開發，前兩年我參加了 Drone 開源專案的開發，也貢獻了數個 &lt;a href="http://plugins.drone.io/"&gt;Drone Plugin&lt;/a&gt;，去年我正式開始宣傳 Drone 的好處及優勢，以及為什麼要從 &lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt; 或 &lt;a href="https://jenkins.io/"&gt;GitLab CI&lt;/a&gt; 轉換到 Drone，會議大綱如下，很感謝 &lt;a href="https://www.qnap.com/zh-tw/"&gt;QNAP&lt;/a&gt; 提供現場直播及錄影。&lt;/p&gt;</description></item><item><title>DigitalOcean 2018 年調整價格</title><link>https://blog.wu-boy.com/2018/01/digitalocean-new-price-in-2018/</link><pubDate>Wed, 17 Jan 2018 01:27:39 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/01/digitalocean-new-price-in-2018/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/38835654765/in/dateposted-public/" title="DO_Logo_Vertical_Blue-6321464d"&gt;&lt;img src="https://i1.wp.com/farm5.staticflickr.com/4764/38835654765_dd7b4dcdc0_o.png?w=840&amp;#038;ssl=1" alt="DO_Logo_Vertical_Blue-6321464d" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;很高興看到 &lt;a href="https://digitalocean.com/"&gt;DigitalOcean&lt;/a&gt; 在 2018 年推出新的 &lt;a href="https://blog.digitalocean.com/new-droplet-plans/"&gt;VPS 價錢方案&lt;/a&gt;，可以從下面這張圖看出來，記憶體幾乎都調整為兩倍方案，這已經完全追上 &lt;a href="https://linode.com"&gt;Linode&lt;/a&gt; 現在的價格了，另外 DigitalOcean 還額外推出每個月 $15 美金方案，還可以動態選擇要高 CPU (1~3) 還是高記憶體 (1G ~ 3G) 由玩家自由搭配，這方案真的是太棒了。&lt;/p&gt;</description></item><item><title>Caddy 搭配 Harbor 自架私有 Docker Registry</title><link>https://blog.wu-boy.com/2018/01/caddy-harbor-docker-registry/</link><pubDate>Thu, 04 Jan 2018 07:20:27 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2018/01/caddy-harbor-docker-registry/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/25660808075/in/dateposted-public/" title="docker"&gt;&lt;img src="https://i2.wp.com/farm2.staticflickr.com/1600/25660808075_c8190290f7_z.jpg?w=840&amp;#038;ssl=1" alt="docker" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://vmware.github.io/harbor/"&gt;Harbor&lt;/a&gt; 是由 &lt;a href="https://www.vmware.com"&gt;VMWare&lt;/a&gt; 公司用 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;所開發的開源軟體，它可以讓團隊存放各種不同的私有 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 映像檔，假如團隊內沒考慮 &lt;a href="https://aws.amazon.com/tw/ecr/"&gt;AWS 的 ECR&lt;/a&gt; 或者是 Google 提供的 &lt;a href="https://cloud.google.com/container-registry/"&gt;GCR 方案&lt;/a&gt;，建議您可以參考看看 Harbor，而 Harbor 提供了簡易的 UI 介面，包含權限控管，及跨區域的自動同步功能，比起自己從官網把 &lt;a href="https://docs.docker.com/registry/#what-it-is"&gt;Docker Registry&lt;/a&gt; 架起來，功能多上不少。本篇不會教大家如何架設 Harbor，有興趣的可以直接參考&lt;a href="https://github.com/vmware/harbor/blob/master/docs/user_guide.md"&gt;官方文件&lt;/a&gt;，此篇會紀錄如何透過 Caddy 將憑證用在 Harbor 內部。&lt;/p&gt;</description></item><item><title>在本機端導入 Drone CLI 做專案測試</title><link>https://blog.wu-boy.com/2017/12/drone-cli-local-testing/</link><pubDate>Sun, 24 Dec 2017 03:16:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/12/drone-cli-local-testing/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/34957940160/in/dateposted-public/" title="drone-logo_512"&gt;&lt;img src="https://i1.wp.com/c1.staticflickr.com/5/4236/34957940160_435d83114f_z.jpg?w=840&amp;#038;ssl=1" alt="drone-logo_512" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; 是一套用 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;所撰寫的 CI/CD 開源專案，透過 &lt;code&gt;.drone.yml&lt;/code&gt; 檔案方式讓開發者可以自行撰寫測試及部署流程。大家一定會認為要先架設好 Drone 伺服器，才能透過 Git Push 方式來達到自動化測試及部署專案。現在跟大家介紹，如果你的團隊尚未架設 Drone 服務，但是又想要使用 Drone 透過 Yaml 方式所帶來的好處，很簡單，你只需要透過 Drone CLI 工具就可以完成，不需要架設任何一台 Drone 服務，只要學會 Yaml 方式如何撰寫，就可以透過 &lt;code&gt;drone exec&lt;/code&gt; 指令來完成。好處是寫完 .drone.yml 檔案，未來圖隊如果正式架設了 Drone 服務，就可以無痛升級，沒有的話，也可以透過 CLI 工具在公司專案內單獨使用，這比寫 docker-compose.yml 方式還要快很多。本篇會介紹使用 &lt;code&gt;drone exec&lt;/code&gt; 的小技巧。&lt;/p&gt;</description></item><item><title>GitHub Flow 及 Git Flow 流程使用時機</title><link>https://blog.wu-boy.com/2017/12/github-flow-vs-git-flow/</link><pubDate>Tue, 19 Dec 2017 03:48:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/12/github-flow-vs-git-flow/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/39143290882/in/dateposted-public/" title="Screen Shot 2017-12-20 at 11.45.04 AM"&gt;&lt;img src="https://i2.wp.com/farm5.staticflickr.com/4726/39143290882_877ebfcf8e_z.jpg?w=840&amp;#038;ssl=1" alt="Screen Shot 2017-12-20 at 11.45.04 AM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2022.03.26 Updated&lt;/strong&gt;: 現在主流分支名稱為 &lt;code&gt;main&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在 Facebook 上面看到這篇『&lt;a href="http://blog.hellojcc.tw/2017/12/14/the-flaw-of-git-flow/"&gt;git flow 實戰經驗談&lt;/a&gt;』，想說來寫一下對於團隊內該導入 &lt;a href="https://guides.github.com/introduction/flow/"&gt;GitHub Flow&lt;/a&gt; 還是 &lt;a href="http://nvie.com/posts/a-successful-git-branching-model/"&gt;Git Flow&lt;/a&gt;，寫下自己的想法給大家參考看看。當你加入團隊，第一件事情就是嘗試了解目前團隊是走哪一種 Git 流程，但是在團隊內可能使用 &lt;a href="https://guides.github.com/introduction/flow/"&gt;GitHub 流程&lt;/a&gt;或者是傳統 &lt;a href="http://nvie.com/posts/a-successful-git-branching-model/"&gt;Git 流程&lt;/a&gt;，在開始進入開發流程時，請務必先了解團隊整個 Release 流程。後者流程在筆者幾年前有發表一篇『&lt;a href="https://blog.wu-boy.com/2011/03/git-%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6-branch-model-%E5%88%86%E6%94%AF%E6%A8%A1%E7%B5%84%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%B4%B9/"&gt;branch model 分支模組基本介紹&lt;/a&gt;』，如果大家有興趣可以先看看，而我自己在團隊內使用這兩種流程，嘗試過幾個團隊，得到底下結論:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;公司內部請使用 &lt;a href="https://guides.github.com/introduction/flow/"&gt;GitHub 流程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;開源專案請使用 &lt;a href="https://guides.github.com/introduction/flow/"&gt;GitHub 流程&lt;/a&gt; + &lt;a href="http://nvie.com/posts/a-successful-git-branching-model/"&gt;Git 流程&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;底下來探討為什麼我會有這些想法。首先先來看看公司團隊內部如果是走 Git 流程會有哪些缺陷。&lt;/p&gt;</description></item><item><title>用 Go 語言減少 node_modules 容量來加速部署</title><link>https://blog.wu-boy.com/2017/11/downsize-node-modules-with-golang/</link><pubDate>Tue, 21 Nov 2017 02:40:50 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/11/downsize-node-modules-with-golang/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;之前寫過一篇『&lt;a href="https://blog.wu-boy.com/2017/06/downsize-node_modules-to-improve-deploy-speed/"&gt;減少 node_modules 大小來加速部署 Node.js 專案&lt;/a&gt;』文章，透過 &lt;a href="https://yarnpkg.com/en/"&gt;Yarn&lt;/a&gt; 指令可以移除不必要的模組，剩下的模組佔據整個專案大部分容量，那該如何針對留下的模組來瘦身呢？這週看到 &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt; 大神 &lt;a href="https://github.com/tj"&gt;TJ&lt;/a&gt; 又發了一個 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;專案叫做 &lt;a href="https://github.com/tj/node-prune"&gt;node-prune&lt;/a&gt;，此專案用來移除在 &lt;code&gt;node_modules&lt;/code&gt; 內不必要的檔案，那哪些才是不必要的檔案呢？&lt;/p&gt;</description></item><item><title>Drone Secret 安全性管理</title><link>https://blog.wu-boy.com/2017/11/drone-secret-security/</link><pubDate>Mon, 20 Nov 2017 01:34:14 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/11/drone-secret-security/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/34957940160/in/dateposted-public/" title="drone-logo_512"&gt;&lt;img src="https://i1.wp.com/c1.staticflickr.com/5/4236/34957940160_435d83114f_z.jpg?w=840&amp;#038;ssl=1" alt="drone-logo_512" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; 是一套以 &lt;a href="https://www.docker.com/what-container"&gt;Docker 容器&lt;/a&gt;技術為主的 &lt;a href="https://www.docker.com/use-cases/cicd"&gt;CI/CD&lt;/a&gt; 開源專案，來聊聊 Drone 如何管理專案內的 Secret 資料，首先先來定義什麼是 Secret，舉個簡單例子，Drone 可以輕易完成基本打包+上傳到遠端伺服器，過程中一定會需要用到兩個 Plugin，就是 &lt;a href="https://github.com/appleboy/drone-scp"&gt;drone-scp&lt;/a&gt; 及 &lt;a href="https://github.com/appleboy/drone-ssh"&gt;drone-ssh&lt;/a&gt;，而使用這兩個 plugin 需要有一組 Password 或是一把金鑰 (Public Key Authentication)，在 Drone 可以透過後台 UI 介面將密碼或者是金鑰內容儲存在 Secret 設定頁面。預覽圖如下:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/24659201508/in/dateposted-public/" title="Screen Shot 2017-11-20 at 9.10.10 AM"&gt;&lt;img src="https://i1.wp.com/farm5.staticflickr.com/4561/24659201508_1517253288_z.jpg?w=840&amp;#038;ssl=1" alt="Screen Shot 2017-11-20 at 9.10.10 AM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>從 Nginx 換到 Caddy</title><link>https://blog.wu-boy.com/2017/11/migrate-nginx-to-caddy/</link><pubDate>Sat, 18 Nov 2017 04:23:25 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/11/migrate-nginx-to-caddy/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/32758934825/in/dateposted-public/" title="The_Caddy_web_server_logo.svg"&gt;&lt;img src="https://i1.wp.com/farm1.staticflickr.com/528/32758934825_665c449ff3_z.jpg?w=840&amp;#038;ssl=1" alt="The_Caddy_web_server_logo.svg" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;終於下定決心將 &lt;a href="https://nginx.org/en/"&gt;Nginx&lt;/a&gt; 換到 &lt;a href="https://caddyserver.com/"&gt;Caddy&lt;/a&gt; 這套用 &lt;a href="https://golang.org"&gt;Go&lt;/a&gt; 語言所撰寫的開源套件，大家一定會有所疑問『為什麼要換掉 Nginx 而改用 Caddy』，原因其實很簡單，你現在看的 Blog 安裝在 &lt;a href="https://www.linode.com/"&gt;Linode&lt;/a&gt; 機器上面，之前跑的是 Nginx 搭配 &lt;a href="https://letsencrypt.org/"&gt;letsencrypt&lt;/a&gt;，但是必須要寫一個 Scripts 來自動更新 letsencrypt 憑證，這機制最後不太運作，加上這一年來，每三個月就會有人丟我說『你的 Blog 憑證過期了』，所以就在這時間點，花點時間把 Nginx 設定調整到 Caddy，轉換的時間不會花超過一小時喔。&lt;/p&gt;</description></item><item><title>DevOps 課程</title><link>https://blog.wu-boy.com/drone-devops/</link><pubDate>Thu, 16 Nov 2017 02:07:36 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/drone-devops/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/2P2MVNK.png" alt="cover"&gt;&lt;/p&gt;
&lt;h2 id="課程緣由"&gt;課程緣由&lt;/h2&gt;
&lt;p&gt;當初想開這課程的原因是，希望可以造福全台灣的朋友，之前跟 &lt;a href="http://learning.ithome.com.tw/course/9cT5RF2vOMMrCfx"&gt;iThome 合作開了一堂實體課程&lt;/a&gt;，但是很多人卡在假日無法出門，再來是實體課程成本比較高，有時候上課沒聽懂，回家也沒有老師可以討論，造成學習效果不是很好，所以我就來錄製線上課程，讓不能北上的朋友們也可以學習到基本的 DevOps 技巧。希望能透過線上課程可以跟學員有些互動，把 DevOps 推廣到各大公司及新創。如果正要創業，或是在 DevOps 上有些困擾，不知道該如何導入及選擇工具，都可以來跟我聊聊。團隊內原本使用 &lt;a href="https://www.atlassian.com/software/bamboo"&gt;Bamboo&lt;/a&gt; 之後跳到 &lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt; 最後又跳到 &lt;a href="https://drone.io/"&gt;Drone&lt;/a&gt;，本課程會介紹為什麼我們放棄 Bamboo 及 Jenkins，它們所帶來的缺陷，以及為什麼最後選擇 Drone。&lt;/p&gt;
&lt;h2 id="課程簡介"&gt;課程簡介&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; 是一套以 Docker 容器為基礎的 CI/CD 伺服器。每次執行編譯時，都是運作在 Docker 容器內，可以確保開發者都在獨立環境執行，避免每次編譯狀況都不同。傳統企業在導入 DevOps 流程都會以 Jenkins 或者是 Gitlab CI 為主流，前者是 Java 語言開發，後者是 Ruby 語言開發，維運人員會發現這兩套其實都蠻吃重系統資源，然而 Drone 是一套由 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;開發的伺服器，啟動 Drone 時，只需要不到 20 MB 的記憶體就可以跑此服務，大幅降低維運成本，也讓維運人員更好維護伺服器。Drone 的出現就是為了讓團隊可以像 &lt;a href="https://github.com/blog/1241-deploying-at-github#always-be-shipping"&gt;Github 一樣持續開發持續部署&lt;/a&gt;，另外開發者可以輕易的用自己喜歡的語言(像是 Node.js, Python 甚至 Bash Script)撰寫 Plugin 整合進 Drone，取代傳統的 Jenkins 思維。 本課程您會學到:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如何製作 Docker 映像檔並且自動上傳到 Docker Hub&lt;/li&gt;
&lt;li&gt;如何將 Drone 導入團隊取代傳統 Jenkins 服務&lt;/li&gt;
&lt;li&gt;如何用其他語言撰寫 Plugin 整合進 Drone 服務&lt;/li&gt;
&lt;li&gt;如何用 Drone 整合團隊部署測試流程 (如下圖)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://c1.staticflickr.com/5/4185/34309691871_65d36545a5_c.jpg" alt="git flow"&gt;&lt;/p&gt;</description></item><item><title>Go 語言實現 gRPC Health 驗證</title><link>https://blog.wu-boy.com/2017/11/grpc-health-check-in-go/</link><pubDate>Tue, 14 Nov 2017 05:57:10 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/11/grpc-health-check-in-go/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/26629370309/in/dateposted-public/" title="grpc_square_reverse_4x"&gt;&lt;img src="https://i1.wp.com/farm5.staticflickr.com/4555/26629370309_b2fa3b59df_z.jpg?w=840&amp;#038;ssl=1" alt="grpc_square_reverse_4x" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本篇教大家如何每隔一段時間驗證 &lt;a href="https://grpc.io/"&gt;gRPC&lt;/a&gt; 服務是否存活，如果想了解什麼是 gRPC 可以參考 這篇『&lt;a href="https://yami.io/grpc/"&gt;REST 的另一個選擇：gRPC&lt;/a&gt;』，這邊就不多介紹 gRPC 了，未來將會是容器的時代， 那該如何檢查容器 Container 是否存活。如果是用 Kubernetes 呢？該如何來撰寫 gRPC 接口搭配 &lt;code&gt;livenessProbe&lt;/code&gt; 設定。底下是在 &lt;a href="https://docs.docker.com/engine/reference/builder/"&gt;Dockerfile&lt;/a&gt; 內可以設定 &lt;code&gt;HEALTHCHECK&lt;/code&gt; 來 達到檢查容器是否存活。詳細說明可以參考此&lt;a href="https://docs.docker.com/engine/reference/builder/#healthcheck"&gt;連結&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>Gorush 輕量級手機訊息發送服務</title><link>https://blog.wu-boy.com/2017/11/gorush-a-push-notification-server-written-in-go/</link><pubDate>Wed, 01 Nov 2017 02:03:29 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/11/gorush-a-push-notification-server-written-in-go/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今年第一次參加濁水溪以南最大研討會 &lt;a href="https://mopcon.org/2017/"&gt;Mopcon&lt;/a&gt;，給了一場議程叫『&lt;a href="https://www.slideshare.net/appleboy/gorush-a-push-notification-server-written-in-go"&gt;用 Go 語言打造輕量級 Push Notification 服務&lt;/a&gt;』，身為南部人一定要參加 Mopcon，剛好透過此議程順便發佈新版 &lt;a href="https://github.com/appleboy/gorush"&gt;Gorush&lt;/a&gt;，其實今年投稿 Mopcon 最主要是回家鄉宣傳 &lt;a href="https://www.google.com"&gt;Google&lt;/a&gt; 所推出的 &lt;a href="https://golang.org/"&gt;Go&lt;/a&gt; 語言，藉由實際案例來跟大家分享如何入門 Go 語言，以及用 Go 語言最大好的好處有哪些。底下是此議程大綱:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;為什麼建立 &lt;a href="https://github.com/appleboy/gorush"&gt;Gorush&lt;/a&gt; 專案&lt;/li&gt;
&lt;li&gt;如何用 Go 語言實作&lt;/li&gt;
&lt;li&gt;用 &lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; 自動化測試及部署&lt;/li&gt;
&lt;li&gt;在 &lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt; 上跑 Gorush&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>在 Go 語言使用 Viper 管理設定檔</title><link>https://blog.wu-boy.com/2017/10/go-configuration-with-viper/</link><pubDate>Mon, 23 Oct 2017 06:54:53 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/10/go-configuration-with-viper/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在每個語言內一定都會有管理設定檔的相關套件，像是在 &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt; 的 &lt;a href="https://github.com/motdotla/dotenv"&gt;dotenv&lt;/a&gt; 套件，而在 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;內呢？相信大家一定都會推 &lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt; 作者寫的 &lt;a href="https://github.com/spf13/viper"&gt;Viper&lt;/a&gt;，Viper 可以支援讀取 JSON, TOML, YAML, HCL 等格式的設定檔案，也可以讀取環境變數，另外也可以直接跟取遠端設定檔整合(像是 &lt;a href="https://github.com/coreos/etcd"&gt;etcd&lt;/a&gt; 或 &lt;a href="https://www.consul.io"&gt;Consul&lt;/a&gt;)，本篇會介紹如何使用 Viper。&lt;/p&gt;</description></item><item><title>Drone 搭配 Kubernetes 升級應用程式版本</title><link>https://blog.wu-boy.com/2017/10/upgrade-kubernetes-container-using-drone/</link><pubDate>Tue, 10 Oct 2017 16:02:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/10/upgrade-kubernetes-container-using-drone/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/36944908123/in/dateposted-public/" title="Screen Shot 2017-10-10 at 9.22.48 PM"&gt;&lt;img src="https://i0.wp.com/farm5.staticflickr.com/4481/36944908123_68ecdb8139_z.jpg?w=840&amp;#038;ssl=1" alt="Screen Shot 2017-10-10 at 9.22.48 PM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本篇要教大家如何透過 &lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; 搭配 &lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt; 自動化升級 App container 版本。為什麼我只說升級 App 版本，而不是升級或調整 K8S Deployment 架構呢 (&lt;code&gt;kubectl apply&lt;/code&gt;)？原因是本篇會圍繞在 &lt;a href="https://github.com/honestbee"&gt;honestbee&lt;/a&gt; 撰寫的 drone 外掛: &lt;a href="https://github.com/honestbee/drone-kubernetes"&gt;drone-kubernetes&lt;/a&gt;，此外掛是透過 Shell Script 方式搭配 &lt;a href="https://kubernetes.io/docs/user-guide/kubectl-overview/"&gt;kubectl&lt;/a&gt; 指令來完成升級 App 版本，可以看到程式原始碼並無用到 &lt;code&gt;kubectl apply&lt;/code&gt; 方式來升級，也並非用 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;搭配 k8s API 所撰寫，所以無法使用 &lt;a href="https://en.wikipedia.org/wiki/YAML"&gt;YAML&lt;/a&gt; 方式來進行 Deployment 的升級。本篇講解的範例都可以在 &lt;a href="https://github.com/go-training/drone-nodejs-example"&gt;drone-nodejs-example&lt;/a&gt; 內找到。底下指令就是外掛用來搭配 Drone 參數所使用。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl &lt;span style="color:#658b00"&gt;set&lt;/span&gt; image &lt;span style="color:#cd5555"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; deployment/nginx-deployment &lt;span style="color:#cd5555"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b"&gt;nginx&lt;/span&gt;=nginx:1.9.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>用 Kubernetes 將 Drone CI/CD 架設在 AWS</title><link>https://blog.wu-boy.com/2017/09/drone-on-kubernetes-on-aws/</link><pubDate>Sat, 23 Sep 2017 16:55:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/09/drone-on-kubernetes-on-aws/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/37237823752/in/dateposted-public/" title="Screen Shot 2017-09-24 at 12.53.39 AM"&gt;&lt;img src="https://i0.wp.com/farm5.staticflickr.com/4497/37237823752_68a508e4bb_z.jpg?w=840&amp;#038;ssl=1" alt="Screen Shot 2017-09-24 at 12.53.39 AM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; 是我今年主推的 CI/CD 自架服務，詳細可以參考&lt;a href="https://blog.wu-boy.com/2017/09/why-i-choose-drone-as-ci-cd-tool/"&gt;這篇文章&lt;/a&gt;，目前在公司內部團隊使用了一年以上，服務相當穩定。Drone 本身可以透過 &lt;a href="https://github.com/go-training/drone-tutorial"&gt;docker-compose 方式&lt;/a&gt;快速在機器上架設完成，但是由於 &lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt; 的盛行，大家也希望能透過 Kubernetes 來安裝 Drone 服務。本篇會教大家如何在 AWS 上透過 Kubernetes 安裝完成。Drone 預設使用 &lt;a href="https://www.sqlite.org/"&gt;SQLite&lt;/a&gt; 當作資料庫，檔案會直接存放在 &lt;code&gt;/var/lib/drone&lt;/code&gt; 路徑底下，但是容器內不支援寫入，所以必須要要額外掛上空間讓 Drone 可以寫入資料。此篇會以 &lt;a href="https://github.com"&gt;GitHub&lt;/a&gt; 認證 + SQLite 來教學。&lt;/p&gt;</description></item><item><title>部署 Go 語言 App 到 Now.sh</title><link>https://blog.wu-boy.com/2017/09/deploy-go-app-to-zeit-now/</link><pubDate>Fri, 15 Sep 2017 03:35:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/09/deploy-go-app-to-zeit-now/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本篇要教大家如何部署 &lt;a href="https://golang.org"&gt;Go&lt;/a&gt; 語言的 App 到 &lt;a href="https://zeit.co/now"&gt;now.sh&lt;/a&gt; 服務。now 服務是讓開發者可以透過 JavaScript 或用 Docker 方式直接部署到 now 雲端機器，也就是 now 所提供的服務可以在自己電腦透過 &lt;code&gt;package.json&lt;/code&gt; 或 &lt;code&gt;Dockerfile&lt;/code&gt; 來部署 app。原先剛出來時候，只有支援 node.js 部署，後來才增加 Docker。透過 Docker 就可以來部署各種不同語言的專案。&lt;/p&gt;</description></item><item><title>為什麼我用 Drone 取代 Jenkins 及 GitLab CI</title><link>https://blog.wu-boy.com/2017/09/why-i-choose-drone-as-ci-cd-tool/</link><pubDate>Thu, 07 Sep 2017 02:58:44 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/09/why-i-choose-drone-as-ci-cd-tool/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/36906030282/in/dateposted-public/" title="Logo-DevOpsDays"&gt;&lt;img src="https://farm5.staticflickr.com/4382/36906030282_f489c96be3_z.jpg" alt="Logo-DevOpsDays"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;終於有機會正式跟大家介紹為什麼我會捨棄 &lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt; 跟 &lt;a href="https://about.gitlab.com/features/gitlab-ci-cd/"&gt;GitLab CI&lt;/a&gt;，取而代之的是用 &lt;a href="https://golang.org"&gt;Go&lt;/a&gt; 語言寫的 &lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt;。今年很高興錄取台灣第一屆 &lt;a href="https://devopsdays.tw/"&gt;DevOps Day&lt;/a&gt; 講師，在今年主題是『用 Drone 打造輕量級容器持續交付平台』，主要推廣這套 &lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; CI/CD 工具，會議內容圍繞在 &lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;, &lt;a href="https://about.gitlab.com/features/gitlab-ci-cd/"&gt;GitLab CI&lt;/a&gt; 跟 Drone 的比較。也提到為什麼我不用 Jenkins 及 GitLab CI 的幾個原因。底下整理議程大綱。&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;為什麼選擇 Drone&lt;/li&gt;
&lt;li&gt;Drone 基礎簡介&lt;/li&gt;
&lt;li&gt;Drone 架構擴展&lt;/li&gt;
&lt;li&gt;Drone 安裝方式&lt;/li&gt;
&lt;li&gt;Drone 管理介面&lt;/li&gt;
&lt;li&gt;Drone 測試部署&lt;/li&gt;
&lt;li&gt;Drone 自訂套件&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>用 upx 壓縮 Go 語言執行擋</title><link>https://blog.wu-boy.com/2017/09/downsize-go-binary-using-upx/</link><pubDate>Fri, 01 Sep 2017 01:37:27 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/09/downsize-go-binary-using-upx/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;剛開始學 &lt;a href="https://golang.org"&gt;Go&lt;/a&gt; 語言的時候，跟學習其他語言一樣，寫了底下一個簡單的 Hello World 檔案&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt;9&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;package&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;main&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;import&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008b45"&gt;main&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;fmt.&lt;span style="color:#008b45"&gt;Println&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;Hello World!&amp;#34;&lt;/span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這是一個最簡單的程式碼，接著透過 &lt;code&gt;go build&lt;/code&gt; 的方式編譯出執行檔，這時候我們看看檔案大小:&lt;/p&gt;</description></item><item><title>用 Go 語言打造微服務架構</title><link>https://blog.wu-boy.com/2017/08/microservice-in-go/</link><pubDate>Fri, 11 Aug 2017 08:17:18 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/08/microservice-in-go/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/p&gt;
&lt;p&gt;今年在 &lt;a href="http://modernweb.tw/"&gt;ModernWeb&lt;/a&gt; 講『用 Go 語言打造微服務架構』，蠻開心看到底下很多 &lt;a href="https://golang.org"&gt;Go&lt;/a&gt; 開發者，希望未來能有更多公司導入 Go 語言，底下是會議大綱:&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;Microservices vs. Monolithic 差異&lt;/li&gt;
&lt;li&gt;微服務核心架構 (Go 工具專案)&lt;/li&gt;
&lt;li&gt;Go 語言核心高並發&lt;/li&gt;
&lt;li&gt;為什麼選用 Go 語言&lt;/li&gt;
&lt;li&gt;微服務代價跟準備&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2017 COSCUP 研討會: Gitea + Drone 介紹</title><link>https://blog.wu-boy.com/2017/08/2017-coscup-introduction-to-gitea-drone/</link><pubDate>Mon, 07 Aug 2017 06:23:26 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/08/2017-coscup-introduction-to-gitea-drone/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/36020937670/in/dateposted-public/" title="gitea-lg"&gt;&lt;img src="https://farm5.staticflickr.com/4377/36020937670_fbcf1ee3d3_z.jpg" alt="gitea-lg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今年很高興可以到 &lt;a href="http://coscup.org/2017"&gt;COSCUP&lt;/a&gt; 分享『&lt;strong&gt;Gitea + Drone 介紹&lt;/strong&gt;』，我是在第二天的最後一場來做分享，最後還被大會進來趕人，講超過時間了。這次是我第一次到&lt;a href="http://www.coss.ntu.edu.tw/"&gt;台大社科院&lt;/a&gt;，太陽真的好大，兩天下來流的汗水，大概已經是一年份的了。由於今年 COSCUP 不供應午餐，在第一天中午到科技站出口，左轉第一個店面就坐下來吃麵，店面不大，賣傳統小吃，我點了麻醬麵大碗 55 元，燙青菜 35 元，真的很大碗，不知道是不是因為在學校附近的關係，所以特別大碗，我心裡想說，這裡不是台北嗎？&lt;/p&gt;</description></item><item><title>Drone 發佈 0.8.0-rc.1 版本</title><link>https://blog.wu-boy.com/2017/07/drone-release-0-8-0-rc-1/</link><pubDate>Fri, 21 Jul 2017 06:44:42 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/07/drone-release-0-8-0-rc-1/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/34957940160/in/dateposted-public/" title="drone-logo_512"&gt;&lt;img src="https://i1.wp.com/c1.staticflickr.com/5/4236/34957940160_435d83114f_z.jpg?w=840&amp;#038;ssl=1" alt="drone-logo_512" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; 作者在昨天晚上發佈了 &lt;a href="http://docs.drone.io/release-0.8.0"&gt;0.8.0-rc.1&lt;/a&gt;，此版本有兩個重大變更，第一是 Server 跟 Angent 之間溝通方式轉成 &lt;a href="https://grpc.io/"&gt;GRPC&lt;/a&gt;，另一個變更則是將原本單一執行擋 drone 拆成兩個，也就是之後會變成 &lt;code&gt;drone-server&lt;/code&gt; 及 &lt;code&gt;drone-agent&lt;/code&gt;，拆成兩個好處是，通常 Server 端只會有一台，但是隨著專案越來越多，團隊越來越龐大，Agent 肯定不只有一台機器，所以把 Agent 拆出來可以讓維運人員架設新機器時更方便。&lt;/p&gt;</description></item><item><title>Let’s Encrypt 將在 2018 年一月支援 Wildcard Certificates</title><link>https://blog.wu-boy.com/2017/07/lets-encrypt-support-wildcard-certificates-in-2018-01/</link><pubDate>Sat, 08 Jul 2017 04:17:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/07/lets-encrypt-support-wildcard-certificates-in-2018-01/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/23840721545/in/dateposted-public/" title="Letsencrypt"&gt;&lt;img src="https://i1.wp.com/farm6.staticflickr.com/5803/23840721545_e0350b687f.jpg?w=840&amp;#038;ssl=1" alt="Letsencrypt" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://letsencrypt.org/"&gt;Let’s Encrypt&lt;/a&gt; 宣布在 2018 年一月全面支援 &lt;a href="https://letsencrypt.org/2017/07/06/wildcard-certificates-coming-jan-2018.html"&gt;Wildcard Certificates&lt;/a&gt;，目的就是讓全世界網站都支援 HTTPS 協定。自從 2015 年 12 月宣布免費支援申請 HTTPS 憑證，從原本的 40% 跳升到 58%，Let’s Encrypt 到現在總共支援了 47 million 網域。&lt;/p&gt;</description></item><item><title>Go 語言框架 Gin 終於發佈 v1.2 版本</title><link>https://blog.wu-boy.com/2017/07/go-framework-gin-release-v1-2/</link><pubDate>Thu, 06 Jul 2017 06:29:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/07/go-framework-gin-release-v1-2/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/35582011972/in/dateposted-public/" title="19807878_1634683919888714_743883353_o"&gt;&lt;img src="https://i2.wp.com/farm5.staticflickr.com/4094/35582011972_dd73f48a9f.jpg?w=840&amp;#038;ssl=1" alt="19807878_1634683919888714_743883353_o" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上週跟 &lt;a href="https://github.com/gin-gonic/gin"&gt;Gin&lt;/a&gt; 作者 &lt;a href="https://github.com/javierprovecho"&gt;@javierprovecho&lt;/a&gt; 討論要發佈新版本，很快地經過一兩天，作者終於整理好 &lt;a href="https://github.com/gin-gonic/gin/releases/tag/v1.2"&gt;v1.2&lt;/a&gt; 版本，除了釋出新版本外，也換了有顏色的 Logo，真心覺得很好看。大家來看看 v1.2 釋出哪些功能，或修正哪些問題。&lt;/p&gt;</description></item><item><title>台灣第一屆 Laravel 研討會</title><link>https://blog.wu-boy.com/2017/07/laravel-conf-in-taipei/</link><pubDate>Mon, 03 Jul 2017 01:43:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/07/laravel-conf-in-taipei/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/35625404626/in/dateposted-public/" title="laravelconftw_o"&gt;&lt;img src="https://i2.wp.com/farm5.staticflickr.com/4237/35625404626_71f7a8a492_z.jpg?w=840&amp;#038;ssl=1" alt="laravelconftw_o" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;這次很高興擔任第一屆 &lt;a href="https://laravelconf.tw"&gt;Laravel 台灣研討會&lt;/a&gt;講者，會議當天中午才到現場，我是兩點分享的議程，在整天聽下來及最後的案例討論，聽到最多的都是原本從 &lt;a href="https://codeigniter.org.tw/"&gt;CodeIgniter&lt;/a&gt; 架構換到 &lt;a href="https://laravel.com/"&gt;Laravel&lt;/a&gt; 上面，身為 CodeIgniter 的維護人員的我，聽到是蠻開心的，在 Laravel 還沒出來前，大家都是選用這輕量級的 CodeIgniter。&lt;/p&gt;</description></item><item><title>台灣第一屆 GoPher 大會</title><link>https://blog.wu-boy.com/2017/06/gopher-day-in-taipei/</link><pubDate>Fri, 30 Jun 2017 02:56:18 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/06/gopher-day-in-taipei/</guid><description>&lt;p&gt;&lt;a href="https://i0.wp.com/farm5.staticflickr.com/4285/35453214392_b37fcef501_z.jpg?ssl=1"&gt;&lt;img src="https://i0.wp.com/farm5.staticflickr.com/4285/35453214392_b37fcef501_z.jpg?w=840&amp;#038;ssl=1" alt="" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;很高興可以擔任第一屆 &lt;a href="http://gopher.ithome.com.tw/"&gt;GoPher Day&lt;/a&gt; 大會講者，每次參加聚會都是跟一堆網友見面，人在新竹很難得大家見到面。很感謝 &lt;a href="http://www.ithome.com.tw/"&gt;iThome&lt;/a&gt; 大力幫忙舉辦，才可以讓整天議程順利完成。底下分享『用 Go 語言實戰 Push Notification 服務』投影片。&lt;/p&gt;</description></item><item><title>Drone 自動觸發 GitLab CI 或 Jenkins 任務</title><link>https://blog.wu-boy.com/2017/06/trigger-gitlab-ci-or-jenkins-using-drone/</link><pubDate>Wed, 28 Jun 2017 04:24:31 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/06/trigger-gitlab-ci-or-jenkins-using-drone/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/34957940160/in/dateposted-public/" title="drone-logo_512"&gt;&lt;img src="https://i1.wp.com/c1.staticflickr.com/5/4236/34957940160_435d83114f_z.jpg?w=840&amp;#038;ssl=1" alt="drone-logo_512" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; 是一套由 &lt;a href="https://golang.org/"&gt;Go 語言&lt;/a&gt;所開發的開源碼專案，讓開發者可以使用 &lt;a href="http://docker.com/"&gt;Docker&lt;/a&gt; Container 快速設定自動化測試及部署，上篇有提到『&lt;a href="https://blog.wu-boy.com/2017/06/how-to-schedule-builds-in-drone/"&gt;Cronjob 搭配 Drone 服務&lt;/a&gt;』，讓 &lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt; 或 &lt;a href="https://about.gitlab.com/features/gitlab-ci-cd/"&gt;GitLab CI&lt;/a&gt; 用戶可以轉換 Cron Job 任務到 Drone 上面。本篇則是會介紹如何透過 Drone 去觸發 Jenkins 或 GitLab CI 上的工作，當然這是過渡時期，希望大家最後能將工作完整移轉到 Drone 上面，不要再依靠 Jenkins 或 GitLab CI 了。本篇會教大家用三種方式來觸發 GitLab CI 或 Jenkins 任務。&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;使用 Drone CI/CD&lt;/li&gt;
&lt;li&gt;使用 Docker 指令&lt;/li&gt;
&lt;li&gt;使用 Command Line (命令列)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Cronjob 搭配 Drone 服務</title><link>https://blog.wu-boy.com/2017/06/how-to-schedule-builds-in-drone/</link><pubDate>Sun, 25 Jun 2017 05:32:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/06/how-to-schedule-builds-in-drone/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/34957940160/in/dateposted-public/" title="drone-logo_512"&gt;&lt;img src="https://i1.wp.com/c1.staticflickr.com/5/4236/34957940160_435d83114f_z.jpg?w=840&amp;#038;ssl=1" alt="drone-logo_512" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; 是一套基於 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; Container 技術的 CI/CD 服務，它是用 &lt;a href="https://golang.org/"&gt;Go&lt;/a&gt; 語言所開發，可以安裝在任何作業系統內，你可以把 Drone 當作是開源版的 &lt;a href="https://travis-ci.org/"&gt;Travis&lt;/a&gt; 服務。Drone 本身不支援排程任務，也就是說無法像 Jenkins CI 一樣可以設定每天幾點幾分執行單一 Job 任務。但是可以透過第三方工具像是 &lt;code&gt;cron&lt;/code&gt; 來整合 Drone API 達成自動排程的效果，底下來看看該如何實作。&lt;/p&gt;</description></item><item><title>Node.js 8 搭配 npm 5 速度</title><link>https://blog.wu-boy.com/2017/06/node-js-8-npm-5-install-speed/</link><pubDate>Sun, 11 Jun 2017 05:02:28 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/06/node-js-8-npm-5-install-speed/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/29998255630/in/dateposted-public/" title="yarn-kitten-full"&gt;&lt;img src="https://i1.wp.com/c7.staticflickr.com/6/5712/29998255630_b40ff9df74_z.jpg?w=840&amp;#038;ssl=1" alt="yarn-kitten-full" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;這個月 &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt; 釋出 8.0 版本，搭配的就是 npm &lt;a href="https://github.com/npm/npm/releases/tag/v5.0.0"&gt;v5.0.0&lt;/a&gt; 版本，&lt;a href="https://blog.wu-boy.com/2017/06/downsize-node_modules-to-improve-deploy-speed/"&gt;上一篇&lt;/a&gt;寫到如何透過 &lt;a href="https://yarnpkg.com/en/"&gt;Yarn&lt;/a&gt; 指令移除 devDependencies 內的 Package 套件，減少 node_modules 大小，有網友提到那 npm 5 的速度為何？其實筆者已經好久沒有用 npm 了，但是有人提問，我就立馬來測試看看 npm vs yarn 的速度，詳細數據可以參考此&lt;a href="https://github.com/appleboy/npm-vs-yarn"&gt;專案說明&lt;/a&gt;。測試方法如下&lt;/p&gt;</description></item><item><title>減少 node_modules 大小來加速部署 Node.js 專案</title><link>https://blog.wu-boy.com/2017/06/downsize-node_modules-to-improve-deploy-speed/</link><pubDate>Tue, 06 Jun 2017 06:36:21 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/06/downsize-node_modules-to-improve-deploy-speed/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/29998255630/in/dateposted-public/" title="yarn-kitten-full"&gt;&lt;img src="https://i1.wp.com/c7.staticflickr.com/6/5712/29998255630_b40ff9df74_z.jpg?w=840&amp;#038;ssl=1" alt="yarn-kitten-full" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;相信 &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt; 開發者現在大部分都在使用 &lt;a href="https://yarnpkg.com"&gt;Yarn&lt;/a&gt; 了吧？如果還不知道或無法體會 Yarn 帶來的好處可以參考之前寫的一篇『&lt;a href="https://yarnpkg.com"&gt;用 Yarn 取代 Npm 管理 JavaScript 套件版本&lt;/a&gt;』，帶你體會 &lt;code&gt;yarn install&lt;/code&gt; vs &lt;code&gt;npm install&lt;/code&gt; 的速度差異。本篇最主要會介紹在部署 Node.js 專案都需要把 node_modules 壓縮一起丟到遠端伺服器 (假設你不是用 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 部署)，這時候來聊聊怎麼減少 &lt;code&gt;node_modules&lt;/code&gt; 大小。&lt;/p&gt;</description></item><item><title>Go 語言內 struct methods 該使用 pointer 或 value 傳值?</title><link>https://blog.wu-boy.com/2017/05/go-struct-method-pointer-or-value/</link><pubDate>Mon, 22 May 2017 02:39:06 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/05/go-struct-method-pointer-or-value/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上週末在台北講『&lt;a href="http://learning.ithome.com.tw/course/JjojzNh9P1N9H"&gt;Go 語言基礎課程&lt;/a&gt;』，其中一段介紹 Struct 的使用，發現有幾個學員對於在 Method 內要放 Pointer 或 Value 感到困惑，而我自己平時在寫 Go 語言也沒有注意到這點。好在強者學員 &lt;a href="https://www.facebook.com/YinChenLiao?fref=nf"&gt;Dboy Liao&lt;/a&gt; 找到一篇說明:『&lt;a href="https://nathanleclaire.com/blog/2014/08/09/dont-get-bitten-by-pointer-vs-non-pointer-method-receivers-in-golang/"&gt;Don&amp;rsquo;t Get Bitten by Pointer vs Non-Pointer Method Receivers in Golang&lt;/a&gt;』，在 Go 語言如何區分 &lt;code&gt;func (s *MyStruct)&lt;/code&gt; 及 &lt;code&gt;func (s MyStruct)&lt;/code&gt;，底下我們先來看看簡單的 Struct 例子&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-15"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-16"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-17"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;package&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;main&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;import&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;type&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Cart&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;struct&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Name&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Price&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(c&lt;span style="color:#bbb"&gt; &lt;/span&gt;Cart)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008b45"&gt;GetPrice&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;fmt.&lt;span style="color:#008b45"&gt;Println&lt;/span&gt;(c.Price)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008b45"&gt;main&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;c&lt;span style="color:#bbb"&gt; &lt;/span&gt;:=&lt;span style="color:#bbb"&gt; &lt;/span&gt;&amp;amp;Cart{&lt;span style="color:#cd5555"&gt;&amp;#34;bage&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b452cd"&gt;100&lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;c.&lt;span style="color:#008b45"&gt;GetPrice&lt;/span&gt;()&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>用 Docker Multi-Stage 編譯出 Go 語言最小 Image</title><link>https://blog.wu-boy.com/2017/04/build-minimal-docker-container-using-multi-stage-for-go-app/</link><pubDate>Sat, 29 Apr 2017 13:23:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/04/build-minimal-docker-container-using-multi-stage-for-go-app/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/25660808075/in/dateposted-public/" title="docker"&gt;&lt;img src="https://i2.wp.com/farm2.staticflickr.com/1600/25660808075_c8190290f7_z.jpg?w=840&amp;#038;ssl=1" alt="docker" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;之前應該沒寫過用 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 結合 Go 語言編譯出最小 Image 的文章，剛好趁這機會來介紹。其實網路上可以直接找到文章，像是這篇『&lt;a href="https://blog.codeship.com/building-minimal-docker-containers-for-go-applications/"&gt;Building Minimal Docker Containers for Go Applications&lt;/a&gt;』，那本文來介紹 Docker 新功能 &lt;a href="https://github.com/moby/moby/pull/32063"&gt;multi-stage builds&lt;/a&gt;，此功能只有在 &lt;a href="https://github.com/moby/moby/releases/tag/v17.05.0-ce-rc1"&gt;17.05.0-ce&lt;/a&gt; 才支援，看起來是 2017/05/03 號會 release 出來。我們拿 Go 語言的 Hello World 來介紹 Single build 及 Multiple build。&lt;/p&gt;</description></item><item><title>用 Go 語言打造 DevOps Bot</title><link>https://blog.wu-boy.com/2017/04/devops-bot-in-golang/</link><pubDate>Sat, 29 Apr 2017 03:33:49 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/04/devops-bot-in-golang/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/34200999131/in/dateposted-public/" title="18190989_10210525473186864_1567687746_n"&gt;&lt;img src="https://i0.wp.com/c1.staticflickr.com/5/4173/34200999131_48c1b84dd2_z.jpg?w=840&amp;#038;ssl=1" alt="18190989_10210525473186864_1567687746_n" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在 4/27 參加 &lt;a href="http://www.ithome.com.tw/"&gt;iThome&lt;/a&gt; 舉辦的第一屆 &lt;a href="http://chatbot.ithome.com.tw/"&gt;ChatBot Day&lt;/a&gt;，我分享了如何用 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt; 實作 DevOps Bot，可以透過 &lt;a href="https://developers.facebook.com/docs/messenger-platform"&gt;Facebook Messenger&lt;/a&gt; 或 &lt;a href="https://developers.line.me/messaging-api/overview"&gt;Line Messenger API&lt;/a&gt; 來主動通知開發者。此議程希望可以幫助想玩 Bot 但是又不知道如何入門的開發者。如果不懂程式語言，也可以直些下載 Binary 來玩玩看。&lt;/p&gt;</description></item><item><title>在 DigitalOcean 新竹社群簡介 Gitea 開源專案</title><link>https://blog.wu-boy.com/2017/04/introduction-to-gitea-in-digitalocean-hsinchu/</link><pubDate>Sun, 23 Apr 2017 13:34:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/04/introduction-to-gitea-in-digitalocean-hsinchu/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/32012549582/in/dateposted-public/" title="gitea"&gt;&lt;img src="https://i2.wp.com/c1.staticflickr.com/1/306/32012549582_3de35c29c8_o.png?w=840&amp;#038;ssl=1" alt="gitea" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;很高興受到 &lt;a href="https://www.facebook.com/DigitalOceanHsinchu/"&gt;DigitalOcean 新竹社群&lt;/a&gt;邀請來介紹輕量級的 Git 服務: &lt;a href="https://gitea.io"&gt;Gitea&lt;/a&gt;，在不久之前筆者已經寫過一篇 &lt;a href="https://blog.wu-boy.com/2017/01/new-git-code-hosting-option-gitea/"&gt;Gitea 介紹&lt;/a&gt;，這次到&lt;a href="http://www.nctu.edu.tw/"&gt;交通大學&lt;/a&gt;宣傳這套免費的開源專案，目的就是希望台灣有更多開發者或企業可以了解用 &lt;a href="https://golang.org/"&gt;Go 語言&lt;/a&gt;也可以打造一套輕量級 Git 服務，並且導入台灣的新創團隊。這次分享是透過 &lt;a href="https://www.digitalocean.com/"&gt;DigitalOcean&lt;/a&gt; 最小機器 (512MB 記憶體，每個月五美金) 來 Demo 如何在 Ubuntu 16.04 快速架設 Gitea 及使用 &lt;a href="https://caddyserver.com/"&gt;Caddy&lt;/a&gt; 來自動申請 &lt;a href="https://letsencrypt.org/"&gt;Let&amp;rsquo;s Encrypt&lt;/a&gt; 憑證，最後搭配 &lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt; 串自動化部署及測試等&amp;hellip;。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/33407490713/in/dateposted-public/" title="2017-04-23-18-18-45"&gt;&lt;img src="https://i1.wp.com/c1.staticflickr.com/3/2945/33407490713_d58acb6239_z.jpg?w=840&amp;#038;ssl=1" alt="2017-04-23-18-18-45" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>五大理由從 Python 轉到 Go 語言</title><link>https://blog.wu-boy.com/2017/04/5-reasons-why-we-switched-from-python-to-go/</link><pubDate>Sat, 08 Apr 2017 10:14:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/04/5-reasons-why-we-switched-from-python-to-go/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在網路上看到這篇『&lt;a href="https://medium.com/@tigranbs/5-reasons-why-we-switched-from-python-to-go-4414d5f42690"&gt;5 Reasons Why We switched from Python To Go&lt;/a&gt;』，先發到自己 &lt;a href="https://www.facebook.com/appleboy46/posts/10155217598399250"&gt;Facebook 牆上&lt;/a&gt;，引發討論，乾脆整理一篇 Blog 來寫自己的感想，底下五大理由讓該篇作者從 &lt;a href="https://www.python.org/"&gt;Python&lt;/a&gt; 轉到 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;。我會針對前四點來寫心得&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;編譯二進制檔案 (加速部署及跨平台)&lt;/li&gt;
&lt;li&gt;編譯自動檢查 Static 型態 (你不會把 string 欄位帶入 Integer)&lt;/li&gt;
&lt;li&gt;效能 (Go 並發跟 Python thread 比起來節省許多資源)&lt;/li&gt;
&lt;li&gt;不需要 web framework (Go 內建大多數 Library 像是 HTTP, JSON, HTML templating)&lt;/li&gt;
&lt;li&gt;好用的 IDE (內文提到 Webstorm, PHPStorm) 我推薦用 &lt;a href="https://code.visualstudio.com/"&gt;VSCode&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;除了第五點外，其他四點個人覺得都是工程師的痛點。&lt;/p&gt;</description></item><item><title>在 Go 語言用一行程式碼自動化安裝且更新 Let’s Encrypt 憑證</title><link>https://blog.wu-boy.com/2017/04/1-line-letsencrypt-https-servers-in-golang/</link><pubDate>Fri, 07 Apr 2017 03:23:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/04/1-line-letsencrypt-https-servers-in-golang/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在去年寫了一篇『&lt;a href="https://blog.wu-boy.com/2016/10/website-support-http2-using-letsencrypt/"&gt;申請 Let’s Encrypt 免費憑證讓網站支援 HTTP2&lt;/a&gt;』教學，如果您是用 Nginx，就可以參考該篇教學讓您的伺服器支援 HTTPS，而 &lt;a href="https://security.googleblog.com/2016/09/moving-towards-more-secure-web.html"&gt;Google Security Blog&lt;/a&gt; 也宣布在 56 版本以後將會提示 non-secure 網站，讓使用者可以選擇性瀏覽網站。&lt;a href="https://letsencrypt.org/"&gt;Let’s Encrypt&lt;/a&gt; 官方也&lt;a href="https://letsencrypt.org/2017/01/06/le-2016-in-review.html"&gt;公布去年 2016 發了多少張憑證&lt;/a&gt;，相當驚人，想必大家對 HTTPS 已經有相當程度的瞭解。底下這張圖說明 2016 年 Let’s Encrypt 發憑證總量的狀況&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/33499997070/in/dateposted-public/" title="Screen Shot 2017-04-07 at 9.52.40 AM"&gt;&lt;img src="https://i2.wp.com/c1.staticflickr.com/3/2820/33499997070_dfa4f1cf7c_z.jpg?w=840&amp;#038;ssl=1" alt="Screen Shot 2017-04-07 at 9.52.40 AM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此篇會介紹在 &lt;a href="https://golang.org"&gt;Go 語言&lt;/a&gt;如何跟 Let’s Encrypt 串接，底下有兩種方式。&lt;/p&gt;</description></item><item><title>Debian/Ubuntu 的 update-rc.d 使用教學</title><link>https://blog.wu-boy.com/2017/04/update-rc-in-debian-or-ubuntu/</link><pubDate>Thu, 06 Apr 2017 08:34:14 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/04/update-rc-in-debian-or-ubuntu/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/33486150390/in/dateposted-public" title="Debian"&gt;&lt;img src="https://i2.wp.com/c1.staticflickr.com/3/2849/33486150390_198a19b880_n.jpg?w=840&amp;#038;ssl=1" alt="Debian" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://manpages.ubuntu.com/manpages/precise/man8/update-rc.d.8.html"&gt;update-rc.d&lt;/a&gt; 是在 &lt;a href="https://www.debian.org/"&gt;Debian&lt;/a&gt; 或 &lt;a href="https://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; 內用來管理 &lt;code&gt;/etc/init.d&lt;/code&gt; 目錄內的 scripts 工具。不管是 Nginx 或 Mysql 等相關服務，都可以在 &lt;code&gt;/etc/init.d&lt;/code&gt; 目錄內找到相對應的 script 檔案，隨便打開一個 script 檔案就可以看到標頭有固定的格式寫法:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt;9&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;### BEGIN INIT INFO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;# Provides: gorush&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;# Required-Start: $syslog $network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;# Required-Stop: $syslog $network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;# Default-Start: 2 3 4 5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;# Default-Stop: 0 1 6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;# Short-Description: starts the gorush web server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;# Description: starts gorush using start-stop-daemon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;### END INIT INFO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Go 語言官方推出的 dep 使用心得</title><link>https://blog.wu-boy.com/2017/03/golang-dependency-management-tool-dep/</link><pubDate>Fri, 31 Mar 2017 01:58:01 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/03/golang-dependency-management-tool-dep/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://golang.org/"&gt;Go&lt;/a&gt; 語言團隊在去年開始開發 Dependency Management Tool 稱作 &lt;a href="https://github.com/golang/dep"&gt;dep&lt;/a&gt;，並且預計明年 2018 推出 1.10 Go 版本時內建，詳細可以參考官方的 &lt;a href="https://github.com/golang/dep/wiki/Roadmap"&gt;roadmap&lt;/a&gt;，強者我朋友寫了一篇&lt;a href="https://github.com/kevingo/dep-example"&gt;使用教學&lt;/a&gt;，有興趣的朋友可以參考看看，但是本篇會講幾點我目前不打算用 dep 的原因。&lt;/p&gt;</description></item><item><title>Go 語言的錯誤訊息處理</title><link>https://blog.wu-boy.com/2017/03/error-handler-in-golang/</link><pubDate>Thu, 23 Mar 2017 07:25:00 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/03/error-handler-in-golang/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;每個語言對於錯誤訊息的處理方式都不同，在學習每個語言時，都要先學會如何在程式內處理錯誤訊息 (Error Handler)，而在 &lt;a href="https://golang.org/"&gt;Go 語言&lt;/a&gt;的錯誤處理是非常簡單，本篇會用簡單的範例教大家 Go 如何處理錯誤訊息。&lt;/p&gt;</description></item><item><title>用 Golang 寫 Command line 工具</title><link>https://blog.wu-boy.com/2017/02/write-command-line-in-golang/</link><pubDate>Thu, 16 Feb 2017 07:46:06 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/02/write-command-line-in-golang/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果你要寫 Command line 工具，又想在各平台 (像是 MacOS, Windows 或 Linux) 上執行，這時候 &lt;a href="https://golang.org"&gt;Golang&lt;/a&gt; 就是您最好的選擇。在 &lt;a href="https://www.reddit.com"&gt;Reddit&lt;/a&gt; 讀到一篇 &lt;a href="https://www.reddit.com/r/golang/comments/5sdvoh/what_is_the_essential_difference_between/"&gt;Command line 工具比較介紹&lt;/a&gt;，這篇最主要講到兩個 CLI 工具，一個是 &lt;a href="https://github.com/urfave/cli"&gt;urfave/cli&lt;/a&gt;，另一個是 &lt;a href="https://github.com/spf13/cobra"&gt;spf13/cobra&lt;/a&gt;，這兩個工具其實都非常好用，後者是&lt;a href="http://spf13.com/post/joining-go-team-at-google/"&gt;去年加入 Google Golang 團隊&lt;/a&gt;的 &lt;a href="http://spf13.com/"&gt;spf13&lt;/a&gt; 所開發，該作者加入 Google 後呢，非常的忙，但是強者他同事有幫忙繼續維護 cobra 專案，兩個 CLI 工具各自都有有大型專案使用 urfave/cli 有 &lt;a href="https://github.com/docker/libcompose"&gt;docker/libcompose&lt;/a&gt;, &lt;a href="https://github.com/docker/machine"&gt;docker/machine&lt;/a&gt;, &lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt;, &lt;a href="https://gitea.io/"&gt;Gitea&lt;/a&gt;, &lt;a href="https://gogs.io/"&gt;Gogs&lt;/a&gt; 等，而後者 spf13/cobra 則有 &lt;a href="https://docker.com"&gt;docker&lt;/a&gt;, &lt;a href="https://github.com/docker/distribution"&gt;docker/distribution&lt;/a&gt;, &lt;a href="https://github.com/coreos/etcd"&gt;etcd&lt;/a&gt; 等。本篇筆者會介紹 urfave/cli 該如何使用？&lt;/p&gt;</description></item><item><title>Caddy 搭配 Drone 伺服器設定</title><link>https://blog.wu-boy.com/2017/02/caddy-setting-with-drone-ci-server/</link><pubDate>Tue, 07 Feb 2017 06:46:53 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/02/caddy-setting-with-drone-ci-server/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/32758934825/in/dateposted-public/" title="The_Caddy_web_server_logo.svg"&gt;&lt;img src="https://i0.wp.com/c1.staticflickr.com/1/528/32758934825_665c449ff3_z.jpg?resize=640%2C138&amp;#038;ssl=1" alt="The_Caddy_web_server_logo.svg" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="緣由"&gt;緣由&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://caddyserver.com/"&gt;Caddy&lt;/a&gt; 是一套 &lt;a href="https://zh.wikipedia.org/zh-tw/HTTP/2"&gt;HTTP/2&lt;/a&gt; 伺服器，你可以想成跟 &lt;a href="https://nginx.org/"&gt;Nginx&lt;/a&gt; 是同一種角色，但是 Caddy 有一點不一樣的地方就是自動支援 HTTPS 設定，也就是 Caddy 幫網站自動申請 &lt;a href="https://letsencrypt.org/"&gt;Letsencrypt&lt;/a&gt; 憑證，開發者不需要擔心憑證會過期，Caddy 會定期幫忙更換。&lt;a href="https://www.docker.com/"&gt;Drone&lt;/a&gt; 則是一套以 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 為基礎的 &lt;a href="https://en.wikipedia.org/wiki/Continuous_integration"&gt;Continuous Integration&lt;/a&gt; 平台。就在上個月 Caddy 發佈了 &lt;a href="https://github.com/mholt/caddy/releases/tag/v0.9.5"&gt;0.9.5&lt;/a&gt; 版本，更新過後，發現 &lt;a href="https://github.com/drone/drone"&gt;Drone&lt;/a&gt; 的 WebSocket 連線會斷線又連線，底下來看看 Caddy 更動了什麼造成 WebSocket 連線失效。&lt;/p&gt;</description></item><item><title>從商業利益看 Go 程式語言</title><link>https://blog.wu-boy.com/2017/01/business-benefits-of-go/</link><pubDate>Sat, 14 Jan 2017 12:59:30 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/01/business-benefits-of-go/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;從 2016 年開始寫 &lt;a href="https://golang.org/"&gt;Go&lt;/a&gt; 程式語言，在這一年我向很多朋友介紹了 Go 語言，很多人就不經問到為什麼我這麼喜歡 Go 語言，在公司內同事或主管更會問，為什麼要從 Node.js 或其他語言轉換到 Go，Go 語言有什麼地方可以帶給公司更大的利益，否則為什麼要多花時間跟人力去嘗試 Go 語言。如果團隊要建置一個商業 Web 服務，那我覺得底下的優點，是讓您選擇 Go 語言的最主要原因。&lt;/p&gt;</description></item><item><title>開發者另類的自架 Git 服務選擇: Gitea</title><link>https://blog.wu-boy.com/2017/01/new-git-code-hosting-option-gitea/</link><pubDate>Sat, 07 Jan 2017 14:31:52 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2017/01/new-git-code-hosting-option-gitea/</guid><description>&lt;p&gt;&lt;a href="https://i2.wp.com/c1.staticflickr.com/1/306/32012549582_3de35c29c8_o.png?ssl=1"&gt;&lt;img src="https://i2.wp.com/c1.staticflickr.com/1/306/32012549582_3de35c29c8_o.png?w=840&amp;#038;ssl=1" alt="" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;現在 Git 服務最有名的就是 &lt;a href="https://github.com/"&gt;Github&lt;/a&gt;，如果是開放原始碼，我很推薦 Github。如果是想要放大量私有專案或企業內及個人使用，想必大家會推薦 &lt;a href="https://about.gitlab.com/"&gt;Gitlab&lt;/a&gt;，在這裡就不多介紹 Gitlab 了，可以從 &lt;a href="https://www.google.com.tw/?gfe_rd=cr&amp;amp;ei=AO1wWPbPJMb48Aee1aqoBQ&amp;amp;gws_rd=ssl#q=gitlab&amp;amp;tbs=lr:lang_1zh-TW&amp;amp;lr=lang_zh-TW"&gt;Google 找到許多相關資料&lt;/a&gt;，本篇會介紹另類的 Git 自架服務選擇 &lt;a href="http://gitea.io/"&gt;Gitea&lt;/a&gt;，在介紹之前可以先參考我在 2014 年寫了一篇用 &lt;a href="https://blog.wu-boy.com/2014/04/go-git-service-using-go-language/"&gt;Go 語言開發的 Git 服務叫做 Gogs&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>在 Mac 建立新帳號，並且開通 ssh 權限</title><link>https://blog.wu-boy.com/2016/12/create-account-and-ssh-permission-on-mac/</link><pubDate>Fri, 30 Dec 2016 06:19:27 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/12/create-account-and-ssh-permission-on-mac/</guid><description>&lt;p&gt;&lt;a href="https://i1.wp.com/live.staticflickr.com/397/31822815762_fea6b2c9f4_c.jpg?ssl=1"&gt;&lt;img src="https://i1.wp.com/live.staticflickr.com/397/31822815762_fea6b2c9f4_c.jpg?w=840&amp;#038;ssl=1" alt="" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;為什麼我會需要在 &lt;a href="http://www.apple.com/tw/mac/"&gt;Mac&lt;/a&gt; 建立新帳號呢，原因就是最近用 &lt;a href="https://golang.org/"&gt;Golang&lt;/a&gt; 寫了 &lt;a href="https://github.com/appleboy/drone-scp"&gt;SCP 工具&lt;/a&gt;，此工具支援 Password 或 SSH Public Key 登入，我又不想拿個人帳號寫在 Testing 檔案內，所以才會想到在 Mac 建立一個帳號好了，本篇就是教大家如何在 Mac 建立新帳號，並且開通 SSH 權限。&lt;/p&gt;</description></item><item><title>用 drone-line 架設 Line webhook 及發送訊息</title><link>https://blog.wu-boy.com/2016/12/send-line-message-using-drone-line/</link><pubDate>Sun, 18 Dec 2016 07:57:16 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/12/send-line-message-using-drone-line/</guid><description>&lt;p&gt;&lt;a href="https://i2.wp.com/c5.staticflickr.com/1/318/31555289732_f79a194057_c.jpg?ssl=1"&gt;&lt;img src="https://i2.wp.com/c5.staticflickr.com/1/318/31555289732_f79a194057_c.jpg?w=840&amp;#038;ssl=1" alt="" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;之前寫了一篇教學『&lt;a href="https://blog.wu-boy.com/2016/11/send-line-notification-using-docker-written-in-golang/"&gt;用 Docker 發送 Line 訊息&lt;/a&gt;』，但是前提是你要先學會 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;，對於完全沒有 Docker 經驗的初學者來說，學習起來相當不容易，所以我將 drone-line 編譯出 Linux, Mac OS X 或 Windows 都可以執行的 Binary 檔案，方便初學者可以直接下載執行檔，在任何環境都可以運作，請直接參考 &lt;a href="https://github.com/appleboy/drone-line/releases/tag/v1.4.0"&gt;v1.4.0 Release&lt;/a&gt; 頁面，如果還是想用 Docker 版本的，可以直接參考 &lt;a href="https://hub.docker.com"&gt;Docker Hub&lt;/a&gt; 上的 &lt;a href="https://hub.docker.com/r/appleboy/drone-line/"&gt;drone-line repo&lt;/a&gt;，底下會教大家如何執行 Line webhook service 及發送訊息，尚未申請 Line Developer 帳號，請直接參考&lt;a href="https://blog.wu-boy.com/2016/11/send-line-notification-using-docker-written-in-golang/"&gt;前一篇教學&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Linode 推出新的 Datacenter 據點 Tokyo 2</title><link>https://blog.wu-boy.com/2016/11/new-linode-datacenter-tokyo-2/</link><pubDate>Tue, 22 Nov 2016 03:28:17 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/11/new-linode-datacenter-tokyo-2/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/31053886121/in/dateposted-public/" title="Screen Shot 2016-11-22 at 10.53.16 AM"&gt;&lt;img src="https://i1.wp.com/c2.staticflickr.com/6/5592/31053886121_51df13a6a4_z.jpg?resize=640%2C334&amp;#038;ssl=1" alt="Screen Shot 2016-11-22 at 10.53.16 AM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在半年前 &lt;a href="https://www.linode.com/"&gt;Linode&lt;/a&gt; 13 歲生日送了一份很大的禮物給大家，就是&lt;a href="https://blog.linode.com/2016/06/16/linodes-13th-birthday-gifts-for-all/"&gt;免費讓大家升級記憶體&lt;/a&gt;，這個禮物只限定在非東京據點，對於東京的用戶只能等待，就在今天 Linode 終於宣佈&lt;a href="https://blog.linode.com/2016/11/21/new-linode-datacenter-tokyo-2/"&gt;新的服務據點 Tokyo 2&lt;/a&gt;，新的東京據點比照[現有的牌價]收費，官方也提供&lt;a href="https://www.linode.com/docs/migrate-to-linode/disk-images/clone-your-linode"&gt;教學&lt;/a&gt;讓各地區快速的轉換到東京據點。&lt;/p&gt;</description></item><item><title>輕量級 Gofight 支援 Echo 框架測試</title><link>https://blog.wu-boy.com/2016/11/golang-gofight-support-echo-framework/</link><pubDate>Thu, 17 Nov 2016 15:19:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/11/golang-gofight-support-echo-framework/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/appleboy/gofight"&gt;Gofight&lt;/a&gt; 是一套用 &lt;a href="https://golang.org/"&gt;Golang&lt;/a&gt; 撰寫的輕量級測試工具，專門測試 Golang Web Framework API，可以參考之前一篇教學: &lt;a href="https://blog.wu-boy.com/2016/04/gofight-tool-for-api-handler-testing-in-golang/"&gt;用 gofight 來測試 golang web API handler&lt;/a&gt;，在 &lt;a href="https://echo.labstack.com/"&gt;Echo&lt;/a&gt; 框架發布 &lt;a href="https://github.com/labstack/echo/releases/tag/v3.0.0"&gt;v3.0.0&lt;/a&gt; 之前，Echo 不支援 golang 標準的 &lt;code&gt;http.Request&lt;/code&gt; 及 &lt;code&gt;http.ResponseWriter&lt;/code&gt;，反倒是支援 &lt;a href="https://github.com/valyala/fasthttp"&gt;fasthttp&lt;/a&gt;，所以我發了 &lt;a href="https://github.com/labstack/echo/issues/439"&gt;Issue&lt;/a&gt; 希望作者可以支援原生的 http 標準，最後沒有得到回應。就在前幾天 Echo 在 v3.0.0 版本把 &lt;code&gt;fasthttp&lt;/code&gt; 拿掉，這樣 Gofight 就可以移除特定函示，改用原生 http。&lt;/p&gt;</description></item><item><title>用 Docker 發送 Line 訊息</title><link>https://blog.wu-boy.com/2016/11/send-line-notification-using-docker-written-in-golang/</link><pubDate>Tue, 15 Nov 2016 08:48:18 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/11/send-line-notification-using-docker-written-in-golang/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/25660808075/in/dateposted-public/" title="docker"&gt;&lt;img src="https://i2.wp.com/farm2.staticflickr.com/1600/25660808075_c8190290f7_z.jpg?w=840&amp;#038;ssl=1" alt="docker" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今年各家網路公司 (&lt;a href="https://www.facebook.com"&gt;Facebook&lt;/a&gt;, &lt;a href="https://line.me/"&gt;Line&lt;/a&gt; 和 &lt;a href="https://telegram.org/"&gt;Telegram&lt;/a&gt;&amp;hellip;) 分別推出 Bot 服務，看起來 Bot 會是未來趨勢，對 Bot 不是很了解的話，可以參考 Eric ShangKuan 寫了一篇: &lt;a href="https://medium.com/@ericsk/%E9%97%9C%E6%96%BC%E5%AF%AB%E5%B0%8D%E8%AB%87%E6%A9%9F%E5%99%A8%E4%BA%BA-bot-%E7%9A%84%E5%85%A9%E4%B8%89%E4%BA%8B-f28f1a0ce7c4#.uuo64bw2e"&gt;關於寫對談機器人 (bot) 的兩三事&lt;/a&gt;。本篇會介紹如何透過 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 整合 &lt;a href="https://business.line.me/en/services/bot"&gt;Line Message API&lt;/a&gt;，下面所有指令都會跟 Docker 有關，但是程式碼都是用 &lt;a href="https://golang.org/"&gt;Golang&lt;/a&gt; 撰寫，想說順便在台灣推廣 ^__^。就在今年四月 Line 推出第一版 SDK，但是到了九月，突然收到 Line 的通知，說舊版的不支援了，請大家換到&lt;a href="https://devdocs.line.me/en"&gt;新板 API&lt;/a&gt;，最近更動到新版本時，踩到官網 UI 的雷就是原來 Line 有分 Developer 跟一般帳號，這兩種差別就是在於有無&lt;code&gt;主動 Push Message&lt;/code&gt; 功能，後來在 &lt;a href="https://github.com/line/line-bot-sdk-go"&gt;Line-Go-SDK&lt;/a&gt; 發問才找到&lt;a href="https://github.com/line/line-bot-sdk-go/issues/32#issuecomment-260235045"&gt;解答&lt;/a&gt;。底下會一步一步教大家如何透過 Docker 發送 Line 訊息。&lt;/p&gt;</description></item><item><title>用 Yarn 取代 Npm 管理 JavaScript 套件版本</title><link>https://blog.wu-boy.com/2016/10/replcae-npm-with-yarn-package-management/</link><pubDate>Thu, 13 Oct 2016 07:19:44 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/10/replcae-npm-with-yarn-package-management/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/29998255630/in/dateposted-public/" title="yarn-kitten-full"&gt;&lt;img src="https://i1.wp.com/c7.staticflickr.com/6/5712/29998255630_b40ff9df74_z.jpg?resize=640%2C287&amp;#038;ssl=1" alt="yarn-kitten-full" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;新一代戰神 &lt;a href="https://yarnpkg.com/"&gt;Yarn&lt;/a&gt; 終於在昨天出爐了，Yarn 跟 &lt;a href="https://www.npmjs.com/"&gt;Npm&lt;/a&gt; 一樣都是 JavaScript 套件版本管理工具，但是 Npm 令人詬病的是安裝都是非常的慢，快取機制用起來效果也不是很好，所以 Yarn 的出現解決了這些問題，透過 Yarn 安裝過的套件都會在家目錄產生 Cache (目錄在 &lt;code&gt;~/.yarn-cache/&lt;/code&gt;)，也就是只要安裝過一次，下次砍掉 &lt;code&gt;node_modules&lt;/code&gt; 目錄重新安裝都會從 Cache 讀取。Yarn 詳細的功能架構可以參考 Facebook 發表的 &lt;a href="https://code.facebook.com/posts/1840075619545360"&gt;Yarn: A new package manager for JavaScript&lt;/a&gt;，本篇不會教大家怎麼使用 Yarn，因為指令實在是太容易了，可以參考官方提供的&lt;a href="https://yarnpkg.com/en/docs/migrating-from-npm"&gt;如何從 npm 轉換到 yarn&lt;/a&gt;，底下則是來測試比較兩者安裝套件的速度。&lt;/p&gt;</description></item><item><title>申請 Let’s Encrypt 免費憑證讓網站支援 HTTP2</title><link>https://blog.wu-boy.com/2016/10/website-support-http2-using-letsencrypt/</link><pubDate>Sun, 09 Oct 2016 08:23:00 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/10/website-support-http2-using-letsencrypt/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/23840721545/in/dateposted-public/" title="Letsencrypt"&gt;&lt;img src="https://i1.wp.com/farm6.staticflickr.com/5803/23840721545_e0350b687f.jpg?w=300&amp;#038;ssl=1" alt="Letsencrypt" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;寫這篇最主要推廣讓網站都支援 &lt;a href="https://en.wikipedia.org/wiki/HTTPS"&gt;HTTPS 加密連線&lt;/a&gt;及 &lt;a href="https://en.wikipedia.org/wiki/HTTP/2"&gt;HTTP2 協定&lt;/a&gt;，對於網站為什麼要支援 HTTP2，可以直接參考 ihower 寫的&lt;a href="https://ihower.tw/blog/archives/8489"&gt;說明文章&lt;/a&gt;，最近在玩 Facebook, Line, Telegram Bot 時，填寫 Webhook URL，都強制要填寫 https:// 開頭，所以更不能忽略 HTTPS 了。，去年底寫了一篇 &lt;a href="https://blog.wu-boy.com/2015/12/letsencrypt-entering-public-beta-free-ssl/"&gt;Let&amp;rsquo;s Encrypt 開放申請免費 SSL 憑證&lt;/a&gt; 推廣 Let&amp;rsquo;s Encrypt 的貢獻，讓買不起憑證，又想玩看看 HTTP2 的開發者可以用很簡單的方式來安裝及自動更新憑證，而 &lt;a href="https://blog.gslin.org/"&gt;gslin&lt;/a&gt; 大為了推廣 HTTPS 也做了一個&lt;a href="https://letsencrypt.tw/"&gt;網站教學&lt;/a&gt;，文章寫得相當清楚，支援 &lt;a href="https://httpd.apache.org/"&gt;Apache&lt;/a&gt; 及 &lt;a href="https://nginx.org/"&gt;Nginx&lt;/a&gt; 設定。&lt;/p&gt;</description></item><item><title>SSH agent forwarding 教學</title><link>https://blog.wu-boy.com/2016/10/ssh-agent-forwarding-proxycommand-tutorial/</link><pubDate>Wed, 05 Oct 2016 02:09:41 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/10/ssh-agent-forwarding-proxycommand-tutorial/</guid><description>&lt;p&gt;&lt;strong&gt;2016.11.13 Update: SSH Agent Forwarding 有安全性問題，請用 &lt;code&gt;ProxyCommand&lt;/code&gt; 取代，請參考 &lt;a href="https://heipei.github.io/2015/02/26/SSH-Agent-Forwarding-considered-harmful/"&gt;SSH Agent Forwarding considered harmful&lt;/a&gt;&lt;/strong&gt; &lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/30008040142/in/dateposted-public/" title="Screen Shot 2016-10-05 at 9.26.13 AM"&gt;&lt;img src="https://i0.wp.com/c7.staticflickr.com/6/5219/30008040142_9d50881bba_z.jpg?resize=640%2C371&amp;#038;ssl=1" alt="Screen Shot 2016-10-05 at 9.26.13 AM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://developer.github.com/guides/using-ssh-agent-forwarding/"&gt;SSH agent forwarding&lt;/a&gt; 可以讓開發者將 Local 端的 SSH Key Pair 帶到另外一台機器進行傳送，也就是說你不用將 SSH Key 複製到遠端 Server 再進行跳板動作，原本在 AWS 維護多台 EC2 主機，都會固定有一台跳板機，大家都把自己需要登入遠端機器的 SSH Key 複製到跳板機，這做法其實沒有很安全，又需要多下一個指令進行跳板。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;個人電腦 -&amp;mdash;&amp;gt; EC2 跳板機 -&amp;mdash;&amp;gt; EC2 Server&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;大家都會把 Key Pair 存放到跳板機，安全性堪憂，只要這台主機被 Hack，或者是內部員工登入，拿別人的 Key Pair 登入其它主機，不就可以搞破壞？所以此篇教學主要教大家如何設定 SSH agent forwarding，讓憑證只存放在自己電腦，而不需上傳到 &lt;code&gt;EC2 跳板機&lt;/code&gt;。這樣跳板機就真的只是跳板機，不需要存放任何憑證資料，每小時設定清空 Ubuntu User 家目錄，避免內部員工放個人資料或憑證，提升主機安全性。&lt;/p&gt;</description></item><item><title>在 Travis 實現 Docker Cache</title><link>https://blog.wu-boy.com/2016/09/docker-cache-on-travis/</link><pubDate>Sat, 17 Sep 2016 08:25:13 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/09/docker-cache-on-travis/</guid><description>&lt;p&gt;&lt;a href="https://i1.wp.com/farm2.staticflickr.com/1600/25660808075_c8190290f7_c.jpg?ssl=1"&gt;&lt;img src="https://i1.wp.com/farm2.staticflickr.com/1600/25660808075_c8190290f7_c.jpg?w=840&amp;#038;ssl=1" alt="" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;前一篇寫了『&lt;a href="https://blog.wu-boy.com/2016/09/upload-docker-image-to-registry-using-travis/"&gt;用 Travis 自動上傳 Docker Image&lt;/a&gt;』，Travis 跑完測試成功後才自動編譯 Docker Image 並且上傳到 Docker Hub。在每次 commit 後，&lt;a href="https://travis-ci.com/"&gt;Travis&lt;/a&gt; 執行 docker build 時間總是非常長，當然原因很多。如果選用的 Docker base image 非常肥，指令非常多，每次編譯都要重新下載及執行指令，所以執行時間就是這麼長。本篇就是想辦法減少 Travis 編譯 Image 時間，就像把 &lt;code&gt;node_modules&lt;/code&gt; 壓縮起來，下次執行測試前先解壓縮再安裝，可以大幅減少 npm install 時間(可以參考之前的『&lt;a href="https://blog.wu-boy.com/2016/07/speed-up-npm-install-command/"&gt;用一行指令加速 npm install&lt;/a&gt;』)。這邊我們就需要用到 Travis 的 &lt;a href="https://docs.travis-ci.com/user/caching/"&gt;Cache 功能&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>用 Travis 自動上傳 Docker Image 到 Docker Registry</title><link>https://blog.wu-boy.com/2016/09/upload-docker-image-to-registry-using-travis/</link><pubDate>Sat, 17 Sep 2016 07:13:28 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/09/upload-docker-image-to-registry-using-travis/</guid><description>&lt;p&gt;&lt;a href="https://i1.wp.com/farm2.staticflickr.com/1600/25660808075_c8190290f7_c.jpg?ssl=1"&gt;&lt;img src="https://i1.wp.com/farm2.staticflickr.com/1600/25660808075_c8190290f7_c.jpg?w=840&amp;#038;ssl=1" alt="" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在今年七月寫了一篇『&lt;a href="https://blog.wu-boy.com/2016/07/upgrade-docker-and-docker-compose-on-travis/"&gt;在 Travis 升級 Docker 和 docker-compose 版本&lt;/a&gt;』，就在上個月底 &lt;a href="https://travis-ci.org/"&gt;Travis&lt;/a&gt; 終於將 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 預設版本換成 1.12.x 版本，並且將 &lt;a href="https://docs.docker.com/compose/"&gt;docker-compose&lt;/a&gt; 也一併升級到 1.8.0，這樣就可以不用手動升級了。那這篇會紀錄如何用 Travis 自動編譯 Docker Image 並且上傳到 &lt;a href="https://hub.docker.com/"&gt;Docker Hub&lt;/a&gt;。Docker Hub 提供兩種方式讓開發者上傳 Image，第一種是透過 Command line 下指令手動上傳，另外一種則是在 Docker Hub 後台指定 Dockerfile 路徑及需要執行編譯的分支，這樣只要 Push commit 到 &lt;a href="https://github.com/"&gt;Github&lt;/a&gt;，Docker Hub 就會根據 &lt;a href="https://docs.docker.com/engine/reference/builder/"&gt;Dockerfile&lt;/a&gt; 來自動編譯 Docker Image。本篇會介紹如何透過 Travis 服務來自動上傳 Dokcer Image，像是 Golang 的部屬方式通常是編譯出 Binary 執行檔後，將此執行檔加入 Image 最後才上傳。&lt;/p&gt;</description></item><item><title>Drone CI Server 搭配 Atlassian Bitbucket Server (前身 Stash)</title><link>https://blog.wu-boy.com/2016/09/drone-ci-server-integrate-atlassian-bitbucket-server/</link><pubDate>Tue, 13 Sep 2016 03:25:29 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/09/drone-ci-server-integrate-atlassian-bitbucket-server/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/29645454615/in/dateposted-public/" title="Screen Shot 2016-09-13 at 10.36.58 AM"&gt;&lt;img src="https://i2.wp.com/c8.staticflickr.com/9/8044/29645454615_79d329eacb_z.jpg?resize=640%2C361&amp;#038;ssl=1" alt="Screen Shot 2016-09-13 at 10.36.58 AM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;目前團隊是使用 &lt;a href="https://www.atlassian.com/software/bitbucket/server"&gt;Atlassian Bitbucket&lt;/a&gt; 搭配 &lt;a href="https://www.atlassian.com/software/bamboo"&gt;Bamboo&lt;/a&gt;，雖然 Bamboo 搭配自家的 Bitbucket (前身是 Stash Server) 整合得相當不錯，但是個人覺得設定上蠻複雜的，所以才想測試看看其他家 CI Service 對團隊學習及設定上更容易。最近找到一套用 &lt;a href="https://golang.org/"&gt;Golang&lt;/a&gt; 寫的 CI Server 就是 &lt;a href="https://drone.io/"&gt;Drone&lt;/a&gt;，Drone &lt;a href="http://readme.drone.io/"&gt;線上文件&lt;/a&gt;提供了 &lt;a href="https://github.com/"&gt;Github&lt;/a&gt;, &lt;a href="https://about.gitlab.com/"&gt;Gitlab&lt;/a&gt;, &lt;a href="https://gogs.io/"&gt;Gogs&lt;/a&gt;, Bitbucket (Stash) 等整合。在整合 Drone 搭配 Bitbucket 時，文件寫得不是很清楚，尤其是在 Bitbucket 建立 Application Link 遇到許多問題，官方文件也沒寫得很清楚，故寫此篇記錄如何將 Drone 服務整合 Bitbucket 伺服器。&lt;/p&gt;</description></item><item><title>2016 COSCUP 用 Golang 寫 Microservices</title><link>https://blog.wu-boy.com/2016/08/build-microservices-in-golang/</link><pubDate>Sun, 21 Aug 2016 10:18:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/08/build-microservices-in-golang/</guid><description>&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/p&gt;
&lt;p&gt;今年在 &lt;a href="http://coscup.org"&gt;COSCUP&lt;/a&gt; 投稿『&lt;a href="http://coscup.org/2016/schedules.html#H07"&gt;用 Golang 寫 Microservice&lt;/a&gt;』，這場議程最主要是介紹 &lt;a href="https://golang.org/"&gt;Golang&lt;/a&gt; 入門篇，以及用了哪些 Golang Library 在 &lt;a href="https://en.wikipedia.org/wiki/Microservices"&gt;Microservices&lt;/a&gt; 上，目的希望能多推廣 Golang 語言在 Server 開發上，將來能更多公司導入使用。底下是今年的簡報及大綱:&lt;/p&gt;</description></item><item><title>在 Jenkins 跑 Golang 測試</title><link>https://blog.wu-boy.com/2016/08/golang-tesing-on-jenkins/</link><pubDate>Tue, 02 Aug 2016 03:24:21 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/08/golang-tesing-on-jenkins/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本篇會紀錄如何在 &lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt; 測試 &lt;a href="https://golang.org/"&gt;Golang&lt;/a&gt; 專案，直接拿 &lt;a href="https://github.com/appleboy/go-hello"&gt;go-hello&lt;/a&gt; 當作本篇範例。&lt;/p&gt;</description></item><item><title>在 Travis 升級 Docker 和 docker-compose 版本</title><link>https://blog.wu-boy.com/2016/07/upgrade-docker-and-docker-compose-on-travis/</link><pubDate>Mon, 25 Jul 2016 13:10:56 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/07/upgrade-docker-and-docker-compose-on-travis/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/25660808075/in/dateposted-public/" title="docker"&gt;&lt;img src="https://i2.wp.com/farm2.staticflickr.com/1600/25660808075_c8190290f7_z.jpg?resize=640%2C217&amp;#038;ssl=1" alt="docker" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://travis-ci.org/"&gt;Travis&lt;/a&gt; 是在 &lt;a href="https://github.com/"&gt;Github&lt;/a&gt; 上常用的整合測試服務，支援了各種程式語言 &lt;a href="https://golang.org/"&gt;Golang&lt;/a&gt;, PHP, Node.js ..等測試及部署，也同時支援了一些常用 Service，像是 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;, Redis 或 Database。這次來聊聊&lt;a href="https://docs.travis-ci.com/user/docker/"&gt;在 Travis 如何使用 Docker&lt;/a&gt;，在 Travis 內建的 Docker 跟 &lt;a href="https://docs.docker.com/compose/"&gt;docker-compose&lt;/a&gt; 版本都是非常舊，所以使用預設的 docker-compose 指令常常會出現 (詳細 build log 可以參考&lt;a href="https://travis-ci.org/appleboy/golang-testing/jobs/147125401"&gt;這裡&lt;/a&gt;)&lt;/p&gt;</description></item><item><title>新的 code coverage 線上服務 codecov.io</title><link>https://blog.wu-boy.com/2016/07/new-coverage-service-codecov-io/</link><pubDate>Sat, 16 Jul 2016 07:50:29 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/07/new-coverage-service-codecov-io/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/28259851031/in/dateposted-public/" title="Screen Shot 2016-07-16 at 3.04.50 PM"&gt;&lt;img src="https://i1.wp.com/c8.staticflickr.com/9/8684/28259851031_de845f4e56_z.jpg?resize=640%2C355&amp;#038;ssl=1" alt="Screen Shot 2016-07-16 at 3.04.50 PM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;代碼覆蓋率 (code coverage) 是開發流程蠻重要的一環，用來評估專案內測試的覆蓋率，也代表了自己寫的程式，至少要測試過一次。在 &lt;a href="https://github.com"&gt;Github&lt;/a&gt; 上面最常用的一套就是 &lt;a href="https://coveralls.io/"&gt;Coveralls&lt;/a&gt; 相信大家對於此服務並不陌生，一個好的 Open Source 專案一定會在 Readme 上附上 Coveralls badge，證明自己寫的專案都有經過測試，請安心使用。在導入 Coveralls 服務到專案內時，安裝步驟有點小複雜，雖然不難，但是還是需要安裝一些 Tool 才能完成，底下用 &lt;a href="https://golang.org/"&gt;Golang&lt;/a&gt; 為例。&lt;/p&gt;</description></item><item><title>用 Docker 改善團隊合作模式</title><link>https://blog.wu-boy.com/2016/07/docker-team-work/</link><pubDate>Fri, 15 Jul 2016 07:11:37 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/07/docker-team-work/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/25660808075/in/dateposted-public/" title="docker"&gt;&lt;img src="https://i2.wp.com/farm2.staticflickr.com/1600/25660808075_c8190290f7_z.jpg?resize=640%2C217&amp;#038;ssl=1" alt="docker" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今年第一次參加 &lt;a href="http://www.ithome.com.tw/"&gt;iThome&lt;/a&gt; 舉辦的 &lt;a href="http://devopssummit.ithome.com.tw/"&gt;DevOps Summit&lt;/a&gt; 研討會，這次舉辦在台北文創大樓，就是在大巨蛋隔壁，很高興今年第一次投稿就錄取，題目是『&lt;strong&gt;用 Dokcer 改善團隊合作模式&lt;/strong&gt;』，主題偏向如何用 Docker 改善個人或團隊的開發狀況，尤其是在 IC 或系統廠如何導入 Docker。研討會上沒有提到很深入的 Docker 應用，在投影片內強調的是，如何將 &lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt; 及 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 帶入團隊內不同角色，包含 QA 及 PM，讓大家在團隊合作上能夠各自獨立，不會互相影響。底下就是我今年的投影片:&lt;/p&gt;</description></item><item><title>感謝老婆 Yisin 這一年來的辛苦</title><link>https://blog.wu-boy.com/2016/07/thanks-for-yisin-and-happy-birthday/</link><pubDate>Mon, 11 Jul 2016 16:00:46 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/07/thanks-for-yisin-and-happy-birthday/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/27893212996/in/datetaken/" title="CIMG8763"&gt;&lt;img src="https://i0.wp.com/c5.staticflickr.com/8/7423/27893212996_35b9e14644_z.jpg?resize=640%2C480&amp;#038;ssl=1" alt="CIMG8763" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;去年 8 月底，老婆辛苦生下可愛的兒子，在這一年內老婆很辛苦的把兒子養的白白胖胖，原本只需要照顧我這個大小孩，現在多一個&lt;strong&gt;小皓&lt;/strong&gt;需要照顧，真的非常辛苦，今天是老婆的生日，在這裡祝老婆生日快樂，希望您可以天天都開心，也可以身體健康。最後要跟老婆說聲謝謝這一年來的辛苦，當媽媽真的很偉大，什麼事情都是一肩扛下，對小孩也是非常有耐心，希望未來我可以帶給你更多的快樂。&lt;/p&gt;</description></item><item><title>用一行指令加速 npm install</title><link>https://blog.wu-boy.com/2016/07/speed-up-npm-install-command/</link><pubDate>Sun, 10 Jul 2016 15:44:07 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/07/speed-up-npm-install-command/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/24588632402/in/dateposted-public/" title="Npm-logo.svg"&gt;&lt;img src="https://i2.wp.com/farm2.staticflickr.com/1564/24588632402_35c2cab0b6_z.jpg?resize=640%2C249&amp;#038;ssl=1" alt="Npm-logo.svg" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;不久之前寫過一篇 &lt;a href="https://blog.wu-boy.com/2016/01/speed-up-npm-install/"&gt;提升 npm install 安裝速度&lt;/a&gt;，但是發現速度還是沒有變快，在 DevOps 的流程花在 &lt;code&gt;npm install&lt;/code&gt; 的時間非常冗長，造成每次測試或 Deploy 都要花大量時間等待，且吃掉很多機器的資源，本篇要提供一個小技巧改善 npm install 安裝時間，其實簡單來說就是 cache 第一次安裝好的 &lt;code&gt;node_modules&lt;/code&gt; 目錄，之後每次安裝就拿 cache 目錄來新增或減少 packages 即可。&lt;/p&gt;</description></item><item><title>在 Docker 偵測 MySQL 或 Postgres 是否啟動</title><link>https://blog.wu-boy.com/2016/06/server-monitoring-mysql-postgres-daemon-in-docker/</link><pubDate>Sat, 11 Jun 2016 08:42:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/06/server-monitoring-mysql-postgres-daemon-in-docker/</guid><description>&lt;p&gt;&lt;a title="Screen Shot 2016-06-11 at 6.58.22 PM" href="https://www.flickr.com/photos/appleboy/27525281071/in/dateposted-public/" data-flickr-embed="true"&gt;&lt;img src="https://i2.wp.com/c2.staticflickr.com/8/7626/27525281071_50bc0dec77_o.png?resize=591%2C580&amp;#038;ssl=1" alt="Screen Shot 2016-06-11 at 6.58.22 PM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;監控 Service 是否存活也是 &lt;a href="http://www.ithome.com.tw/news/96861"&gt;DevOps&lt;/a&gt; 重要的一環，此篇來紀錄在 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 內偵測 &lt;a href="https://www.mysql.com/"&gt;MySQL&lt;/a&gt; 或 &lt;a href="https://www.postgresql.org/"&gt;Postgres&lt;/a&gt; 是否已經啟動。在 Docker 自動測試內，其中一步就是建立 Database 環境，底下為測試步驟:&lt;/p&gt;</description></item><item><title>ScaleDrone Websocket 平台從 Node.js 轉換到 Golang</title><link>https://blog.wu-boy.com/2016/05/scaledrone-websocket-from-nodejs-to-go/</link><pubDate>Sun, 22 May 2016 07:51:03 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/05/scaledrone-websocket-from-nodejs-to-go/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;又看到一間網路平台公司從 &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt; 跳到 &lt;a href="https://golang.org/"&gt;Golang&lt;/a&gt; 了。&lt;a href="http://www.scaledrone.com"&gt;ScaleDrone&lt;/a&gt; 是一間提供了 &lt;a href="https://en.wikipedia.org/wiki/WebSocket"&gt;websocket&lt;/a&gt; 服務的公司，讓 web 可以透過 ScaleDrone 即時將訊息傳播到各種瀏覽器，但是今天看到 ScaleDrone 即將把後端平台使用的語言從 &lt;a href="http://blog.scaledrone.com/posts/nodejs-to-go"&gt;Node.js 轉換到 Golang&lt;/a&gt;，為什麼要轉語言呢，官方提到大量的 Websocket 連線，讓伺服器記憶體快吃不消了，然而 ScaleDrone 用 Go 語言來實際測試，發現記憶體不但沒有增加，反而還降低了 response 及 connections 時間。底下是針對 Node.js vs Go 語言轉換比較。&lt;/p&gt;</description></item><item><title>基礎 JavaScript ES6 和 CSS cheat sheet PDF 下載</title><link>https://blog.wu-boy.com/2016/05/javascript-es6-css-cheat-sheet-pdf/</link><pubDate>Fri, 20 May 2016 02:00:19 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/05/javascript-es6-css-cheat-sheet-pdf/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/16407404782" title="es6-logo"&gt;&lt;img src="https://i1.wp.com/farm8.staticflickr.com/7306/16407404782_1be42bc8f8_o.png?resize=400%2C400&amp;#038;ssl=1" alt="es6-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;a href="https://www.toptal.com"&gt;Toptal&lt;/a&gt; Blog 看到 &lt;a href="https://www.toptal.com/javascript/javascript-es6-cheat-sheet"&gt;JavaScript Cheat Sheet: ES6 And Beyond&lt;/a&gt; 及另外一篇 &lt;a href="https://www.toptal.com/css/css-cheat-sheet"&gt;A Practical CSS Cheat Sheet by Toptal Developers&lt;/a&gt;，這兩篇提供了一些 JavaScript ES6 及 CSS 的基礎寫法及教學，蠻適合前端工程師將 PDF 印出來貼在座位前面，cheat sheet 內提供的語法幾乎都是天天在用，像是在 ES2015 內 &lt;code&gt;let&lt;/code&gt; vs &lt;code&gt;var&lt;/code&gt; 語法差別，什麼時候要用 &lt;code&gt;const&lt;/code&gt; 或 &lt;code&gt;let&lt;/code&gt;，或 Template String，預設參數 .. 等功能，其實非常不賴。CSS 則是介紹基本的 Box Model、Selectors、Pseudo-selectors .. 等。&lt;/p&gt;</description></item><item><title>在 Github 專案內搜尋 Golang 函式，Golang 開發者必裝 Chrome Extension</title><link>https://blog.wu-boy.com/2016/05/sourcegraph-chrome-extension-for-github/</link><pubDate>Sun, 08 May 2016 13:20:42 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/05/sourcegraph-chrome-extension-for-github/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在 IDE 編輯器我們可以用內建的 go to definition 直接跳到該函式，但是身為工程師，每天接觸最多的就是觀看 &lt;a href="https://github.com"&gt;Github&lt;/a&gt; 程式碼，有沒有什麼方式可以透過 Web 介面直接搜尋專案內 &lt;a href="https://golang.org/"&gt;Golang&lt;/a&gt; 所有函式，讓 Golang 開發者快速跳到該函式，這時就要來安裝 &lt;a href="https://sourcegraph.com/blog/announcing-the-sourcegraph-chrome-extension-for/"&gt;Sourcegraph Chrome extension for GitHub&lt;/a&gt; 啦。&lt;/p&gt;</description></item><item><title>Golang 套件管理工具 Glide</title><link>https://blog.wu-boy.com/2016/05/package-management-for-golang-glide/</link><pubDate>Thu, 05 May 2016 01:00:15 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/05/package-management-for-golang-glide/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;套件版本管理已經是各大語言不可或缺的工具，像是 &lt;a href="%C2%A0https://nodejs.org/en/"&gt;Node.js&lt;/a&gt; 有 &lt;a href="https://www.npmjs.com/"&gt;npm&lt;/a&gt;，&lt;a href="https://php.net"&gt;PHP&lt;/a&gt; 有 &lt;a href="https://getcomposer.org/"&gt;Composer&lt;/a&gt;，&lt;a href="https://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; 有 &lt;a href="https://rvm.io/"&gt;RVM&lt;/a&gt; 等&amp;hellip;，都已經發展很成熟了，但是在 &lt;a href="https://golang.org/"&gt;Golang&lt;/a&gt; 語言呢，在 Go 1.5 以後的版本，可以透過 &lt;code&gt;GO15VENDOREXPERIMENT&lt;/code&gt; 或 &lt;a href="https://glide.sh/"&gt;Glide&lt;/a&gt; 來管理套件版本，在 Go 官方網站也有整理一份 &lt;a href="https://github.com/golang/go/wiki/PackageManagementTools"&gt;Wiki&lt;/a&gt;，開發者可以選一套適合自己的來使用，而今天要介紹這套 &lt;a href="https://github.com/Masterminds/glide"&gt;Glide&lt;/a&gt;，在開始之前，大家先來了解 Go 提出的 &lt;code&gt;vendor experiment&lt;/code&gt;。&lt;/p&gt;</description></item><item><title>Git Flow 與團隊合作</title><link>https://blog.wu-boy.com/2016/04/git-flow-tips/</link><pubDate>Thu, 28 Apr 2016 02:30:06 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/04/git-flow-tips/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/26620468361/in/dateposted-public/" title="branching-illustration@2x"&gt;&lt;img src="https://i2.wp.com/farm2.staticflickr.com/1584/26620468361_7fe972425a_z.jpg?resize=640%2C413&amp;#038;ssl=1" alt="branching-illustration@2x" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本月最後一篇投影片來介紹 &lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt; Flow 流程該如何導入團隊，之前寫過一篇 &lt;a href="https://blog.wu-boy.com/2011/03/git-%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6-branch-model-%E5%88%86%E6%94%AF%E6%A8%A1%E7%B5%84%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%B4%B9/"&gt;Git branch model&lt;/a&gt; 文章，裡面提到該如何正確使用 branch，但是現在回想起來要導入團隊內真的是有點麻煩，也遇到蠻多問題的，後來最後只採用 &lt;a href="https://guides.github.com/introduction/flow/"&gt;Github Flow&lt;/a&gt;，簡單又容易理解，如果開發者很常在 &lt;a href="https://github.com"&gt;Github&lt;/a&gt; 活動，相信對於此方法並不會很陌生。&lt;/p&gt;</description></item><item><title>來聊聊 PHP &amp; JavaScript &amp; CSS 的 Coding Style</title><link>https://blog.wu-boy.com/2016/04/php-javascript-css-coding-style/</link><pubDate>Tue, 26 Apr 2016 06:55:28 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/04/php-javascript-css-coding-style/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/26625548056/in/dateposted-public/" title="Screen Shot 2016-04-20 at 11.47.45 PM"&gt;&lt;img src="https://i0.wp.com/farm2.staticflickr.com/1676/26625548056_192cb60246_z.jpg?resize=640%2C395&amp;#038;ssl=1" alt="Screen Shot 2016-04-20 at 11.47.45 PM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;專案開始前，要決定好前端或後端各用什麼語言及制定符合團隊的 &lt;a href="https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Coding_Style"&gt;Coding Style&lt;/a&gt;，統一團隊 Style 是非常重要的，尤其是專案需要經過 Code Review 步驟，不要造成 Reviewer 困擾。底下寫了一份投影片介紹 &lt;a href="https://secure.php.net/"&gt;PHP&lt;/a&gt; &amp;amp; &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript"&gt;JavaScript&lt;/a&gt; 及 &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS"&gt;CSS&lt;/a&gt; 的基本 Coding Style 及該如何透過工具來改善 Coding Style。&lt;/p&gt;</description></item><item><title>在 linkit smart 7688 寫 golang</title><link>https://blog.wu-boy.com/2016/04/write-golang-in-linkit-smart-7688/</link><pubDate>Sun, 24 Apr 2016 17:06:54 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/04/write-golang-in-linkit-smart-7688/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/26010372204/in/dateposted-public/" title="7688_7688duo"&gt;&lt;img src="https://i0.wp.com/farm2.staticflickr.com/1545/26010372204_a1dcf1e0fc_z.jpg?resize=640%2C391&amp;#038;ssl=1" alt="7688_7688duo" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;很高興 &lt;a href="http://www.mediatek.com/zh-TW/"&gt;Mediatek&lt;/a&gt; 在去年推出 &lt;a href="https://labs.mediatek.com/site/global/developer_tools/mediatek_linkit_smart_7688/whatis_7688/index.gsp"&gt;linkit smart 7688&lt;/a&gt; 開發版，你可以把 7688 想成是一台迷你型 Router，如果不來拿開發，也可以當家用 Router 也是不錯的。7688 讓開發者可以在上面寫 &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt;, Python 及 Native C，光是聽到 Node.js 就很興奮，用 JavaScript 控制硬體。但是本篇要介紹如何在 7688 執行 &lt;a href="https://golang.org/"&gt;Golang&lt;/a&gt; 程式，其實不難，只要把 &lt;a href="https://openwrt.org/"&gt;OpenWrt&lt;/a&gt; 支援 &lt;a href="https://golang.org/doc/install/gccgo"&gt;gccgo&lt;/a&gt; 及 &lt;a href="https://github.com/golang/gofrontend/tree/master/libgo"&gt;libgo&lt;/a&gt; 即可。&lt;strong&gt;底下步驟同步於我的 &lt;a href="https://github.com/appleboy/linkit-smart-7688-golang"&gt;Github Repo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Docker 基礎介紹與實戰</title><link>https://blog.wu-boy.com/2016/04/introduction-to-docker/</link><pubDate>Fri, 22 Apr 2016 01:08:42 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/04/introduction-to-docker/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/25660808075/in/dateposted-public/" title="docker"&gt;&lt;img src="https://farm2.staticflickr.com/1600/25660808075_c8190290f7_z.jpg" width="640" height="217" alt="docker"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在個人開發環境或者是部署上，&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 已經是不可或缺的工具，尤其是團隊開發上，如何用 Docker 統一團隊開發環境，減少團隊成員浪費在環境建置及開發上互不影響，底下來看看投影片大綱:&lt;/p&gt;</description></item><item><title>在 WordPress 內寫 Markdown 語法</title><link>https://blog.wu-boy.com/2016/04/write-markdown-in-wordpress/</link><pubDate>Sat, 09 Apr 2016 07:14:31 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/04/write-markdown-in-wordpress/</guid><description>&lt;p&gt;在 &lt;a href="https://zh.wikipedia.org/wiki/Markdown"&gt;Markdown&lt;/a&gt; 還沒出來之前，要寫一篇部落格教學真的非常麻煩，尤其是要學習 html 語法及如何引用程式碼在文章內，Markdwon 的出現，改變了整個工程師寫 Blog 的習慣，現在不管使用任何網站，沒有支援 Markdwon 語法，真的就不太想留言或發文了。最早以前自己的部落格是用 &lt;a href="https://wordpress.org/plugins/wp-markdown/"&gt;WP-Markdwon&lt;/a&gt; 這套 Plugin，但是這套 Plugin 在整合 &lt;a href="https://wordpress.org/plugins/syntaxhighlighter/"&gt;SyntaxHighlighter Evolved&lt;/a&gt; 的時候根本無法使用，需要特定的語法才可以使用。WP-Markdwon 有個好用的工具那就是 editor tool bar，幫你省下製作 hyperlink 的時間，會自動幫忙編號，如果沒有 SyntaxHighlighter 需求，我個人是推薦用 WP-Markdwon。&lt;/p&gt;</description></item><item><title>用 gofight 來測試 golang web API handler</title><link>https://blog.wu-boy.com/2016/04/gofight-tool-for-api-handler-testing-in-golang/</link><pubDate>Wed, 06 Apr 2016 07:18:21 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/04/gofight-tool-for-api-handler-testing-in-golang/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;身為一位後端工程師，如果專案初期階段不導入測試，等到專案越來越大時，您就會發現，解了一個 bug，又產生好多個額外 bug，讓產品一直處於不穩定狀態。後端最主要提供前端或手機端 RESTFul API，所以今天來介紹一套 &lt;a href="https://github.com/appleboy/gofight"&gt;gofight&lt;/a&gt; 工具，用來測試 &lt;a href="https://golang.org/"&gt;Golang&lt;/a&gt; 的 http &lt;a href="https://golang.org/pkg/net/http/#Handler"&gt;handler&lt;/a&gt;，讓開發者可以送 Form, JSON, Raw 資料，後端處理後，可以拿到 response 資料，透過 &lt;a href="https://github.com/stretchr/testify"&gt;Testify&lt;/a&gt; 來測試資料是否符合需求。&lt;/p&gt;
&lt;p&gt;目前大部份的 Golang Web Framework 都可以透過 &lt;a href="https://github.com/appleboy/gofight"&gt;gofight&lt;/a&gt; 來測試，除非作者有把 &lt;code&gt;ServeHTTP&lt;/code&gt; 改成自己定義 Response，不然基本上都是可以支援的，我自己測試了 &lt;a href="https://github.com/gin-gonic/gin"&gt;Gin&lt;/a&gt;, &lt;a href="https://github.com/gorilla/mux"&gt;Mux&lt;/a&gt;, &lt;a href="https://github.com/julienschmidt/httprouter"&gt;HttpRouter&lt;/a&gt; 都是可以使用的，底下來看看 &lt;a href="https://github.com/appleboy/gofight"&gt;gofight&lt;/a&gt; 該如何使用。&lt;/p&gt;</description></item><item><title>Docker 實用指令及 Best Practices Cheat Sheet 圖表</title><link>https://blog.wu-boy.com/2016/03/docker-commands-and-best-practices-cheat-sheet/</link><pubDate>Sun, 20 Mar 2016 05:33:37 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/03/docker-commands-and-best-practices-cheat-sheet/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/25660808075/in/dateposted-public/" title="docker"&gt;&lt;img src="https://i2.wp.com/farm2.staticflickr.com/1600/25660808075_c8190290f7_z.jpg?w=840&amp;#038;ssl=1" alt="docker" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在網路上看到有人提供 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 的 &lt;a href="http://zeroturnaround.com/rebellabs/docker-commands-and-best-practices-cheat-sheet/"&gt;Cheat Sheet&lt;/a&gt;，裡面整理了很多常用的指令，建議剛入門 Docker 的初學者務必把底下指令學完，底下就是 Cheat Sheet&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/25622175940/in/dateposted-public/" title="Docker-cheat-sheet-by-RebelLabs"&gt;&lt;img src="https://i1.wp.com/farm2.staticflickr.com/1633/25622175940_277a89c6a1_z.jpg?w=840&amp;#038;ssl=1" alt="Docker-cheat-sheet-by-RebelLabs" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://farm2.staticflickr.com/1633/25622175940_e4540f1e7e_o.png"&gt;點我大圖&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;container 放大架構圖&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/25802770142/in/dateposted-public/" title="Screen Shot 2016-03-20 at 1.11.30 PM"&gt;&lt;img src="https://i0.wp.com/farm2.staticflickr.com/1458/25802770142_8c525c3309_z.jpg?w=840&amp;#038;ssl=1" alt="Screen Shot 2016-03-20 at 1.11.30 PM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="基本指令"&gt;基本指令&lt;/h3&gt;
&lt;p&gt;下載映像檔&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker pull image_name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;啟動或關閉 container&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker [start|stop] container_name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;建立 -&amp;gt; 啟動 -&amp;gt; 執行指令 (&lt;code&gt;-ti&lt;/code&gt; 參數)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker run -ti --name container_name image_name &lt;span style="color:#658b00"&gt;command&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;建立 -&amp;gt; 啟動 -&amp;gt; 執行指令 -&amp;gt; 刪除 container (&lt;code&gt;-rm&lt;/code&gt; 參數)&lt;/p&gt;</description></item><item><title>用 Docker 取代 Laravel Homestead 開發環境</title><link>https://blog.wu-boy.com/2016/03/replace-laravel-homestead-with-docker/</link><pubDate>Thu, 10 Mar 2016 06:37:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/03/replace-laravel-homestead-with-docker/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/25660808075/in/dateposted-public/" title="docker"&gt;&lt;img src="https://i2.wp.com/farm2.staticflickr.com/1600/25660808075_c8190290f7_z.jpg?resize=640%2C217&amp;#038;ssl=1" alt="docker" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;新手第一次接觸 &lt;a href="http://laravel.com/"&gt;Laravel&lt;/a&gt;，我都會推薦使用 &lt;a href="https://laravel.com/docs/5.2/homestead"&gt;Homestead&lt;/a&gt; 來解決開發環境的困擾，但是我發現 Homestead 對於第一次接觸 &lt;a href="https://www.virtualbox.org/"&gt;Virtualbox&lt;/a&gt; 及指令的初學者，設定還是比較複雜，造成很多新手光是在這邊就卡關了，有沒有什麼辦法可以解決這煩人又複雜的 Homestead 設定，剛好今天在 &lt;a href="https://github.com/"&gt;Github&lt;/a&gt; 上看到 &lt;a href="https://github.com/laraedit/laraedit-docker"&gt;laraedit-docker&lt;/a&gt; 專案，此專案是把 Homestead 轉換成用 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 來跑，這樣只要您的環境有支援 Docker，就可以快速設定好環境含 MySQL, Redis &amp;hellip;等&lt;/p&gt;</description></item><item><title>為什麼我選擇使用 Laravel Framework?</title><link>https://blog.wu-boy.com/2016/03/why-i-choose-laravel-framework/</link><pubDate>Wed, 09 Mar 2016 06:45:31 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/03/why-i-choose-laravel-framework/</guid><description>&lt;p&gt;&lt;a href="https://i1.wp.com/farm2.staticflickr.com/1655/23493872563_4f01a9c336_o.png?ssl=1"&gt;&lt;img src="https://i1.wp.com/farm2.staticflickr.com/1655/23493872563_4f01a9c336_o.png?w=840&amp;#038;ssl=1" alt="" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;根據上次寫了一篇&lt;a href="https://blog.wu-boy.com/2016/01/how-to-choose-web-framework/"&gt;如何選擇 Web Framework&lt;/a&gt;，本篇寫了為什麼我選擇 &lt;a href="https://laravel.com/"&gt;Laravel&lt;/a&gt; 這套 PHP Framework。底下是對於 Laravel 我選擇的一些看法，大家可以參考看看。要選一套好的 frmaework 真不容易，要考慮團隊成員技能，及後續的教育訓練等 &amp;hellip;&lt;/p&gt;</description></item><item><title>Golang 發佈 1.6 正式 Release</title><link>https://blog.wu-boy.com/2016/02/golang-1-6-release/</link><pubDate>Thu, 18 Feb 2016 02:12:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/02/golang-1-6-release/</guid><description>&lt;p&gt;&lt;a href="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080"&gt;&lt;img src="https://lh3.googleusercontent.com/jsocHCR9A9yEfDVUTrU0m42_aHhTEVDGW5p5PsQSx7GSlkt3gLjohfXH3S7P7p982332ruU_e-EtW0LwmiuZjvN65VIcyME-zE35C6EM0IV1nqY6KoNw3dwW2djjid3F-T5YgnJothA=w1920-h1080" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今天 &lt;a href="https://golang.org"&gt;golang&lt;/a&gt; 正式&lt;a href="http://blog.golang.org/go1.6"&gt;發佈 1.6 版本&lt;/a&gt;，趕快到&lt;a href="https://golang.org/dl/"&gt;官方網站下載&lt;/a&gt;使用，如果你是用 &lt;a href="https://github.com/moovweb/gvm"&gt;gvm&lt;/a&gt;，直接下 &lt;code&gt;gvm install go1.6&lt;/code&gt; 即可。golang wiki 提供了很多 &lt;a href="https://github.com/golang/go/wiki/PackageManagementTools"&gt;Package Management Tools&lt;/a&gt;，可以隨意選一套來使用。底下整理幾點 1.6 的改變：&lt;/p&gt;
&lt;h2 id="重大改變"&gt;重大改變&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;正式支援 &lt;a href="https://http2.github.io/"&gt;HTTP/2&lt;/a&gt; 協定，跑 https 會預設&lt;a href="https://golang.org/doc/go1.6#http2"&gt;啟動 HTTP/2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Go 1.5 介紹了&lt;a href="https://golang.org/s/go15vendor"&gt;實驗性質的 vendor&lt;/a&gt;，在 1.6 還是會支援 &lt;code&gt;GO15VENDOREXPERIMENT&lt;/code&gt; 變數，但是預設值為 1，在 1.7 會正式將此變數拿掉&lt;/li&gt;
&lt;li&gt;預設用 &lt;a href="https://golang.org/doc/go1.6#cgo"&gt;cgo&lt;/a&gt; 來編譯分享 golang 指標與 C 之間溝通&lt;/li&gt;
&lt;li&gt;支援 &lt;a href="https://golang.org/doc/go1.6#ports"&gt;Linux on 64-bit MIPS 和 Android on 32-bit x86&lt;/a&gt; 架構&lt;/li&gt;
&lt;li&gt;在 &lt;a href="https://www.freebsd.org/"&gt;FreeBSD&lt;/a&gt; 上面預設使用 &lt;a href="http://clang.llvm.org/"&gt;clang&lt;/a&gt; 而不是 &lt;a href="https://gcc.gnu.org/"&gt;gcc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="效能議題"&gt;效能議題&lt;/h2&gt;
&lt;p&gt;官方說無從比較，有些程式碼可能在 1.6 比較快，也有可能在 1.5 會比較快，但是在 garbage collector 上面 1.6 會比 1.5 好，前提是程式使用了大量的記憶體，1.6 版本也針對蠻多 package 做了 Performance 改善，提升了至少 10 % 喔 &lt;a href="https://golang.org/pkg/compress/bzip2/"&gt;compress/bzip2&lt;/a&gt;, &lt;a href="https://golang.org/pkg/compress/gzip/"&gt;compress/gzip&lt;/a&gt;, &lt;a href="https://golang.org/pkg/crypto/aes/"&gt;crypto/aes&lt;/a&gt;, &lt;a href="https://golang.org/pkg/crypto/elliptic/"&gt;crypto/elliptic&lt;/a&gt;, &lt;a href="https://golang.org/pkg/crypto/ecdsa/"&gt;crypto/ecdsa&lt;/a&gt;, 和 &lt;a href="https://golang.org/pkg/sort/"&gt;sort&lt;/a&gt; 套件。&lt;/p&gt;</description></item><item><title>在 MAC OS 快速又簡單安裝 Docker 環境 – dlite</title><link>https://blog.wu-boy.com/2016/02/the-simplest-way-to-use-docker-on-os-x-dlite/</link><pubDate>Mon, 15 Feb 2016 08:40:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/02/the-simplest-way-to-use-docker-on-os-x-dlite/</guid><description>&lt;p&gt;在 &lt;a href="http://www.apple.com/tw/osx/"&gt;Mac OS X&lt;/a&gt; 底下安裝 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 服務不難，只需要到 &lt;a href="https://docs.docker.com/engine/installation/mac/"&gt;Docker Mac 教學網站&lt;/a&gt;下載 &lt;a href="https://www.docker.com/toolbox"&gt;Docker Toolbox&lt;/a&gt;，就可以使用 &lt;code&gt;docker-machine&lt;/code&gt;, &lt;code&gt;docker&lt;/code&gt;, &lt;code&gt;docker-compose&lt;/code&gt; 等指令操作 Docker 服務。本篇提供另外一種工具，讓 Mac 開發者可以快速使用 Docker 服務，就是這套用 &lt;a href="https://golang.org/"&gt;Go&lt;/a&gt; 語言寫的 &lt;a href="https://github.com/nlf/dlite"&gt;dlite&lt;/a&gt; 工具。&lt;/p&gt;
&lt;h2 id="安裝方式"&gt;安裝方式&lt;/h2&gt;
&lt;p&gt;dlite 提供三種方式安裝&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;直接下載執行檔案 (推薦) (&lt;a href="https://github.com/nlf/dlite/releases"&gt;下載連結&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;直接透過 brew 指令安裝: &lt;code&gt;brew install dlite&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;開發者模式: &lt;code&gt;git clone&lt;/code&gt; 專案，然後下 &lt;code&gt;make dlite&lt;/code&gt; 產生執行檔案&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;請大家直接使用第一種方式安裝即可。&lt;/p&gt;
&lt;h2 id="使用方式"&gt;使用方式&lt;/h2&gt;
&lt;p&gt;安裝 dlite 需要使用到磁碟空間及記憶體，你可以動態指定 memory 使用量，或者是磁碟空間，詳細指令可以透過 &lt;code&gt;dlite install -h&lt;/code&gt; 觀看&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-15"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-16"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-17"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo dlite install -h
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Usage:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dlite [OPTIONS] install [install-OPTIONS]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;creates an empty disk image, downloads the os, saves configuration and creates a launchd agent
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Help Options:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -h, --help Show this &lt;span style="color:#658b00"&gt;help&lt;/span&gt; message
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[install &lt;span style="color:#658b00"&gt;command&lt;/span&gt; options]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -c, --cpus= number of CPUs to allocate (default: 1)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -d, --disk= size of disk in GiB to create (default: 20)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -m, --memory= amount of memory in GiB to allocate (default: 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -s, --ssh-key= path to public ssh key (default: &lt;span style="color:#00688b"&gt;$HOME&lt;/span&gt;/.ssh/id_rsa.pub)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -v, --os-version= version of DhyveOS to install
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -n, --hostname= hostname to use &lt;span style="color:#8b008b;font-weight:bold"&gt;for&lt;/span&gt; vm (default: local.docker)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -S, --share= directory to &lt;span style="color:#658b00"&gt;export&lt;/span&gt; from NFS (default: /Users)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;可以看到指令預設會佔用 20GB 的磁碟使用量及 2GB 的記憶體，所以安裝時可以調整成個人需求大小，安裝請用 &lt;code&gt;root&lt;/code&gt; 使用者&lt;/p&gt;</description></item><item><title>Git tips: 更改 commit log 作者</title><link>https://blog.wu-boy.com/2016/02/git-tips-blame-someone-else/</link><pubDate>Thu, 11 Feb 2016 16:11:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/02/git-tips-blame-someone-else/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/24588096069/in/dateposted-public/" title="github"&gt;&lt;img src="https://i0.wp.com/farm2.staticflickr.com/1482/24588096069_111b2dcb46_o.png?w=840&amp;#038;ssl=1" alt="github" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;a href="https://github.com"&gt;Github&lt;/a&gt; 上面看到這 &lt;a href="https://github.com/jayphelps/git-blame-someone-else"&gt;git-blame-someone-else&lt;/a&gt; 專案，用來隨時修改 commit log 作者，也就是可以任意改 commit id 內的 `Author` 欄位資訊，作者也相當幽默，直接拿此 &lt;a href="https://github.com/jayphelps/git-blame-someone-else/commit/e5cfe4bb2190a2ae406d5f0b8f49c32ac0f01cd7"&gt;commit id&lt;/a&gt; 改成 &lt;a href="https://en.wikipedia.org/wiki/Linux"&gt;Linux&lt;/a&gt; 作者 &lt;a href="https://github.com/torvalds"&gt;Linus Torvalds&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="使用時機"&gt;使用時機&lt;/h2&gt;
&lt;p&gt;大家會問到什麼時候才會用到需要修改 commit 作者，以我自己的狀況為例，在團隊內開發新功能會直接開新的 Branch 來開發，完成後會進行 code review，此時原開發者目前正在忙其他專案，其他團隊成員就必須幫忙修改原先 commit 內容，通常我是直接建議透過 `git reset &amp;ndash;soft HEAD^` 來更動原本 commit，而不是產生新的 commit，修改後作者就會變成自己，此時後這功能就派上用場了。&lt;/p&gt;
&lt;h2 id="安裝方式"&gt;安裝方式&lt;/h2&gt;
&lt;p&gt;根據源專案是透過 root 權限，將執行檔丟到 `/usr/loca/bin` 目錄底下，但是我個人不建議用這方式，因為還需要 root 權限，要打密碼有點麻煩，我建議透過在家目錄建立 `bin` 目錄，並將此目錄加到 `$PATH` 變數內即可。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ mkdir ~/bin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ wget https://raw.githubusercontent.com/jayphelps/git-blame-someone-else/master/git-blame-someone-else -O ~/bin/git-blame-someone-else
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ chmod &lt;span style="color:#b452cd"&gt;755&lt;/span&gt; ~/bin/git-blame-someone-else
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;修改 &lt;code&gt;.bashrc&lt;/code&gt;，加入底下程式碼&lt;/p&gt;</description></item><item><title>提升 npm install 安裝速度</title><link>https://blog.wu-boy.com/2016/01/speed-up-npm-install/</link><pubDate>Sun, 31 Jan 2016 03:36:24 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/01/speed-up-npm-install/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/24588632402/in/dateposted-public/" title="Npm-logo.svg"&gt;&lt;img src="https://i2.wp.com/farm2.staticflickr.com/1564/24588632402_35c2cab0b6_z.jpg?resize=640%2C249&amp;#038;ssl=1" alt="Npm-logo.svg" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/"&gt;npm&lt;/a&gt; 是 &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt; 套件管理模組，相信大家對 npm 不會很陌生，如果對於 npm 不了解的，可以參考&lt;a href="http://www.ruanyifeng.com/"&gt;阮一峰&lt;/a&gt;寫的&lt;a href="http://www.ruanyifeng.com/blog/2016/01/npm-install.html"&gt;這篇文章&lt;/a&gt;，今天要來探討的是如何提升 &lt;code&gt;npm install&lt;/code&gt; 的安裝速度，如果你正在嘗試 npm@3 版本，我建議可以先換到 npm@2 的版本會比較快（為什麼呢？底下有數據會說話）。&lt;a href="https://github.com/npm/npm/issues/9632"&gt;Github issue&lt;/a&gt; 上也蠻多速度上的討論，然而前幾天有網友&lt;a href="https://github.com/npm/npm/issues/11283"&gt;發表一篇&lt;/a&gt;關掉 &lt;code&gt;progress&lt;/code&gt; 提升不少速度，實際上我們可以拿專案來測試 npm@2 及 npm@3 的速度看看。&lt;/p&gt;</description></item><item><title>如何選擇 Web Framework</title><link>https://blog.wu-boy.com/2016/01/how-to-choose-web-framework/</link><pubDate>Mon, 25 Jan 2016 02:15:46 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/01/how-to-choose-web-framework/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/kazk/198640938" title="framework"&gt;&lt;img src="https://i2.wp.com/farm1.staticflickr.com/68/198640938_ee4b99a683_z.jpg?resize=640%2C480&amp;#038;ssl=1" alt="framework" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;現在各大語言都有很多 web framework 可以選擇，上週整理自己對於 Web Framework 的一些原因及考量，總共整理 12 點，給大家參考看看&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用情境&lt;/li&gt;
&lt;li&gt;軟體架構&lt;/li&gt;
&lt;li&gt;主機部署&lt;/li&gt;
&lt;li&gt;安裝及開發&lt;/li&gt;
&lt;li&gt;學習曲線&lt;/li&gt;
&lt;li&gt;核心功能&lt;/li&gt;
&lt;li&gt;資料庫 ORM&lt;/li&gt;
&lt;li&gt;前端開發&lt;/li&gt;
&lt;li&gt;測試&lt;/li&gt;
&lt;li&gt;文件&lt;/li&gt;
&lt;li&gt;社群活動&lt;/li&gt;
&lt;li&gt;團隊合作&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>OpenSSH 安全性漏洞 CVE-2016-0777 and CVE-2016-0778</title><link>https://blog.wu-boy.com/2016/01/openssh-security-cve-2016-0777-and-cve-2016-0778/</link><pubDate>Fri, 15 Jan 2016 01:26:56 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/01/openssh-security-cve-2016-0777-and-cve-2016-0778/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/23758702793/in/dateposted-public/" title="openssh"&gt;&lt;img src="https://i0.wp.com/farm2.staticflickr.com/1616/23758702793_abebfb7167_o.gif?resize=578%2C191&amp;#038;ssl=1" alt="openssh" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.openssh.com/"&gt;OpenSSH&lt;/a&gt; 今日公佈 Client Bug 漏洞 &lt;a href="http://undeadly.org/cgi?action=article&amp;amp;sid=20160114142733"&gt;CVE-2016-0777 and CVE-2016-0778&lt;/a&gt;，發生原因是 SSH Clinet 跟 Server 溝通時，新功能 &lt;code&gt;roaming&lt;/code&gt; 造成傳輸過程被惡意程式破解，影響的 OpenSSH 版本為 5.4 - 7.1. 大家快看看自己是否為這版本區間。此問題會發生在 SSH Client 而不是 Server 端，所以 Linux &lt;a href="https://www.freebsd.org/"&gt;FreeBSD&lt;/a&gt; 和 &lt;a href="https://zh.wikipedia.org/zh-tw/Mac_OS"&gt;MacOS&lt;/a&gt; 都需要升級 OpenSSH，如果你是在 Windows 用 Putty 則不受影響。&lt;/p&gt;</description></item><item><title>Laravel 搭配 Google, Facebook, Twitter 第三方 OAuth 認證</title><link>https://blog.wu-boy.com/2016/01/laravel-socialite-with-google-facebook-twitter/</link><pubDate>Thu, 14 Jan 2016 14:53:27 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/01/laravel-socialite-with-google-facebook-twitter/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/23493872563/in/dateposted-public/" title="laravel"&gt;&lt;img src="https://i1.wp.com/farm2.staticflickr.com/1655/23493872563_4f01a9c336_o.png?resize=400%2C400&amp;#038;ssl=1" alt="laravel" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://laravel.com/"&gt;Laravel&lt;/a&gt; 提供了 &lt;a href="https://github.com/laravel/socialite"&gt;Socialite&lt;/a&gt; 套件讓開發者可以快速整合 Facebook, Twitter, &lt;a href="https://www.google.com"&gt;Google&lt;/a&gt;, LinkedIn, GitHub and Bitbucket 等第三方服務的登入認證，我挑了大家最常使用的 Facebook, Twitter, Google 來整合，用 Google 跟 Twitter 需要注意一些小細節，首先是 Google 部分，如果大家去 &lt;a href="https://console.developers.google.com"&gt;Developer console&lt;/a&gt; 把 Oauth Callback 寫完，注意的是，這樣是不夠的，要去把 &lt;code&gt;Contacts API&lt;/code&gt; 及 &lt;code&gt;Google+ API&lt;/code&gt; 啟用，才可以真正使用 Google OAuth 認證服務。&lt;/p&gt;</description></item><item><title>Laravel Homestead 搭配 phpMyAdmin Docker</title><link>https://blog.wu-boy.com/2016/01/laravel-homestead-and-phpmyadmin-docker/</link><pubDate>Sat, 02 Jan 2016 08:14:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/01/laravel-homestead-and-phpmyadmin-docker/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/23493872563/in/dateposted-public/" title="laravel"&gt;&lt;img src="https://i1.wp.com/farm2.staticflickr.com/1655/23493872563_4f01a9c336_o.png?resize=400%2C400&amp;#038;ssl=1" alt="laravel" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;相信大家對於 &lt;a href="https://laravel.com/"&gt;Laravel&lt;/a&gt; 推出的 &lt;a href="https://laravel.com/docs/5.1/homestead"&gt;Homestead&lt;/a&gt; 開發環境不陌生，本篇不會教學使用 Homestead，直接看&lt;a href="https://laravel.tw/docs/5.1/homestead"&gt;繁中官網的教學&lt;/a&gt;就可以完成了，Homestead 可以幫助開發者快速架設好 Laravel 環境，當然 Homestead 也適用於 &lt;a href="https://codeigniter.org.tw/"&gt;CodeIgniter&lt;/a&gt; 的開發，因為兩套 Framework 的環境是一樣的，Homestead 開啟 VM 後，會自動將 Local port 對應到 VM port 如下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSH: 2222 → Forwards To 22&lt;/li&gt;
&lt;li&gt;HTTP: 8000 → Forwards To 80&lt;/li&gt;
&lt;li&gt;HTTPS: 44300 → Forwards To 443&lt;/li&gt;
&lt;li&gt;MySQL: 33060 → Forwards To 3306&lt;/li&gt;
&lt;li&gt;Postgres: 54320 → Forwards To 5432&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>快樂學習 Linux 指令懶人包</title><link>https://blog.wu-boy.com/2016/01/simplified-and-community-driven-man-pages/</link><pubDate>Fri, 01 Jan 2016 08:03:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/01/simplified-and-community-driven-man-pages/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/13158675193/" title="github-logo"&gt;&lt;img src="https://i2.wp.com/farm3.staticflickr.com/2238/13158675193_2892abac95.jpg?resize=500%2C198&amp;#038;ssl=1" alt="github-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以前在推廣 Linux 的時候，大家最不喜歡 Command Line 介面，都是被 Windows 慣壞了，相信剛接觸 Linux 最痛苦的就是學習指令，新人學習指令遇到困難，上網發問，一定會看到有人回答說，怎麼不看 man page，但是每個指令的 man page 都非常的長，連我自己看到都直接關掉，何況是剛入門 Linux 的新人。現在 &lt;a href="https://github.com"&gt;Github&lt;/a&gt; 上面有看到這專案 &lt;a href="http://tldr-pages.github.io/"&gt;tldr&lt;/a&gt;，這專案把每個指令文件簡單化，讓剛學習 Linux 的新人可以快速上手，像是底下 &lt;code&gt;find&lt;/code&gt; 指令&lt;/p&gt;</description></item><item><title>免費幫您申請 Letsencrypt 憑證網站</title><link>https://blog.wu-boy.com/2016/01/free-register-letsencrypt-ssl-website/</link><pubDate>Fri, 01 Jan 2016 05:14:11 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2016/01/free-register-letsencrypt-ssl-website/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/23840721545/in/dateposted-public/" title="Letsencrypt"&gt;&lt;img src="https://i1.wp.com/farm6.staticflickr.com/5803/23840721545_e0350b687f.jpg?w=300&amp;#038;ssl=1" alt="Letsencrypt" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;自從 2015/12 &lt;a href="https://letsencrypt.org/"&gt;Letsencrypt&lt;/a&gt; 開放&lt;a href="https://blog.wu-boy.com/2015/12/letsencrypt-entering-public-beta-free-ssl/"&gt;免費申請 SSL 憑證的消息&lt;/a&gt;，馬上有人&lt;a href="https://www.sslforfree.com/"&gt;開發出網站&lt;/a&gt;，讓不會使用 Letsencrypt 指令的網站管理者免費申請憑證，此網站透過開發者提過 FTP 帳號密碼或下載檔案放到 Web 根目錄就可以執行認證成功，完成後會給你 SSL Certificate，這邊有些問題，就是 Private key 也一起給你了，所以用這網站請務必小心，雖然該作者說明，網站不會存下任何憑證資料，但是你相信他嗎？Letsencrypt 討論區有&lt;a href="https://community.letsencrypt.org/t/easiest-way-to-use-lets-encrypt/7633/2"&gt;一篇討論關於此網站&lt;/a&gt;的做法，引起很大的爭議。底下是該網站提供兩種認證方式&lt;/p&gt;</description></item><item><title>TJ 的新作品 frontend boilerplate 前端工具整合</title><link>https://blog.wu-boy.com/2015/12/tj-frontend-boilerplate/</link><pubDate>Thu, 31 Dec 2015 01:26:39 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/12/tj-frontend-boilerplate/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/13158675193/" title="github-logo"&gt;&lt;img src="https://i2.wp.com/farm3.staticflickr.com/2238/13158675193_2892abac95.jpg?resize=500%2C198&amp;#038;ssl=1" alt="github-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今天突然看到 &lt;a href="https://github.com/tj"&gt;TJ&lt;/a&gt; 開了一個新 Repo 是 &lt;a href="https://github.com/tj/frontend-boilerplate"&gt;frontend boilerplate&lt;/a&gt; 嚇到我了，自從 &lt;a href="https://medium.com/@tjholowaychuk/farewell-node-js-4ba9e7f3e52b"&gt;TJ 去年發表要轉向 Go&lt;/a&gt; 之後，就把他自己很多的 Node.js Project 轉給其他人維護，也漸漸沒在 &lt;a href="https://github.com/"&gt;Github&lt;/a&gt; 上面活動，但是今天又看到她整理了一份 frontend boilerplate，內容含了現代流行的前端開發工具，大家可以參考看看，是個不錯的 Template:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://webpack.github.io"&gt;Webpack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://facebook.github.io/react/"&gt;React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rackt/redux"&gt;Redux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://babeljs.io/"&gt;Babel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/postcss/autoprefixer"&gt;Autoprefixer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/postcss/postcss"&gt;PostCSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/outpunk/postcss-modules"&gt;CSS modules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://simplaio.github.io/rucksack/docs"&gt;Rucksack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hot reloading&lt;/li&gt;
&lt;li&gt;Redux router&lt;/li&gt;
&lt;li&gt;Redux effects&lt;/li&gt;
&lt;li&gt;TodoMVC example&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;期待 TJ 能有其他新作品啊。&lt;/p&gt;</description></item><item><title>Docker 下載 Images 遇到 Network timed out</title><link>https://blog.wu-boy.com/2015/12/docker-images-network-timed-out/</link><pubDate>Wed, 30 Dec 2015 15:51:15 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/12/docker-images-network-timed-out/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/22947137613/in/datetaken-public/" title="Docker"&gt;&lt;img src="https://i2.wp.com/farm1.staticflickr.com/778/22947137613_69a88cb94b_z.jpg?resize=640%2C217&amp;#038;ssl=1" alt="Docker" data-recalc-dims="1" /&gt;&lt;/a&gt; 最近在弄 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 忽然發現不管怎麼樣都不能 Pull Images 下來，會噴出底下錯誤訊息&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Unable to find image &amp;lsquo;corbinu/docker-phpmyadmin:latest&amp;rsquo; locally Pulling repository docker.io/corbinu/docker-phpmyadmin Network timed out while trying to connect to &lt;a href="https://index.docker.io/v1/repositories/corbinu/docker-phpmyadmin/images"&gt;https://index.docker.io/v1/repositories/corbinu/docker-phpmyadmin/images&lt;/a&gt;. You may want to check your internet connection or if you are behind a proxy.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Alpine Linux 挑戰最小 docker image OS</title><link>https://blog.wu-boy.com/2015/12/a-super-small-docker-image-based-on-alpine-linux/</link><pubDate>Sun, 27 Dec 2015 01:25:42 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/12/a-super-small-docker-image-based-on-alpine-linux/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/23885045552/in/datetaken-public/" title="Screen Shot 2015-12-27 at 9.17.22 AM"&gt;&lt;img src="https://i1.wp.com/farm2.staticflickr.com/1582/23885045552_eb06df81c8.jpg?resize=500%2C123&amp;#038;ssl=1" alt="Screen Shot 2015-12-27 at 9.17.22 AM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.alpinelinux.org/"&gt;Alpine Linux&lt;/a&gt; 是一套極小安全又簡單的作業系統，在現今 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; Images 裡面，最主要推崇的就是 &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; 作業系統，但是令人詬病的是 Ubuntu 還是不夠小，今天看到 Alpine 在 docker 內的大小大約是 &lt;code&gt;5 MB&lt;/code&gt;，看到這 size 大小，相信是令人很震撼，之前要是看到這 size 大概只有 &lt;a href="https://openwrt.org/"&gt;OpenWRT&lt;/a&gt; 編譯 &lt;a href="https://busybox.net/"&gt;BusyBox&lt;/a&gt; 才有可能的大小，但是 OpenWRT 最主要還是缺乏很多目前 popular 的套件，所以 Alpine 幫你解決這問題，提供大量的 &lt;a href="https://pkgs.alpinelinux.org/packages"&gt;Packages&lt;/a&gt; 讓開發者使用。底下就可以看出 Alpine 擊敗目前盛行的 docker images 大小比較圖。&lt;/p&gt;</description></item><item><title>買了 Apple Magic Trackpad 第一代</title><link>https://blog.wu-boy.com/2015/12/apple-magic-trackpad-and-logitech-k811/</link><pubDate>Sat, 26 Dec 2015 04:06:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/12/apple-magic-trackpad-and-logitech-k811/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/23949490256/in/datetaken-public/" title="P_20151226_113441_HDR.jpg"&gt;&lt;img src="https://i1.wp.com/farm6.staticflickr.com/5634/23949490256_294a956365_z.jpg?resize=640%2C360&amp;#038;ssl=1" alt="P_20151226_113441_HDR.jpg" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;由於 &lt;a href="http://www.apple.com/tw/macbook-pro/"&gt;MacBook Pro&lt;/a&gt; 只有支援兩個 USB 插槽，所以在公司接了一個滑鼠，另一邊接了 &lt;a href="https://www.asus.com/Networking/WL330NUL/"&gt;ASUS WL-330NUL Router&lt;/a&gt;，就沒有多餘的插槽可以外接 USB 鍵盤，後來跟學長 &lt;a href="https://github.com/farrrr/"&gt;@far&lt;/a&gt; 討論結果，學長推薦我買 Apple Magic Trackpad 第一代，目前 &lt;a href="http://www.apple.com/tw/shop/product/MJ2R2TA/A/magic-trackpad-2"&gt;Apple 是推出了第二代&lt;/a&gt;，但是價錢是第一代的兩倍，還是買不起，所以網路上找到一位賣家，價錢還不錯 $1599 元，比 &lt;a href="http://24h.pchome.com.tw/prod/DGAX73-180460620"&gt;PCHOME 還要便宜&lt;/a&gt;，就立馬下單，經過五天終於到貨了，使用起來爽度真的有差，再加上學長寄來給我的 &lt;a href="https://tw.bid.yahoo.com/item/%E3%80%90%E5%B7%9D%E5%8C%AF%E3%80%91%E8%B6%85%E4%BD%8E%E5%83%B9-%E7%BE%85%E6%8A%80Logitech-K811-%E8%97%8D%E7%89%99%E7%82%AB%E5%85%89%E9%8D%B5%E7%9B%A4-M9-100121843723"&gt;Logitech K811 無線鍵盤&lt;/a&gt;，整個爽大大幅上升，產能也大幅提高 XD&lt;/p&gt;</description></item><item><title>小皓滿四個月了喔</title><link>https://blog.wu-boy.com/2015/12/my-baby-born-four-month/</link><pubDate>Thu, 24 Dec 2015 02:48:26 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/12/my-baby-born-four-month/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/23560391409/in/datetaken/" title="1450886275857"&gt;&lt;img src="https://i2.wp.com/farm6.staticflickr.com/5660/23560391409_c06037028d_z.jpg?resize=640%2C480&amp;#038;ssl=1" alt="1450886275857" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;小皓在 12/22 號滿四個月了，時間過好快啊，老師傳了一些小皓在學校上課的情形，上面那張是昨天 12/23 在學校非常開心笑，笑得好燦爛啊，問了老師，老師說原本小皓都只跟隔壁那位小女生笑喔，是老師叫了他，他才轉過來對著老師笑，看到這笑容，什麼事情都不重要了。另外老師還有給其他圖片如下：&lt;/p&gt;</description></item><item><title>新竹中正路美食無菜單料理 – 誠食館 螃蟹大餐</title><link>https://blog.wu-boy.com/2015/12/%E6%96%B0%E7%AB%B9%E4%B8%AD%E6%AD%A3%E8%B7%AF%E7%BE%8E%E9%A3%9F%E7%84%A1%E8%8F%9C%E5%96%AE%E6%96%99%E7%90%86-%E8%AA%A0%E9%A3%9F%E9%A4%A8-%E8%9E%83%E8%9F%B9%E5%A4%A7%E9%A4%90/</link><pubDate>Tue, 22 Dec 2015 14:01:41 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/12/%E6%96%B0%E7%AB%B9%E4%B8%AD%E6%AD%A3%E8%B7%AF%E7%BE%8E%E9%A3%9F%E7%84%A1%E8%8F%9C%E5%96%AE%E6%96%99%E7%90%86-%E8%AA%A0%E9%A3%9F%E9%A4%A8-%E8%9E%83%E8%9F%B9%E5%A4%A7%E9%A4%90/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/23882053765/in/datetaken/" title="DSC06949"&gt;&lt;img src="https://i0.wp.com/farm6.staticflickr.com/5819/23882053765_8cd04873c0.jpg?resize=333%2C500&amp;#038;ssl=1" alt="DSC06949" data-recalc-dims="1" /&gt;&lt;/a&gt; 這個月聚餐跑到新竹一家無菜單料理，無菜單的意思就是老闆隨機出料理啦，只要跟老闆說一人的預算大概多少，幾個人，這樣老闆就可以開始準備料理了，當天我們吃到的就是螃蟹大餐，大家可以看到上面這張圖，我本人抓的這隻是由日本空運過來的喔，想必祂的心情就像是我第一次出國的心情一樣，既興奮又緊張，等一下老闆就會把祂料理成晚上的大餐，可以好幾吃呢。底下來看每一道菜的圖片，我完全不記得菜色名字了，所以大家看看圖欣賞，別留太多口水 ^__^&lt;/p&gt;</description></item><item><title>將 wordpress 強制使用 SSL 連線</title><link>https://blog.wu-boy.com/2015/12/force-https-connection-on-wordpress/</link><pubDate>Sat, 19 Dec 2015 10:03:17 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/12/force-https-connection-on-wordpress/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/23840721545/in/dateposted-public/" title="Letsencrypt"&gt;&lt;img src="https://i1.wp.com/farm6.staticflickr.com/5803/23840721545_e0350b687f.jpg?w=300&amp;#038;ssl=1" alt="Letsencrypt" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;繼上篇介紹 &lt;a href="https://blog.wu-boy.com/2015/12/letsencrypt-entering-public-beta-free-ssl/"&gt;Letsencrypt 開放申請免費 SSL 憑證&lt;/a&gt;，就把我的 Blog 強制使用 https 連線，Wordpress 強制使用 SSL 連線有幾個步驟需要注意，底下會是搭配 Nginx 相關設定，建議如果有裝任何 Plugin，都先進去後台暫時關閉。Nginx 1.9.5 之後有把 &lt;a href="http://nginx.org/en/docs/http/ngx_http_v2_module.html"&gt;http2&lt;/a&gt; 模組加入，所以本篇會是以設定 http2 為主，當然跟 &lt;a href="https://www.chromium.org/spdy/spdy-whitepaper"&gt;spdy&lt;/a&gt; 設定一樣，只是換個名字而已。&lt;/p&gt;</description></item><item><title>Letsencrypt 開放申請免費 SSL 憑證</title><link>https://blog.wu-boy.com/2015/12/letsencrypt-entering-public-beta-free-ssl/</link><pubDate>Sat, 19 Dec 2015 07:03:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/12/letsencrypt-entering-public-beta-free-ssl/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/23840721545/in/dateposted-public/" title="Letsencrypt"&gt;&lt;img src="https://i1.wp.com/farm6.staticflickr.com/5803/23840721545_e0350b687f.jpg?w=300&amp;#038;ssl=1" alt="Letsencrypt" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;很高興在今年 12/03 &lt;a href="https://letsencrypt.org"&gt;Letsencrypt&lt;/a&gt; 宣布進入 &lt;a href="https://letsencrypt.org/2015/12/03/entering-public-beta.html"&gt;public beta 階段&lt;/a&gt;，開放免費 SSL 提供給開發者或正式網站使用，在這之前屬於封測階段，必須透過申請的方式才可以拿到 SSL 憑證。在知道 Letsencrypt 之前，我都是使用免費的 &lt;a href="https://www.startssl.com/"&gt;StartSSL&lt;/a&gt;，這家申請的分式比較複雜，你可以在網路上找到許多&lt;a href="https://www.google.com.tw/webhp?sourceid=chrome-instant&amp;amp;ion=1&amp;amp;espv=2&amp;amp;ie=UTF-8#q=startSSL%20%E6%95%99%E5%AD%B8"&gt;申請教學&lt;/a&gt;，但是就是按部就班操作，就可以拿到一年份的 SSL 憑證，也就是一年申請一次啦，但是 Letsencrypt 申請的方式可以直接透過 command line 快速產生相對應的憑證，支援的 Plugin 也非常多 (像是 &lt;a href="https://httpd.apache.org/"&gt;Apache&lt;/a&gt;, &lt;a href="http://nginx.org/"&gt;Nginx&lt;/a&gt;)，詳細的操作方式可以參考&lt;a href="https://letsencrypt.readthedocs.org/en/latest/"&gt;線上文件&lt;/a&gt;。這邊就不多說了，只要安裝好 Letsencrypt 指令，就可以無痛拿到各網站憑證，在 &lt;a href="https://github.com/"&gt;Github&lt;/a&gt; 上面你可以找到許多別人&lt;a href="https://github.com/search?utf8=%E2%9C%93&amp;amp;q=Letsencrypt"&gt;寫好的 Plugin&lt;/a&gt;，隨便挑一個來使用吧。&lt;/p&gt;</description></item><item><title>小皓學習翻身 (3月20天)</title><link>https://blog.wu-boy.com/2015/12/my-baby-learn-turn-over/</link><pubDate>Thu, 17 Dec 2015 05:30:26 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/12/my-baby-learn-turn-over/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/23631163672/in/datetaken/" title="CIMG6925"&gt;&lt;img src="https://i1.wp.com/farm1.staticflickr.com/730/23631163672_e734ac196a_c.jpg?resize=600%2C800&amp;#038;ssl=1" alt="CIMG6925" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;上週末呢，把客廳桌子搬到電視櫃前面，鋪上瑜珈墊，想說可以開始訓練小皓翻身的動作，一開始讓小皓先趴著，接著會開始向游泳一樣一直踢腳，然後大人拿著照相機猛拍，小皓的眼睛也跟著鏡頭一直轉，就像下圖一樣&lt;/p&gt;</description></item><item><title>在 Debian 7.8 安裝 Gitlab 筆記</title><link>https://blog.wu-boy.com/2015/12/install-gitlab-on-debian-7-8/</link><pubDate>Sat, 12 Dec 2015 09:22:02 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/12/install-gitlab-on-debian-7-8/</guid><description>&lt;img src="https://i2.wp.com/farm4.staticflickr.com/3830/10605193576_54b54e4dfc_n.jpg?w=840&amp;#038;ssl=1" alt="gitlab_logo" data-recalc-dims="1" /&gt;
&lt;p&gt;之前寫過一篇 &lt;a href="http://blog.wu-boy.com/2014/12/easy-to-install-gitlab-quickly/"&gt;GitLab 快速安裝筆記&lt;/a&gt;，但是這次在 Debian 7.8 上安裝起來遇到蠻多問題，故寫此篇來記錄安裝遇到的問題，也會寫到如何搭配 Nginx 設定。GitLab 分兩種版本，一種是 Community Edition packages 另一種是 Enterprise Edition packages，本篇是記錄 Community 版本安裝步驟，可以到&lt;a href="https://about.gitlab.com/downloads/"&gt;下載頁面&lt;/a&gt;選擇您的作業系統，就可以看到安裝方式&lt;/p&gt;</description></item><item><title>PHP 7 vs HHVM Benchmark 比較</title><link>https://blog.wu-boy.com/2015/12/the-definitive-php-7-final-version-hhvm-benchmark/</link><pubDate>Wed, 09 Dec 2015 02:12:01 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/12/the-definitive-php-7-final-version-hhvm-benchmark/</guid><description>&lt;div style="margin: 0 auto;text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6034284842/" title="php-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm7.static.flickr.com/6186/6034284842_351ff33711_m.jpg?resize=240%2C127&amp;#038;ssl=1" alt="php-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;2015-12-03 &lt;a href="http://php.net"&gt;PHP&lt;/a&gt; 終於釋出 &lt;a href="http://php.net/index.php#id2015-12-03-1"&gt;7.0 版本&lt;/a&gt;，&lt;a href="https://kinsta.com"&gt;kinsta&lt;/a&gt; 工程師馬上寫出一篇 &lt;a href="https://kinsta.com/blog/the-definitive-php-7-final-version-hhvm-benchmark/"&gt;PHP7 vs HHVM 效能比較文章&lt;/a&gt;，直接先講結論，就是 HHVM 效能還是大於 PHP 7，所以 kinsta 最終還是採用 &lt;a href="http://hhvm.com/"&gt;HHVM&lt;/a&gt; 來 Host &lt;a href="https://wordpress.com/"&gt;WordPress&lt;/a&gt; 網站，文章內容都是以 CMS 平台做比較，而不是以各大 Framework 來比較，但是看結果來說，&lt;code&gt;HHVM &amp;gt; PHP7 &amp;gt;&amp;gt; PHP 5&lt;/code&gt;，所以建議可以升級到 PHP 7 或者是直接上 HHVM 也可以了。底下是 WordPress benchmark 比較圖。&lt;/p&gt;</description></item><item><title>Docker 救了 Debian SSH terminal</title><link>https://blog.wu-boy.com/2015/12/docker-save-my-ssh-terminal/</link><pubDate>Mon, 07 Dec 2015 02:17:38 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/12/docker-save-my-ssh-terminal/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/22947137613/in/datetaken-public/" title="Docker"&gt;&lt;img src="https://i2.wp.com/farm1.staticflickr.com/778/22947137613_69a88cb94b_z.jpg?resize=640%2C217&amp;#038;ssl=1" alt="Docker" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;上週在處理實體機器時，不小心下了底下指令&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ dpkg --purge --force-all zlib1g&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;造成系統所有相關指令都不能使用，像是 ssh, scp, fetch, wget 等跟網路相關的指令都會出現底下錯誤訊息&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;curl: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;本來想說可以透過指令將檔案抓回來，放回去就可以恢復了，但是所有指令幾乎都不能用，連 &lt;a href="https://git-scm.com/"&gt;git&lt;/a&gt; 也出現該錯誤訊息，這時候最怕 terminal 斷線，如果斷線了，就要到機房去處理問題了。最後想到用 &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; 來處理，簡單幾個步驟就可以將檔案抓回來了&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# 抓 debian images
$ docker pull debian:7
# 進入 docker
$ docker run -t -i debian:7 /bin/bash
# 從 docker 複製檔案到 home 目錄，其中 e1bf3950b16c docker id
$ docker cp e1bf3950b16c:/lib/x86_64-linux-gnu /home/&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;完成後，在去 x86_64-linux-gnu 找到 libz.so.1 丟到相對應目錄就可以了，結論就是：好險平常有裝 docker 習慣 XD&lt;/p&gt;</description></item><item><title>Laravel 50 個小技巧 + Laravel 5.2 新功能</title><link>https://blog.wu-boy.com/2015/12/50-laravel-tricks-and-5-2-new-feature/</link><pubDate>Fri, 04 Dec 2015 15:14:25 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/12/50-laravel-tricks-and-5-2-new-feature/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/23207680879/in/dateposted-public/" title="laravel"&gt;&lt;img src="https://i1.wp.com/farm6.staticflickr.com/5765/23207680879_9c86233e9b.jpg?resize=300%2C300&amp;#038;ssl=1" alt="laravel" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在學習 &lt;a href="http://laravel.tw/"&gt;Laravel&lt;/a&gt; 階段，一定會天天看 &lt;a href="http://laravel.tw/docs/5.1"&gt;Laravel Documentation&lt;/a&gt;，但是有很多小技巧是在文件內沒寫出來的，網路上找到這篇 &lt;a href="https://speakerdeck.com/willroth/50-laravel-tricks-in-50-minutes"&gt;50 Laravel Tricks in 50 Minutes&lt;/a&gt;，寫了 50 個 Laravel 小技巧，包含了 IoC Container, Blade, Eloquent, Middleware, Routing, Commands, Queues, Events, Caching 等模組。&lt;/p&gt;</description></item><item><title>小皓滿三個月了喔</title><link>https://blog.wu-boy.com/2015/12/my-baby-born-three-months/</link><pubDate>Tue, 01 Dec 2015 05:03:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/12/my-baby-born-three-months/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/23329840282/in/datetaken-public/" title="0AE251E8E8E44D15BA81801046F2C3AE"&gt;&lt;img src="https://i0.wp.com/farm6.staticflickr.com/5675/23329840282_69cdbe16cc_z.jpg?resize=640%2C480&amp;#038;ssl=1" alt="0AE251E8E8E44D15BA81801046F2C3AE" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;小皓從出生到現在已經滿三個月了，時間過的好快，底下是上週在家裡，小皓媽媽用嘴巴吹氣讓小皓感覺非常驚恐，小皓的反應真是經典也非常可愛&lt;/p&gt;</description></item><item><title>Laravel Homestead 支援 MySQL 5.7 和 Node 5.0</title><link>https://blog.wu-boy.com/2015/11/laravel-homestead-support-mysql-5-7-and-node-5-0/</link><pubDate>Sat, 14 Nov 2015 06:43:34 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/11/laravel-homestead-support-mysql-5-7-and-node-5-0/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6248708214/" title="Laravel PHP Framework by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm7.static.flickr.com/6038/6248708214_ef1133d0e9_o.png?resize=283%2C101&amp;#038;ssl=1" alt="Laravel PHP Framework" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;昨天半夜看到 &lt;a href="https://laravel-news.com"&gt;Laravel News&lt;/a&gt; 發佈&lt;a href="https://laravel-news.com/2015/11/laravel-homestead-now-with-mysql-5-7-and-node-5-0/"&gt;支援 MySQL 5.7 和 Node 5.0 的消息&lt;/a&gt;，作者已經將 Homestead Vagrant box 更新上最新版了，如果你是用 PHP7 版本，請更新到 0.1.1 (laravel/homestead-7 branch)，如果非用 PHP 5.7 請更新到 0.3.3 版本，此 Box 更新兩個項目，就是支援 &lt;a href="https://www.mysql.com/"&gt;MySQL&lt;/a&gt; 5.7 版本，及 &lt;a href="https://nodejs.org/en/"&gt;NodeJS&lt;/a&gt; 5.0 版本，已經非常新的版號，透過底下指令就可以更新 Local 端的 Box Image:&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ vagrant box update&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;MySQL 5.7 版本支援了 &lt;a href="https://dev.mysql.com/doc/refman/5.7/en/json.html"&gt;JSON Format&lt;/a&gt; 真是太令人振奮了，另外此 Box 也是為了將來要釋出 &lt;a href="https://laravel-news.com/2015/11/laravel-5-2-a-look-at-whats-coming/"&gt;Laravel 5.2&lt;/a&gt; 版本搭配用。最後補上升級後版本截圖&lt;/p&gt;
&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/22583759038/in/datetaken-public/" title="Screen Shot 2015-11-14 at 2.41.31 PM"&gt;&lt;img src="https://i1.wp.com/farm1.staticflickr.com/759/22583759038_e9558fda0c_z.jpg?resize=640%2C178&amp;#038;ssl=1" alt="Screen Shot 2015-11-14 at 2.41.31 PM" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;</description></item><item><title>Git tips 請不要 commit 已經註解的程式碼</title><link>https://blog.wu-boy.com/2015/11/git-tips-don-t-commit-commented-out-code/</link><pubDate>Thu, 05 Nov 2015 06:52:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/11/git-tips-don-t-commit-commented-out-code/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/13158675193/" title="github-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm3.staticflickr.com/2238/13158675193_2892abac95_n.jpg?resize=320%2C127&amp;#038;ssl=1" alt="github-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上週看到一篇國外作者寫的 &lt;a href="https://medium.com/@kentcdodds/please-don-t-commit-commented-out-code-53d0b5b26d5f"&gt;Please, don’t commit commented out code&lt;/a&gt;，裡面內文真的不得不按讚啊，對於每天都要 review code 的開發者來說，最不喜歡看到的就是類似下面的程式碼&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;this.test = function(req, res, next) {
&lt;p&gt;// if (foo) {
// return &amp;lsquo;1&amp;rsquo;;
// } else if (bar) {
// return &amp;lsquo;2&amp;rsquo;;
// }&lt;/p&gt;
&lt;p&gt;return 3;
};
&lt;/pre&gt;&lt;/p&gt;
&lt;/div&gt;</description></item><item><title>PHP-FIG 新網站</title><link>https://blog.wu-boy.com/2015/10/php-fig-new-website/</link><pubDate>Thu, 29 Oct 2015 01:51:36 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/10/php-fig-new-website/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/22559448635/in/datetaken-public/" title="Screen Shot 2015-10-29 at 9.46.27 AM"&gt;&lt;img src="https://i1.wp.com/farm1.staticflickr.com/648/22559448635_09c4a75b88_z.jpg?resize=640%2C184&amp;#038;ssl=1" alt="Screen Shot 2015-10-29 at 9.46.27 AM" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://www.php-fig.org/"&gt;PHP-FIG&lt;/a&gt; 終於通出新網站了，介面比上一版本還要清楚許多，首頁直接清楚列出三大標準參考 AUTOLOADING, INTERFACES, CODING STYLES，網站的 Souce Code 可以在 &lt;a href="https://github.com"&gt;Github&lt;/a&gt; 上面&lt;a href="https://github.com/php-fig/php-fig.github.com"&gt;找到&lt;/a&gt;，目前 FIG 只有釋出 PSR-0, PSR-1, PSR-2, PSR-3, PSR-4, PSR-7，其他有很多部分目前都在 Review 中，詳情可以參考 &lt;a href="http://www.php-fig.org/psr/"&gt;PHP Standards Recommendations&lt;/a&gt;，Coding Style 部分，我建議可以裝 &lt;a href="https://github.com/FriendsOfPHP/PHP-CS-Fixer"&gt;PHP-CS-Fixer&lt;/a&gt; 搭配 SublimText 編輯器就可以自動幫你校正所有 PHP Source Code。新人建議可以先把 &lt;a href="http://www.php-fig.org/psr/psr-2/"&gt;PSR-2&lt;/a&gt; 看完，這樣團隊 Coding Style 才能達到一致性。&lt;/p&gt;</description></item><item><title>Laravel Homestead 支援 PHP 7</title><link>https://blog.wu-boy.com/2015/10/laravel-homestead-support-php-7/</link><pubDate>Mon, 05 Oct 2015 12:34:25 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/10/laravel-homestead-support-php-7/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="//www.flickr.com/photos/appleboy/6248708214/" title="Laravel PHP Framework by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm7.static.flickr.com/6038/6248708214_ef1133d0e9_o.png?resize=283%2C101&amp;#038;ssl=1" alt="Laravel PHP Framework" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;很高興看到 &lt;a href="http://laravel.com"&gt;Laravel&lt;/a&gt; 的 &lt;a href="http://laravel.com/docs/5.1/homestead"&gt;Homestead&lt;/a&gt; 推出 PHP 7 的版本，假如您還在使用 PHP 5.x 的 homestead box，請參考本篇教學，或者是參考&lt;a href="http://laravel.com/docs/5.1/homestead#installation-and-setup"&gt;線上文件&lt;/a&gt;來升級。底下是這次升級的兩個步驟，第一個就是重新下載新的 PHP-7 box 檔案，第二步驟修改 &lt;code&gt;Homestead.yaml&lt;/code&gt;設定檔，請參考如下：&lt;/p&gt;</description></item><item><title>Pingdom 升級支援亞洲區服務</title><link>https://blog.wu-boy.com/2015/10/pingdom-test-servers-in-asia-pacific/</link><pubDate>Sat, 03 Oct 2015 02:49:31 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/10/pingdom-test-servers-in-asia-pacific/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/21910666661/in/datetaken-public/" title="74c50c2938accf866de4cf41fefd3b9c_400x400"&gt;&lt;img src="https://i2.wp.com/farm6.staticflickr.com/5745/21910666661_d37bb6514f_n.jpg?resize=320%2C320&amp;#038;ssl=1" alt="74c50c2938accf866de4cf41fefd3b9c_400x400" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://www.pingdom.com/"&gt;Pingdom&lt;/a&gt; 是一套偵測伺服器是否存在的工具，網站如果出問題掛點，Pingdom 會用 Email 及手機簡訊通知管理者。強大的地方不只這裡，還可以偵測 TCP, DNS, SMTP 只要是網路的 protocol 幾乎都有支援，個人買的是標準方案 (Standard)，之前一直讓我很困擾的是，Pingdom 只有支援美國及歐洲伺服器，所以如果要偵測亞洲區像是新加坡等地方，ping 的 latency 幾乎都飆到 1000 ms 以上，所以變成只能讓客戶看 up time。但是昨天收到 Pingdom 升級全部方案的資訊，令人振奮的是 Pingdom 開始有亞洲區服務，底下是 Standard 升級過後的方案：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;支援選擇 Test 所在地 (原本 Standard 並無此服務)&lt;/li&gt;
&lt;li&gt;支援亞洲區機房 (墨爾本, 雪梨, 香港, 新加坡, or 漢城.)&lt;/li&gt;
&lt;li&gt;可以透過 IPv6 來偵測網站&lt;/li&gt;
&lt;li&gt;提供新版後台服務&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>該如何寫好 git commit message</title><link>https://blog.wu-boy.com/2015/09/how-to-write-git-commit-message/</link><pubDate>Fri, 18 Sep 2015 07:09:49 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/09/how-to-write-git-commit-message/</guid><description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/appleboy/13158675193/" title="github-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm3.staticflickr.com/2238/13158675193_2892abac95_n.jpg?w=840" alt="github-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt; 已經是每天必用的工具，也是團隊間互相合作的重要角色。要寫好 Git commit message，讓團隊成員可以知道每一個 Commit 代表什麼意思，這是非常重要的。網路上看到一篇&lt;a href="http://chris.beams.io/posts/git-commit/"&gt;教您如何寫好 Git commit message&lt;/a&gt;，好的 Commit Log 可以讓其他同事快速知道這個 Pull Request 包含了哪些異動，該作者寫了七點，分別如下&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;將標題與內容中間多一行空白&lt;/li&gt;
&lt;li&gt;標題限制 50 字元&lt;/li&gt;
&lt;li&gt;標題第一個字必須為大寫&lt;/li&gt;
&lt;li&gt;標題最後不要帶上句號&lt;/li&gt;
&lt;li&gt;標題內容可以使用強烈的語氣&lt;/li&gt;
&lt;li&gt;內容請用 72 字元來斷行&lt;/li&gt;
&lt;li&gt;內容可以解釋 what and why vs. how&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;要強制大家有共通的 commit format 其實很難，所以團隊內會使用 issue track 系統，大家把 issue 或 feature 都開好，在標題列裡面就要強制將 issue number 寫入，然後在 issue 那邊把內容及作法詳細寫清楚，方便追蹤，這樣也是可以的。&lt;/p&gt;
&lt;p&gt;PS. 該是強迫自己把 commit log 寫好會比較好，通常在追問題，也時候也會發現自己寫的 Log 不是很清楚。&lt;/p&gt;</description></item><item><title>JavaScript in 2015</title><link>https://blog.wu-boy.com/2015/09/javascript-in-2015/</link><pubDate>Wed, 09 Sep 2015 06:40:41 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/09/javascript-in-2015/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/21271865261/in/datetaken-public/" title="Screen Shot 2015-09-09 at 2.03.34 PM"&gt;&lt;img src="https://i2.wp.com/farm6.staticflickr.com/5834/21271865261_3f445489d7_n.jpg?resize=320%2C195&amp;#038;ssl=1" alt="Screen Shot 2015-09-09 at 2.03.34 PM" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;在這幾年的趨勢看來，&lt;a href="https://developer.mozilla.org/zh-TW/docs/Web/JavaScript"&gt;JavaScript&lt;/a&gt; 已經環繞在各領域了，不管在 Web 前端或後端，上層或下層，都充滿了 JavaScript，其實都是托 &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt; 的福，網路上看到這篇 &lt;a href="http://survivejs.github.io/frontend-in-2015/"&gt;JavaScript in 2015&lt;/a&gt;，裡面講到 JavaScript 所有的工具，不管前端到後端，每一年都有新的工具跟新的 Framework，從以前寫 &lt;a href="http://backbonejs.org/"&gt;Backbone&lt;/a&gt; 到 &lt;a href="https://angularjs.org/"&gt;Angular.js&lt;/a&gt; 到現在 &lt;a href="http://facebook.github.io/react/"&gt;React.js&lt;/a&gt; 改變了整個 JavaScript View 的生態，工具流程整合從 &lt;a href="http://gruntjs.com/"&gt;Grunt.js&lt;/a&gt; 到 &lt;a href="http://gulpjs.com/"&gt;Gulp.js&lt;/a&gt; 的出現，整個生態又轉換了，大家陸續將工具全都轉到 Gulp，最後又出來一套 &lt;a href="https://webpack.github.io/"&gt;Webpack&lt;/a&gt;，Webpack 出現基本上不會影響 gulp 發展，因為 Webpack 還是有很多限制，在前端或後端在上 Production 前的一些流程像是 copy 檔案等，這些是 webpack 無法整合的，看到這些工具一一出現，也不知道明年或現在會不會又跑出一套新的玩具，讓整個 JavaScript 生態整個改變。寫上層的同時，看到同事在寫底層，同事就會跑過來拍拍我肩膀說：『好險我是搞 Kernel，搞上層就要跟你們一樣天天追新技術，永遠沒有停止的一天』。看一下全世界 Job Trends&lt;/p&gt;</description></item><item><title>Laravel Presenter 在 Controller 的使用</title><link>https://blog.wu-boy.com/2015/09/how-to-use-laravel-presenter-in-controller/</link><pubDate>Fri, 04 Sep 2015 01:28:48 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/09/how-to-use-laravel-presenter-in-controller/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6248708214/" title="Laravel PHP Framework by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm7.static.flickr.com/6038/6248708214_ef1133d0e9_o.png?resize=283%2C101&amp;#038;ssl=1" alt="Laravel PHP Framework" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/laravel-auto-presenter/laravel-auto-presenter"&gt;Laravel Auto Presenter&lt;/a&gt; 是一套用在 view 裡的 decorates objects，搭配資料庫時，如果有需要組合或整合欄位來顯示相關資訊，這套就非常適合使用在 &lt;a href="http://laravel.com/"&gt;Laravel&lt;/a&gt; View 裡，如果不是透過 Laravel Auto Presenter，開發者也可以利用 &lt;a href="http://laravel.com/docs/5.1/eloquent-mutators#accessors-and-mutators"&gt;Laravel Accessors &amp;amp; Mutators&lt;/a&gt; 來實現這方法，只是這要寫在 Model 層，寫法如下，此做法寫起來蠻亂的，而且也並不是每個地方都需要擴充這些欄位。&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: php; title: ; notranslate" title=""&gt;/**
 * The accessors to append to the model's array form.
 *
 * @var array
 */
protected $appends = [
 'is_twitter',
];
&lt;p&gt;/**&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get the user&amp;rsquo;s is_twitter flag.&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;@param string $value&lt;/li&gt;
&lt;li&gt;@return string
*/
public function getIsTwitterAttribute()
{
return (bool) ($this-&amp;gt;attributes[&amp;lsquo;options&amp;rsquo;] &amp;amp; self::$OPTIONS[&amp;lsquo;is_twitter&amp;rsquo;]);
}&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description></item><item><title>Facebook React Jest 搭配 Webpack 測試</title><link>https://blog.wu-boy.com/2015/08/facebook-react-jest-with-webpack/</link><pubDate>Tue, 11 Aug 2015 03:31:58 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/08/facebook-react-jest-with-webpack/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/19850322514/in/dateposted-public/" title="logo_og"&gt;&lt;img src="https://i2.wp.com/farm1.staticflickr.com/462/19850322514_1f88fd5d6c_n.jpg?resize=320%2C320&amp;#038;ssl=1" alt="logo_og" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;寫 &lt;a href="http://facebook.github.io/react/"&gt;Facebook React&lt;/a&gt; 就是要搭配 &lt;a href="https://webpack.github.io/"&gt;Webpack&lt;/a&gt;，Webpack 已經是前端開發的必備工具，要測試 React Component 就是要用 Facebook 開發的 &lt;a href="http://facebook.github.io/jest/"&gt;Jest 框架&lt;/a&gt;，使用 Webpack 也許會搭配 &lt;a href="http://lesscss.org/"&gt;Less&lt;/a&gt; or &lt;a href="http://sass-lang.com/"&gt;Sass&lt;/a&gt; Loader 讓每個 component 都可以獨立有 CSS 檔案。要在 JS 內直接引入 CSS 檔案寫法如下&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;import '!style!css!less!./Schedule.less';
import React, { Component } from 'react';&lt;/pre&gt;
&lt;/div&gt;</description></item><item><title>Laravel Homestead 2.1.5 版本將不再刪除舊有資料庫</title><link>https://blog.wu-boy.com/2015/07/homestead-no-longer-drops-databases-on-provision/</link><pubDate>Mon, 27 Jul 2015 01:14:05 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/07/homestead-no-longer-drops-databases-on-provision/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6248708214/" title="Laravel PHP Framework by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm7.static.flickr.com/6038/6248708214_ef1133d0e9_o.png?resize=283%2C101&amp;#038;ssl=1" alt="Laravel PHP Framework" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://laravel.com/docs/master/homestead"&gt;Laravel Homestead&lt;/a&gt; 提供一套虛擬機器，讓開發者可以快速將 Laravel 環境架設起來。在 2.1.5 版本以前，要新增新的 Site 都會透過修改 yaml 設定檔後，直接下 homestead &lt;code&gt;provision&lt;/code&gt; 來重新啟動 VM，問題就來了，此指令會將現有的 Database 全部刪除，重先建立一次，這樣開發者就要重新跑 DB Migration 才有資料。此問題作者聽到了，所以在 &lt;code&gt;2.1.5&lt;/code&gt; 版本作者拿掉 Drop Database 指令，而是透過 CREATE DATABASE IF NOT EXISTS 來取代原有指令 (下面程式碼)，這樣開發者就不用擔心資料會被刪除。當然作者也很貼心，如果開發者想要清除整個資料庫，一樣可以透過指令 homestead &lt;code&gt;destroy&lt;/code&gt; 來將整個 VM 刪除即可。&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: sql; title: ; notranslate" title=""&gt;
// 取代原有 mysql -uhomestead -psecret -e "DROP DATABASE IF EXISTS \`$DB\`";
mysql -uhomestead -psecret -e "CREATE DATABASE IF NOT EXISTS \`$DB\` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci";&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;詳細的資訊可以參考 &lt;a href="http://laravel.com/docs/master/homestead"&gt;official documentation&lt;/a&gt;，或參考最近修改的 &lt;a href="https://github.com/laravel/homestead/commit/f2931d94d9598c330925e3ceb45fccd50c66bcae"&gt;commit 內容&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>git tips 找尋遺失的 commit 紀錄</title><link>https://blog.wu-boy.com/2015/07/undo-git-reset-hard/</link><pubDate>Sat, 04 Jul 2015 11:58:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/07/undo-git-reset-hard/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/13158675193/" title="github-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm3.staticflickr.com/2238/13158675193_2892abac95_n.jpg?w=840&amp;#038;ssl=1" alt="github-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;個人每天常用的常用的三大 Git 指令分別是 &lt;code&gt;git reset&lt;/code&gt;, &lt;code&gt;git pull&lt;/code&gt;, &lt;code&gt;git rebase&lt;/code&gt;，但是呢有時候手殘，常常把 git reset &lt;code&gt;--soft&lt;/code&gt; 打成 git reset &lt;code&gt;--hard&lt;/code&gt; 造成不可預期的錯誤，朋友圈內也有人常常問我該如何救不見的 commit，其實很容易，git 對於每隔操作後產生的 commit 都會存放在 Local 端，所以基本上不用擔心 commit 記錄會不見，有一種狀況會永遠消失，那就是假設尚未 commit 目前修正過的檔案，然後下 git reset &lt;code&gt;--hard&lt;/code&gt; HEAD，這樣的話我想誰都無法幫忙把已修正過的檔案找回來了，原因是連 git 都不知道你改了什麼啊。所以為了避免這情況方生，個人建議開發者，只要開發到一定的階段，務必要下一個 commit 當作記錄，但是你會說，這樣功能開發完後，就會有很多個 commit 非常不好看，這時候可以嘗試 git rebase 將整個功能合併成一個 commit，這樣其他開發者 review 時就會非常清楚。&lt;/p&gt;
&lt;p&gt;現在的問題是如果開發者不小心下了 &lt;code&gt;git reset --hard HEAD^&lt;/code&gt;，上一個 commit 就會消失了，這時候該如何救回來呢？答案可以使用 &lt;code&gt;git reflog&lt;/code&gt; 指令然觀看開發者全部 git 的操作記錄，裡面詳細記載你曾經下過的 git 指令&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git reflog
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;794be8b HEAD@{0}: reset: moving to HEAD^
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5e2be6f HEAD@{1}: commit (amend): update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bfa593c HEAD@{2}: cherry-pick: update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;794be8b HEAD@{3}: reset: moving to 649c658
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;794be8b HEAD@{4}: reset: moving to HEAD^
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;649c658 HEAD@{5}: commit: update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;794be8b HEAD@{6}: commit (initial): addd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;上面可以看到之前 commit 的記錄，接著可以透過 &lt;code&gt;git reset --hard xxxxx&lt;/code&gt;，或者是用 &lt;code&gt;git cherry-pick xxxxx&lt;/code&gt; 將上一個 commit ID 記錄抓回來即可。&lt;/p&gt;</description></item><item><title>Awesome List</title><link>https://blog.wu-boy.com/2015/07/awesome-list/</link><pubDate>Wed, 01 Jul 2015 01:17:28 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/07/awesome-list/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/18778090093" title="logo by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i2.wp.com/c1.staticflickr.com/1/331/18778090093_a7529556e7_n.jpg?resize=320%2C224&amp;#038;ssl=1" alt="logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/sindresorhus"&gt;@sindresorhus&lt;/a&gt; 建立一個強大的專案叫做 &lt;a href="https://github.com/sindresorhus/awesome"&gt;awesome&lt;/a&gt;，裡面收集了各式各樣的 Awesome List，包含 Programming Languages, Front-end Development, Back-end Development 等等，只要可以收集到非常 Awesome 的 Project List，經過大家認證，認為收集此列表非常俱有價值性，而不是把一堆教學文件集合在一起，程式開發者必定參考到這裡面列表。看到有人提出加入 &lt;a href="https://github.com/sindresorhus/awesome/issues/219"&gt;Regular Expression 列表&lt;/a&gt;，&lt;a href="https://github.com/arthurvr"&gt;@arthurvr&lt;/a&gt; 就回覆底下&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That&amp;rsquo;s not what an awesome list should be. It should be a curated list of the best things. Not a &amp;ldquo;collection of everything&amp;rdquo;
原發問者不了解 curated list of the best things，最後 @sindresorhus 拿了 &lt;code&gt;w3schools&lt;/code&gt; 來回答為什麼 &lt;code&gt;w3schools&lt;/code&gt; 總是能在搜尋排行榜第一名&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Because they use sleazy and spammy SEO optimizations to get there.
有夠好笑的，原來大家都是很討厭 &lt;code&gt;w3schools&lt;/code&gt;，難怪會有 &lt;a href="https://chrome.google.com/webstore/detail/w3schools-hider/igiahejkpbnbnekdaefddmdceocmjpll"&gt;W3Schools Hider&lt;/a&gt; 外掛&lt;/p&gt;</description></item><item><title>用一張圖學習 JavaScript</title><link>https://blog.wu-boy.com/2015/06/learning-javascript-in-one-pic/</link><pubDate>Sun, 28 Jun 2015 02:48:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/06/learning-javascript-in-one-pic/</guid><description>&lt;p&gt;&lt;strong&gt;2015.07.03 作者出了 &lt;a href="http://coodict.github.io/javascript-in-one-pic/"&gt;GitHub Page&lt;/a&gt; 線上版&lt;/strong&gt;&lt;/p&gt;
&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/19224697601" title="javascript-logo by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i0.wp.com/c4.staticflickr.com/4/3701/19224697601_6b600f21eb_m.jpg?resize=240%2C240&amp;#038;ssl=1" alt="javascript-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;在 &lt;a href="https://github.com"&gt;GitHub&lt;/a&gt; 上的 &lt;a href="https://github.com/coodict/javascript-in-one-pic"&gt;javascript-in-one-pic&lt;/a&gt; 作者將 &lt;a href="https://developer.mozilla.org/zh-TW/docs/Web/JavaScript"&gt;JavaScript&lt;/a&gt; 一些基本用法整理成 PDF, PNG .. 等版本，讓開發者可以一目了然學習基本 JavaScript 用法，這專案啟動沒多久就一堆人 Star 了，看到作者是參考之前我有參與翻譯的 &lt;a href="http://bonsaiden.github.io/JavaScript-Garden/"&gt;JavaScript Garden&lt;/a&gt; 及 &lt;a href="http://www.amazon.cn/gp/offer-listing/1118026691/"&gt;Professional JavaScript for Web Developers&lt;/a&gt; 這本書，目前尚未全部整理完整，已經整理的目錄如下&lt;/p&gt;</description></item><item><title>簡介 JavaScript ES6 物件及陣列</title><link>https://blog.wu-boy.com/2015/06/getting-started-with-javascript-es6-destructuring/</link><pubDate>Sun, 21 Jun 2015 08:01:30 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/06/getting-started-with-javascript-es6-destructuring/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/16407404782" title="es6-logo by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm8.staticflickr.com/7306/16407404782_8b9c57eab3_m.jpg?resize=240%2C240&amp;#038;ssl=1" alt="es6-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;今年 2015 六月 17 號 &lt;a href="http://www.ecma-international.org/"&gt;Ecma International&lt;/a&gt; 已經同意 &lt;a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm"&gt;ECMA-262 6th edition&lt;/a&gt; 版本，這是在 &lt;a href="http://www.infoq.com/news/2015/06/ecmascript-2015-es6"&gt;ECMAScript 2015 Has Been Approved&lt;/a&gt; 看到的消息，而現在主流就是以 &lt;a href="https://babeljs.io"&gt;Babeljs&lt;/a&gt; 為主，將 ES2015 語法直接轉換成 ES5，讓各大瀏覽器可以繼續支援 ES2015 寫法。今天來介紹 ES2015 內如何使用物件 (Object) 或陣列 (Array)。&lt;/p&gt;</description></item><item><title>優化 Percona XtraDB Cluster for write hotspots</title><link>https://blog.wu-boy.com/2015/06/optimizing-percona-xtradb-cluster-for-write-hotspots/</link><pubDate>Sat, 20 Jun 2015 07:31:46 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/06/optimizing-percona-xtradb-cluster-for-write-hotspots/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/12023069753/" title="percona by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm4.staticflickr.com/3820/12023069753_de60d0c86d_m.jpg?resize=240%2C234&amp;#038;ssl=1" alt="percona" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;在 &lt;a href="https://www.percona.com/blog"&gt;Percona Blog&lt;/a&gt; 上看到這篇 &lt;a href="https://www.percona.com/blog/2015/06/03/optimizing-percona-xtradb-cluster-write-hotspots/"&gt;Optimizing Percona XtraDB Cluster for write hotspots&lt;/a&gt; 優化多重寫入 MySQL 的狀況，舉例來說，要計算 global counter 的時候，就會遇到很頻繁的寫入 (write hotspot)，目前是不能同時寫入資料到同一個 record，會造成 performance 降低，所以大家開始導入 &lt;a href="https://www.percona.com/software/percona-xtradb-cluster"&gt;Percona XtraDB Cluster&lt;/a&gt; 來解決同時間寫入到同一個 record，大家都認為，搞了三台 Percona Server，可以將寫入的動作分散到其他兩台，就不會遇到 Lock 問題，但是實際上根本就不是這樣。&lt;/p&gt;</description></item><item><title>Laravel 5.1 is released</title><link>https://blog.wu-boy.com/2015/06/laravel-5-1-is-released/</link><pubDate>Wed, 10 Jun 2015 01:38:00 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/06/laravel-5-1-is-released/</guid><description>&lt;img src="https://i2.wp.com/d1zj60nuin5mrx.cloudfront.net/media/2015/06/07203934/laravel-5.1-released.png?w=640&amp;#038;ssl=1" alt="" data-recalc-dims="1" /&gt;
&lt;p&gt;很高興昨天收到 &lt;a href="http://laravel.com/"&gt;Laravel&lt;/a&gt; 釋出 5.1 版本，此版本在 Laravel 發展過程中第一個長期支援的版本，底下我們就來看看 Taylor Otwell 作者在此版本釋出有什麼新功能或變化。&lt;/p&gt;</description></item><item><title>Node.js Mocha 延遲測試</title><link>https://blog.wu-boy.com/2015/05/node-js-mocha-delay-testing/</link><pubDate>Fri, 08 May 2015 01:24:30 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/05/node-js-mocha-delay-testing/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://i0.wp.com/blog.wu-boy.com/wp-content/uploads/2015/05/687474703a2f2f662e636c2e6c792f6974656d732f336c316b306e32413155334d3149314c323130702f53637265656e25323053686f74253230323031322d30322d32342532306174253230322e32312e3433253230504d2e706e67.png"&gt;&lt;img src="https://i0.wp.com/blog.wu-boy.com/wp-content/uploads/2015/05/687474703a2f2f662e636c2e6c792f6974656d732f336c316b306e32413155334d3149314c323130702f53637265656e25323053686f74253230323031322d30322d32342532306174253230322e32312e3433253230504d2e706e67-300x134.png?resize=300%2C134" alt="687474703a2f2f662e636c2e6c792f6974656d732f336c316b306e32413155334d3149314c323130702f53637265656e25323053686f74253230323031322d30322d32342532306174253230322e32312e3433253230504d2e706e67" class="aligncenter size-medium wp-image-5729" srcset="https://i0.wp.com/blog.wu-boy.com/wp-content/uploads/2015/05/687474703a2f2f662e636c2e6c792f6974656d732f336c316b306e32413155334d3149314c323130702f53637265656e25323053686f74253230323031322d30322d32342532306174253230322e32312e3433253230504d2e706e67.png?resize=300%2C134&amp;ssl=1 300w, https://i0.wp.com/blog.wu-boy.com/wp-content/uploads/2015/05/687474703a2f2f662e636c2e6c792f6974656d732f336c316b306e32413155334d3149314c323130702f53637265656e25323053686f74253230323031322d30322d32342532306174253230322e32312e3433253230504d2e706e67.png?w=500&amp;ssl=1 500w" sizes="(max-width: 300px) 85vw, 300px" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;如果大家有在寫 &lt;a href="http://expressjs.com/"&gt;Node.js Express Framework&lt;/a&gt;，一定對 &lt;a href="http://mochajs.org/"&gt;Mocha&lt;/a&gt; Unit Testing 不陌生，&lt;code&gt;各位工程師不要太相信自己寫的程式碼&lt;/code&gt;，產品上線前，務必要把 Unit Test 寫完整，如果是要 Code Refactor，那測試的重要性更是大。網站架構越來越大，功能越來越多，每寫一個新功能，都會產生 side effect，造成其他程式或邏輯出錯，這時候就需要 Unit Test 來驗證邏輯的正確性。使用 Express 寫 API 我個人會建議使用 &lt;a href="https://github.com/visionmedia/supertest"&gt;Supertest&lt;/a&gt; + &lt;a href="https://github.com/tj/should.js/"&gt;Should.js&lt;/a&gt; 來驗證後端程式碼即可，這幾套框架都是由 &lt;a href="https://github.com/tj"&gt;TJ Holowaychuk&lt;/a&gt; 完成。使用 supertest 也可以讓 express 不用 listen port 就可以測試。&lt;/p&gt;</description></item><item><title>Mac iTerm2 + tmux 搭配 Mouse mode</title><link>https://blog.wu-boy.com/2015/05/mac-iterm2-tmux-with-mouse-mode/</link><pubDate>Sat, 02 May 2015 02:56:00 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/05/mac-iterm2-tmux-with-mouse-mode/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/17151857929" title="Screen Shot 2015-05-02 at 10.17.10 AM by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm8.staticflickr.com/7708/17151857929_cd5bd6c97b_z.jpg?resize=640%2C368&amp;#038;ssl=1" alt="Screen Shot 2015-05-02 at 10.17.10 AM" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在 Mac 上必裝 &lt;a href="http://iterm2.com/"&gt;iTerm2&lt;/a&gt; 終端機軟體搭配 copy mode 相當好用，只要用滑鼠選擇了一段文字，系統就會自動幫忙 copy，接著在任何地方就可以直接使用 &lt;code&gt;command + v&lt;/code&gt; 貼上，如果要多視窗操作，可以安裝 &lt;a href="http://tmux.sourceforge.net/"&gt;tmux&lt;/a&gt; 多視窗軟體，如果使用了 tmux 你會發現滾輪滑鼠無法使用了，也就是看不到執行過的畫面跟指令，這時候就要調整 tmux 設定檔，補上 &lt;a href="https://github.com/appleboy/dotfiles/blob/master/.tmux.conf#L77-L82"&gt;Mouse mode 設定檔&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Git Flow and JavaScript Coding Style</title><link>https://blog.wu-boy.com/2015/04/git-flow-and-javascript-coding-style/</link><pubDate>Sat, 11 Apr 2015 15:05:34 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/04/git-flow-and-javascript-coding-style/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/13158675193/" title="github-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm3.staticflickr.com/2238/13158675193_2892abac95_n.jpg?resize=320%2C127&amp;#038;ssl=1" alt="github-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; 已經是每日必備使用的指令，在平常工作上常常使用到 &lt;a href="http://git-scm.com/docs/git-rebase"&gt;git rebase&lt;/a&gt; 或 &lt;a href="http://git-scm.com/docs/git-merge"&gt;git merge&lt;/a&gt;，發現很多工程師不知道什麼時候該用 rebase 什麼時候該用 merge，所以做了底下投影片來清楚描述 git rebase 及 merge 的優缺點及使用時機。&lt;/p&gt;</description></item><item><title>CodeIgniter 3.0 Release 終於釋出啦</title><link>https://blog.wu-boy.com/2015/04/codeigniter-3-0-release/</link><pubDate>Wed, 01 Apr 2015 08:58:17 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/04/codeigniter-3-0-release/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;p&gt;從 2.2.x 版本到現在的 3.0 Release，終於等到釋出大家所期待的 3.0，此版本跟 2.2.x 版本差距極大，修正很多 bugs 重構很多程式碼，&lt;a href="http://forum.codeigniter.com/thread-1657.html"&gt;官網列出底下重大修正&lt;/a&gt;，要嘗鮮的請&lt;a href="http://codeigniter.org.tw/downloads/file/CodeIgniter_3.0.0"&gt;直接下載&lt;/a&gt;吧&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CodeIgniter 使用 MIT 版權宣告&lt;/li&gt;
&lt;li&gt;重構各種 Database Driver library&lt;/li&gt;
&lt;li&gt;支援 PDO 所有函數&lt;/li&gt;
&lt;li&gt;重新撰寫 Session Library，支援 Native Session&lt;/li&gt;
&lt;li&gt;重新撰寫 Encryption library&lt;/li&gt;
&lt;li&gt;已加強單元測試部分，以及改善程式碼覆蓋率&lt;/li&gt;
&lt;li&gt;官方建議使用 PHP 5.4 或更新版本，但是官方仍繼續支援 PHP 5.2.4&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;詳細資料，可以參考官方的 &lt;a href="http://www.codeigniter.org.tw/userguide3/changelog.html"&gt;ChangeLog&lt;/a&gt;，如果要升級 CodeIgniter 2 到 3，請詳細參考&lt;a href="http://www.codeigniter.org.tw/userguide3/installation/upgrade_300.html"&gt;升級文件&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;ＰＳ：&lt;a href="http://codeigniter.org.tw/"&gt;台灣官網&lt;/a&gt;部分近期內會修正&lt;/p&gt;</description></item><item><title>Amazon 推出無限儲存空間方案 一年只要 60 美元</title><link>https://blog.wu-boy.com/2015/03/amazon-unlimited-everything-cloud-storage/</link><pubDate>Sat, 28 Mar 2015 01:20:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/03/amazon-unlimited-everything-cloud-storage/</guid><description>&lt;p&gt;在 &lt;a href="http://www.wired.com/"&gt;Wird&lt;/a&gt; 網站上看到這篇 &lt;a href="http://www.wired.com/2015/03/amazon-unlimited-everything-cloud-storage/"&gt;Amazon’s New Unlimited Cloud Storage Is Absurdly Cheap&lt;/a&gt;，也就是說 &lt;a href="http://www.amazon.com/"&gt;Amazon&lt;/a&gt; 正式加入儲存空間競爭者，在儲存空間方案來說 Amazon 推出一年只要 $60 美金就可以&lt;code&gt;無限制儲存任何檔案&lt;/code&gt;，這消息實在是太驚豔了，過去各大公司不曾有這樣的服務啊，像是 &lt;a href="https://google.com"&gt;Google&lt;/a&gt; 每年 $120 美金只有 1 TB 儲存空間，&lt;a href="https://www.dropbox.com/"&gt;Dropbox&lt;/a&gt; 一年 $100 也是只有 1 TB 封頂，而 &lt;a href="https://www.icloud.com/"&gt;iCloud&lt;/a&gt; 也是需要 $240 美金，從來都沒有人推過一年只要 $60 美金然後無限制空間啊，這真的是好殺啊，底下來看看 &lt;a href="https://www.amazon.com/clouddrive/pricing"&gt;Amazon 推出的這兩個方案&lt;/a&gt;&lt;/p&gt;
&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/16762870130" title="Amazon Cloud Drive by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm8.staticflickr.com/7606/16762870130_3e4841be45_z.jpg?resize=640%2C379&amp;#038;ssl=1" alt="Amazon Cloud Drive" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;</description></item><item><title>Ruby Deploy With Capistrano 碰到 SSH Connection Closed</title><link>https://blog.wu-boy.com/2015/03/ruby-deploy-with-capistrano-ssh-connection-closed/</link><pubDate>Wed, 18 Mar 2015 04:25:53 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/03/ruby-deploy-with-capistrano-ssh-connection-closed/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/13256445484/" title="CapistranoLogo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm4.staticflickr.com/3756/13256445484_d0ca222f48.jpg?resize=500%2C125&amp;#038;ssl=1" alt="CapistranoLogo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;在 &lt;a href="https://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; 開發環境最常用的 Deploy 工具就是 &lt;a href="https://github.com/capistrano/capistrano"&gt;Capistrano&lt;/a&gt;，讓開發者可以快速部署程式碼，在部署進行中，由於大量的 js 及 css 需要處理，所以花最長的時間就是 &lt;code&gt;assets:precompile&lt;/code&gt;，執行 &lt;code&gt;cap deploy&lt;/code&gt; 就會發現卡在底下錯誤訊息&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;** [whenever:update_crontab] exception while rolling back: Net::SSH::Disconnect, connection closed by remote host *** [deploy:update_code] rolling back * executing &amp;ldquo;rm -rf /home/deploy/nami/releases/20150317135422; true&amp;rdquo; servers: [&amp;ldquo;xxxxx.tw&amp;rdquo;] ** [deploy:update_code] exception while rolling back: Net::SSH::Disconnect, connection closed by remote host&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>透過 https 下載套件，取代 git protocol</title><link>https://blog.wu-boy.com/2015/03/replace-git-with-https-protocol-for-bower/</link><pubDate>Sat, 14 Mar 2015 08:39:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/03/replace-git-with-https-protocol-for-bower/</guid><description>&lt;p&gt;&lt;a href="https://i0.wp.com/farm9.staticflickr.com/8523/8455538800_30f65954f8.jpg?ssl=1"&gt;&lt;img src="https://i0.wp.com/farm9.staticflickr.com/8523/8455538800_30f65954f8.jpg?w=840&amp;#038;ssl=1" alt="" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;現在前端套件幾乎都會透過 &lt;a href="http://bower.io/"&gt;Bower&lt;/a&gt; 來下載，而 Bower 預設使用 git protocol 來下載原始檔案，如果遇到 timeout 逾時，也就是無法透過 &lt;code&gt;git://&lt;/code&gt; 方式，就必須要切換成 &lt;code&gt;https://&lt;/code&gt; 下載，蠻多人遇到此問題，網路上找到這篇 &lt;a href="https://github.com/angular/angular-phonecat/issues/141"&gt;bower install - github.com connection timed out&lt;/a&gt; 解答。在 Console 視窗噴出底下錯誤訊息，就請改用 https 方式。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Additional error details: fatal: unable to connect to github.com: github.com[0: 192.30.252.130]: errno=Connection timed out
切換方式很容易，請在 Console 鍵入底下指令&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git config --global url.&lt;span style="color:#cd5555"&gt;&amp;#34;https://&amp;#34;&lt;/span&gt;.insteadOf git://
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;遇到 &lt;code&gt;bower install&lt;/code&gt; 卡卡的也可以用這招 ＸＤ&lt;/p&gt;</description></item><item><title>6to5 JavaScript Transpiler 重新命名為 Babel</title><link>https://blog.wu-boy.com/2015/02/the-6to5-javascript-transpiler-has-renamed-to-babel/</link><pubDate>Sun, 22 Feb 2015 11:55:09 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/02/the-6to5-javascript-transpiler-has-renamed-to-babel/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/16407404782" title="es6-logo by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm8.staticflickr.com/7306/16407404782_8b9c57eab3_m.jpg?resize=240%2C240&amp;#038;ssl=1" alt="es6-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;先前寫了一篇 &lt;a href="http://blog.wu-boy.com/2015/01/replace-coffeescript-with-es6/"&gt;CoffeeScript 轉 ES6&lt;/a&gt;，裡面有提到 &lt;a href="http://babeljs.io"&gt;6to5 專案&lt;/a&gt;，此專案幫助開發者可以直接寫 JavaScript ECMAScript 6，該專案則會將 ES6 轉成 ES5，但是目前瀏覽器對於 ES6 的支援度還沒有很高，可以直接參考 &lt;a href="http://kangax.github.io/compat-table/es6/"&gt;ECMAScript 6 compatibility table&lt;/a&gt;，但是看到專案名稱 6to5，就會覺得如果之後 ES7 出來，不就要多開一個 7to6 專案，果然官方在 &lt;a href="http://babeljs.io/blog/2015/02/15/not-born-to-die/"&gt;Blog 宣佈將名稱正式轉為 Babeljs&lt;/a&gt;。&lt;a href="http://babeljs.io"&gt;Babel&lt;/a&gt; 也會持續使用最新 JavaScript Standard 開發 JavaScript transpiler 相關工具，讓各種平台程式都可以使用。&lt;/p&gt;
&lt;p&gt;現在就可以透過 Babel 來開發 ES6&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ npm install --global babel&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;ES6 轉 ES5&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ babel script.js&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;一些來自 &lt;a href="https://www.mozilla.org/en-US/"&gt;Mozilla&lt;/a&gt;, &lt;a href="http://esprima.org/"&gt;Esprima&lt;/a&gt;, &lt;a href="https://jquery.org/"&gt;jQuery Foundation&lt;/a&gt;, Acorn, 6to5, ESLint 組織成員，也合力開了 &lt;a href="https://github.com/estree/estree"&gt;ESTree&lt;/a&gt;，而 Babel 以 ESTree 為基底來開發相關 Tool，所以最新的 Standard 也可以直接參考 ESTree。&lt;/p&gt;</description></item><item><title>您不可不知的 io.js</title><link>https://blog.wu-boy.com/2015/02/getting-to-know-io-js/</link><pubDate>Wed, 11 Feb 2015 06:05:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/02/getting-to-know-io-js/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/15859123853" title="9950313 by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm8.staticflickr.com/7401/15859123853_d945160802_o.png?resize=200%2C200&amp;#038;ssl=1" alt="9950313" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://iojs.org/"&gt;io.js&lt;/a&gt; 至今已經成立了快三個月，目前也快速推出到 1.2.0 版本了，相信很多人都不太知道為什麼會多一個 io.js 組織，這組織是 fork 自 &lt;a href="https://github.com/joyent/node"&gt;Joyent&amp;rsquo;s Node.js&lt;/a&gt; 相容於 &lt;a href="https://www.npmjs.com/"&gt;npm&lt;/a&gt; 原始平台。&lt;/p&gt;</description></item><item><title>成立 iojs 台灣群組</title><link>https://blog.wu-boy.com/2015/02/iojs-tw-organization/</link><pubDate>Mon, 09 Feb 2015 03:55:20 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/02/iojs-tw-organization/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/15859123853" title="9950313 by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm8.staticflickr.com/7401/15859123853_d945160802_o.png?resize=200%2C200&amp;#038;ssl=1" alt="9950313" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;昨天在 &lt;a href="https://www.facebook.com/groups/node.js.tw/"&gt;node.js 台灣群組&lt;/a&gt;討論&lt;a href="https://www.facebook.com/gniyop/posts/446564002165486"&gt;對岸已經成立 iojs-cn&lt;/a&gt;，不多說我們也請官方幫忙成立了 &lt;a href="https://github.com/iojs/iojs-tw"&gt;iojs-tw&lt;/a&gt;，目前的工作只有兩項，就是負責將[ iojs 官網]翻譯成中文，這部份 &lt;a href="https://github.com/cfsghost"&gt;@cfsghost&lt;/a&gt; 已經&lt;a href="https://github.com/iojs/website/pull/135"&gt;送 PR 給官方了&lt;/a&gt;，另外就是翻譯官方的 &lt;a href="https://medium.com/@iojs"&gt;Weekly Notes&lt;/a&gt;，iojs 每週五都會發布一篇 iojs 的最新動態，我們就是負責將其中文化，上週五已經翻譯好了請參考如下:&lt;/p&gt;</description></item><item><title>Laravel 5 PHP Framework 釋出</title><link>https://blog.wu-boy.com/2015/02/laravel-5-php-framework-release/</link><pubDate>Fri, 06 Feb 2015 05:44:45 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/02/laravel-5-php-framework-release/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6248708214/" title="Laravel PHP Framework by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm7.static.flickr.com/6038/6248708214_ef1133d0e9_o.png?resize=283%2C101&amp;#038;ssl=1" alt="Laravel PHP Framework" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;很開心看到 &lt;a href="http://laravel.com/"&gt;Laravel&lt;/a&gt; 作者 &lt;a href="https://twitter.com/taylorotwell"&gt;Taylor Otwell&lt;/a&gt; 能在年前公開 &lt;a href="https://laravel-news.com/2015/02/laravel-5-released/"&gt;Laravel 5 is Released!&lt;/a&gt;，這次連官網也順道一起改版了，經過幾天努力，&lt;a href="https://github.com/laravel-taiwan"&gt;Laravel Taiwan&lt;/a&gt; 也將&lt;a href="http://laravel.tw/"&gt;官網&lt;/a&gt;換成新的了，這次 Laravel 5 共釋出 22 個新功能，前端部份也導入新功能叫做 &lt;a href="http://laravel.tw/docs/5.0/elixir"&gt;Elixir&lt;/a&gt;，另外也將 &lt;a href="https://laravel-news.com/2014/11/laravel-5-scheduler/"&gt;Scheduler&lt;/a&gt; 納入主功能了，非常開心能看到作者開發了好多新功能。由於 Laravel 5 出來了，那接下來就是要翻譯新的文件，請大家可以到 &lt;a href="https://laraveltw.hackpad.com/Laravel-5.0--9EiCuRgA2Qg"&gt;Hackpad&lt;/a&gt; 登記翻譯，翻譯完成後送 PR 到 &lt;a href="https://github.com/laravel-taiwan/docs"&gt;Laravel Taiwan documentation Repo&lt;/a&gt;，基本上翻譯過 4.2 版本，把差異性部份補上即可。&lt;/p&gt;
&lt;p&gt;Laravel 5 新功能可以直接到 &lt;a href="https://laracasts.com/"&gt;Laracasts&lt;/a&gt; 看 &lt;a href="https://laracasts.com/series/laravel-5-fundamentals"&gt;laravel 5 Fundamentals&lt;/a&gt; 教學影音。&lt;/p&gt;</description></item><item><title>CoffeeScript 轉 ES6</title><link>https://blog.wu-boy.com/2015/01/replace-coffeescript-with-es6/</link><pubDate>Sat, 31 Jan 2015 08:53:29 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/01/replace-coffeescript-with-es6/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/16407404782" title="es6-logo by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm8.staticflickr.com/7306/16407404782_8b9c57eab3_m.jpg?resize=240%2C240&amp;#038;ssl=1" alt="es6-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;h1 id="開始嘗試-es6"&gt;開始嘗試 ES6&lt;/h1&gt;
&lt;p&gt;最近有時會看看 &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/New_in_JavaScript/ECMAScript_6_support_in_Mozilla"&gt;JavaScript ECMAScript 6&lt;/a&gt; 的相關文件，今年也是時候將新專案用 ES6 來撰寫，在還沒使用 ES6 以前，我個人比較偏好使用 &lt;a href="http://coffeescript.org/"&gt;CoffeeScript&lt;/a&gt; 或 &lt;a href="http://livescript.net/"&gt;LiveScript&lt;/a&gt;，如果嚐試過 CoffeeScript 後，你會發現轉換成 ES6 是相當容易。網路上可以直接看 &lt;a href="https://6to5.org"&gt;6to5&lt;/a&gt; 專案，提供 &lt;a href="https://github.com/sstephenson/sprockets"&gt;Sprockets&lt;/a&gt;, &lt;a href="https://github.com/broccolijs/broccoli"&gt;Broccoli&lt;/a&gt;, &lt;a href="http://browserify.org/"&gt;Browserify&lt;/a&gt;, &lt;a href="http://gruntjs.com/"&gt;Grunt&lt;/a&gt;, &lt;a href="http://gulpjs.com/"&gt;Gulp&lt;/a&gt;, &lt;a href="http://webpack.github.io/"&gt;Webpack&lt;/a&gt; ..等，要嘗試 ES6 語法轉成 Javascript 可以透過 &lt;a href="https://6to5.org/repl"&gt;ES6 repl&lt;/a&gt; 介面來嘗鮮。&lt;/p&gt;</description></item><item><title>Debian 7.x Install PHP 5.5 或 5.6 版本</title><link>https://blog.wu-boy.com/2015/01/install-php-5-6-or-5-5-on-debian/</link><pubDate>Tue, 20 Jan 2015 05:06:10 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2015/01/install-php-5-6-or-5-5-on-debian/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/15703430593" title="screen by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm8.staticflickr.com/7487/15703430593_ffa1a49a44.jpg?resize=500%2C305&amp;#038;ssl=1" alt="screen" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://www.debian.org/"&gt;Debian&lt;/a&gt; 目前預設的 &lt;a href="http://php.net/"&gt;PHP&lt;/a&gt; Stable 版本是 5.4.x，由於 Laravel PHP Framework 關係，所以希望升級到 PHP 5.5 或 5.6 版本，只要透過底下操作就可以直接裝 PHP 5.6 版本了&lt;/p&gt;</description></item><item><title>GitLab 快速安裝</title><link>https://blog.wu-boy.com/2014/12/easy-to-install-gitlab-quickly/</link><pubDate>Wed, 24 Dec 2014 08:12:25 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/12/easy-to-install-gitlab-quickly/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/10605193576/" title="gitlab_logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm4.staticflickr.com/3830/10605193576_54b54e4dfc_n.jpg?resize=320%2C206&amp;#038;ssl=1" alt="gitlab_logo" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最近想安裝新版的 &lt;a href="https://about.gitlab.com/"&gt;GitLab&lt;/a&gt;，竟然發現 GitLab 推出&lt;a href="https://about.gitlab.com/downloads/"&gt;快速懶人包&lt;/a&gt;，終於可以不用打很多指令來安裝了，大幅降低了安裝困難度，目前支援 &lt;a href="http://nginx.org/"&gt;CentOS&lt;/a&gt;, &lt;a href="http://www.ubuntu.com/"&gt;Ubutnu&lt;/a&gt;, &lt;a href="https://www.debian.org/"&gt;Debian&lt;/a&gt; 等安裝包，GitLab 各版本也可以從&lt;a href="https://about.gitlab.com/downloads/archives/"&gt;這邊列表&lt;/a&gt;找到，另外安裝前請確保你的硬體環境是符合 &lt;a href="http://doc.gitlab.com/ce/install/requirements.html"&gt;GitLab 所要求&lt;/a&gt;，來看看有沒有這麼簡單安裝。&lt;/p&gt;</description></item><item><title>Parse 支援台灣繁體中文文件</title><link>https://blog.wu-boy.com/2014/12/parse-support-chinese-language-document/</link><pubDate>Fri, 12 Dec 2014 03:48:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/12/parse-support-chinese-language-document/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/15814445538" title="parse-logo by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm8.staticflickr.com/7504/15814445538_514a8c737e_n.jpg?resize=320%2C128&amp;#038;ssl=1" alt="parse-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://parse.com/"&gt;Parse&lt;/a&gt; 月初宣佈將支援簡體、繁體、日文、韓文等語系的文件，為什麼&lt;a href="http://blog.parse.com/2014/12/01/parsing-all-over-the-globe/"&gt;宣佈此消息&lt;/a&gt;呢？其實原因最大就是在 Parse 內部統計，全世界亞洲區的流量成長率高達 90 ％，加上全球 15 個最大用戶內，亞洲區就佔了六個 India, Japan, Australia, China, Taiwan, Korea。沒看錯，台灣也是榜上有名。雖然不知道台灣有哪些網站用到了 Parse，我自己最主要用 Parse 的原因就是 Push Notification，公司就不用架設兩套伺服器 &lt;a href="https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html"&gt;Apple&lt;/a&gt; 或 &lt;a href="https://developer.android.com/google/gcm/server.html"&gt;Google GCM&lt;/a&gt;。Parse 提供了 &lt;a href="https://www.parse.com/docs/tw/js_guide"&gt;JavaScript&lt;/a&gt;, &lt;a href="https://github.com/parseplatform/parse-php-sdk"&gt;PHP SDK&lt;/a&gt;, .NET SDK 等。台灣開發者可以直接線上看&lt;a href="https://www.parse.com/docs/tw"&gt;繁體中文文件&lt;/a&gt;了。&lt;/p&gt;</description></item><item><title>解決在 Ubuntu 系統下 Chrome 瀏覽器亂碼</title><link>https://blog.wu-boy.com/2014/12/chrome-unreadable-character-on-ubuntu/</link><pubDate>Wed, 10 Dec 2014 14:58:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/12/chrome-unreadable-character-on-ubuntu/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/15964998676" title="Screenshot from 2014-12-10 22:15:27 by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm9.staticflickr.com/8629/15964998676_ff1bda70b2_z.jpg?resize=640%2C360&amp;#038;ssl=1" alt="Screenshot from 2014-12-10 22:15:27" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;在 &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; 用 &lt;a href="https://www.google.com.tw/chrome/browser/desktop/index.html"&gt;Chrome&lt;/a&gt; 瀏覽器一陣子後，突然發現全部的中文介面都變成亂碼，就像上面這張截圖一樣，除了網頁可以正常顯示外，其他像是 Tab 或書籤都變成亂碼，在百度找到&lt;a href="http://tieba.baidu.com/p/2830235916"&gt;這篇解答&lt;/a&gt;，解決方式很容易，但是就是不知道原因為什麼這樣改就可以，底下紀錄如何解決此問題。&lt;/p&gt;</description></item><item><title>加速 PHP Composer 執行效率</title><link>https://blog.wu-boy.com/2014/12/optimizing-php-composer-performance/</link><pubDate>Wed, 03 Dec 2014 05:33:54 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/12/optimizing-php-composer-performance/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/15747689648" title="logo-composer-transparent by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm9.staticflickr.com/8658/15747689648_a4e7ccfca9_m.jpg?resize=202%2C240&amp;#038;ssl=1" alt="logo-composer-transparent" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;早上剛起床就看到 &lt;a href="https://blog.gslin.org"&gt;DK&lt;/a&gt; 發表一篇&lt;a href="https://blog.gslin.org/archives/2014/12/02/5383/%E5%A2%9E%E5%8A%A0%E4%B8%80%E8%A1%8C%E7%A8%8B%E5%BC%8F%E7%A2%BC%E8%AE%93-php-composer-%E6%95%88%E7%8E%87%E7%88%86%E5%A2%9E/"&gt;增加一行程式碼讓 PHP Composer 效率爆增&lt;/a&gt;，&lt;a href="https://getcomposer.org/"&gt;Composer&lt;/a&gt; 是 PHP 套件管理工具，現在各大 Framework 都用 Composer 管理套件相依性，但是最讓人擔憂的是，每次執行 &lt;code&gt;composer install&lt;/code&gt; 或 update 的時候，機器就會開始哀號，然後等了很久指令才執行完成。今天看到 &lt;a href="http://github.com"&gt;Github&lt;/a&gt; 上 Composer 為了改善執行效率及時間&lt;a href="https://github.com/composer/composer/commit/ac676f47f7bbc619678a29deae097b6b0710b799"&gt;就把 gc disabled&lt;/a&gt;。這 commit 引發了很多人迴響，超多搞笑留言圖片。底下有兩種方式可以加速 Composer 執行效率&lt;/p&gt;</description></item><item><title>CodeIgniter 搭配 Homestead 開發環境</title><link>https://blog.wu-boy.com/2014/12/codeigniter-with-homestead-development/</link><pubDate>Mon, 01 Dec 2014 08:18:54 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/12/codeigniter-with-homestead-development/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://laravel.tw/docs/4.2/homestead"&gt;Homestead&lt;/a&gt; 為 &lt;a href="http://laravel.tw"&gt;Laravel Framework&lt;/a&gt; 所提供出來的懶人安裝環境，大幅降低學習 Laravel 的門檻，大家都知道初學一套 Framework 最重要的是快速寫出 Hello world，如果初學者卡在環境都架設不來，那就更加不用接著學習 MVC 架構了，所以 Laravel 提供了 Homestead，不管你是用 Linux 或 Windows 都可以快速的把開發環境架設起來。相信很多人也從 &lt;a href="http://codeigniter.org.tw/"&gt;CodeIgniter&lt;/a&gt; 跳往 Laravel 框架了，但是舊的網站還是要維護阿，所以這次透過 Laravel Homestead 一起來把 CodeIgniter 開發環境無痛架設起來，省去新人安裝 &lt;a href="http://nginx.org/"&gt;Nginx&lt;/a&gt; + &lt;a href="http://php.net/"&gt;PHP&lt;/a&gt; + &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt; 的時間。&lt;/p&gt;</description></item><item><title>Laravel Homestead 2.0 介紹</title><link>https://blog.wu-boy.com/2014/11/introduction-to-laravel-homestead-2-0/</link><pubDate>Mon, 24 Nov 2014 04:22:29 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/11/introduction-to-laravel-homestead-2-0/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6248708214/" title="Laravel PHP Framework by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm7.static.flickr.com/6038/6248708214_ef1133d0e9_o.png?resize=283%2C101&amp;#038;ssl=1" alt="Laravel PHP Framework" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;在九月寫了 &lt;a href="http://blog.wu-boy.com/2014/09/get-homestead-vagrant-vm-running/"&gt;Laravel Homestead 的基礎介紹&lt;/a&gt;，最近 &lt;a href="http://laravel.com"&gt;Laravel&lt;/a&gt; 推出 Laravel Homestead 2.0，在 1.0 套件是沒有支援 &lt;code&gt;homestead&lt;/code&gt; 指令，現在 2.0 可以直接使用 &lt;code&gt;homestead&lt;/code&gt; 指令，前置安裝 &lt;a href="https://www.vagrantup.com/"&gt;Vagrant&lt;/a&gt; + &lt;a href="https://www.virtualbox.org/wiki/Downloads"&gt;Virtualbox&lt;/a&gt; 就不在此介紹了。&lt;/p&gt;</description></item><item><title>自動修復 JavaScript Linting-errors 好工具 Fixmyjs</title><link>https://blog.wu-boy.com/2014/11/fix-javascript-linting-errors-tool-fixmyjs/</link><pubDate>Sun, 02 Nov 2014 02:32:24 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/11/fix-javascript-linting-errors-tool-fixmyjs/</guid><description>&lt;p&gt;前端工程師撰寫 &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt; 程式碼後一定會透過 &lt;a href="http://www.jshint.com/"&gt;JSHint&lt;/a&gt; 驗證程式碼品質，但是 JSHint 只會提醒各位開發者哪些代碼需要修正，工程師還是需要手動去修復這些錯誤，這有點麻煩，所以今天來介紹一套自動修正 JSHint 錯誤的好工具 &lt;a href="https://github.com/jshint/fixmyjs/"&gt;Fixmyjs&lt;/a&gt;，如果大家有寫過 PHP，一定有聽過 &lt;a href="http://www.php-fig.org/"&gt;PHP-FIG&lt;/a&gt; 制定了 &lt;a href="http://www.php-fig.org/psr/psr-0/"&gt;PSR-0&lt;/a&gt;, &lt;a href="http://www.php-fig.org/psr/psr-1/"&gt;PSR-1&lt;/a&gt;, &lt;a href="http://www.php-fig.org/psr/psr-2/"&gt;PSR-2&lt;/a&gt; 等標準，希望 PHP 工程師可以遵守這些規則，而 &lt;a href="https://github.com/fabpot/PHP-CS-Fixer"&gt;PHP-CS-Fixer&lt;/a&gt; 就是根據 PHP-FIG 來自動修復 PHP 程式碼，讓程式碼可以遵守這些共同制定的標準。&lt;/p&gt;</description></item><item><title>CodeIgniter 終於找到新東家 British Columbia Institute of Technology 英屬哥倫比亞理工學院</title><link>https://blog.wu-boy.com/2014/10/codeigniter-has-a-new-home/</link><pubDate>Tue, 07 Oct 2014 06:01:19 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/10/codeigniter-has-a-new-home/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;p&gt;自從去年 &lt;a href="http://www.codeigniter.org.tw"&gt;CodeIgniter&lt;/a&gt; 宣佈要開始&lt;a href="http://blog.wu-boy.com/2013/07/seeking-new-owner-for-codeigniter/"&gt;找尋新東家&lt;/a&gt;，我就很期待下一個新東家會是誰，終於在今天公佈了新東家 &lt;a href="http://www.bcit.ca/"&gt;British Columbia Institute of Technology&lt;/a&gt; &lt;a href="http://zh.wikipedia.org/wiki/%E4%B8%8D%E5%88%97%E9%A1%9B%E5%93%A5%E5%80%AB%E6%AF%94%E4%BA%9E%E7%90%86%E5%B7%A5%E5%AD%B8%E9%99%A2"&gt;英屬哥倫比亞理工學院&lt;/a&gt; (BCIT)，官方也正式公佈一篇 &lt;a href="https://ellislab.com/blog/entry/your-favorite-php-framework-codeigniter-has-a-new-home"&gt;Your Favorite PHP Framework, CodeIgniter, Has a New Home&lt;/a&gt;，去年到現在 &lt;a href="https://ellislab.com/"&gt;EllisLab&lt;/a&gt; 就收到大量的候選人信件，但是困難的就是要從一堆候選人中選出一位最適合 CodeIgniter 新雇主，最後決定人選就是 BCIT，BCIT 是一間理工學院學校，裡面有超過 4 萬 8 千名學生，最重要的是，每年學校都會培養 150 名 CodeIgniter 學生，導入這套 PHP Framework 到業界。&lt;/p&gt;
&lt;p&gt;最後會由該學校的 James Parry 擔任 CodeIgniter Project Leader，並且由每年訓練優秀的學生加入此 Project 並且持續貢獻原始碼。看到這裡應該很興奮，因為對於 CodeIgniter 3.0 看起來應該不久之後就可以問世了。新的 Repo 網址也變成&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/bcit-ci/CodeIgniter"&gt;&lt;strong&gt;https://github.com/bcit-ci/CodeIgniter&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>實戰 CodeIgniter in 成功大學計算機與網路中心</title><link>https://blog.wu-boy.com/2014/09/fight-with-codeigniter-in-ncku/</link><pubDate>Mon, 29 Sep 2014 09:36:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/09/fight-with-codeigniter-in-ncku/</guid><description>&lt;div style="margin: 0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;p&gt;第一次在校園內推廣 &lt;a href="http://www.codeigniter.org.tw/"&gt;CodeIgniter&lt;/a&gt; 這套輕量級 PHP Framework，很高興受到&lt;a href="http://cc.ncku.edu.tw/bin/home.php"&gt;成功大學計算機與網路中心&lt;/a&gt;邀請，這次講的是進階 CodeIgniter 操作與實做，所以我把一些常用到的 CodeIgniter Library 包成一包，當成這次訓練課程，其實一天講下來，有認真實做，其實可以學到蠻大量的。但是作業還是要回家完成才可以。底下是我給的投影片&lt;/p&gt;</description></item><item><title>簡報 GNU Make, Autotools, CMake 簡介</title><link>https://blog.wu-boy.com/2014/09/introduction-to-gnu-make-autotools-cmake/</link><pubDate>Fri, 12 Sep 2014 06:57:58 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/09/introduction-to-gnu-make-autotools-cmake/</guid><description>&lt;p&gt;在 &lt;a href="http://www.slideshare.net/"&gt;SlideShare&lt;/a&gt; 看到一份專門介紹 &lt;a href="http://en.wikipedia.org/wiki/Make_%28software%29"&gt;Makefile&lt;/a&gt; 的簡報，寫得非常詳細，在這裡紀錄並分享給大家，有在寫 &lt;a href="http://en.wikipedia.org/wiki/C_%28programming_language%29"&gt;C&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/C%2B%2B"&gt;C++&lt;/a&gt; 的朋友們必看阿。搞系統(&lt;a href="http://en.wikipedia.org/wiki/Linux"&gt;Linux&lt;/a&gt; / &lt;a href="http://en.wikipedia.org/wiki/FreeBSD"&gt;FreeBSD&lt;/a&gt;)管理的工程師，也是必學工具之一。&lt;/p&gt;</description></item><item><title>Laravel Homestead 開始支援 HHVM</title><link>https://blog.wu-boy.com/2014/09/laravel-homestead-support-hhvm/</link><pubDate>Thu, 11 Sep 2014 03:13:01 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/09/laravel-homestead-support-hhvm/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6248708214/" title="Laravel PHP Framework by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm7.static.flickr.com/6038/6248708214_ef1133d0e9_o.png?resize=283%2C101&amp;#038;ssl=1" alt="Laravel PHP Framework" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;在 &lt;a href="http://laravel-news.com/"&gt;Laravel News&lt;/a&gt; 看到這篇 &lt;a href="http://laravel-news.com/2014/09/laravel-homestead-now-hhvm/"&gt;Laravel Homestead – Now with HHVM&lt;/a&gt;，也就是官方 Homestead 開始支援 &lt;a href="http://hhvm.com/"&gt;HHVM&lt;/a&gt;，現在可以直接透過底下指令升級 Box:&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ vagrant box update&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;版本會從 &lt;code&gt;0.1.8&lt;/code&gt; 升級到 &lt;code&gt;0.1.9&lt;/code&gt;，升級過程需要一段時間，最後要啟用 HHVM 服務，請在 &lt;code&gt;Homestead.yaml&lt;/code&gt; 加入底下設定&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;sites:
 - map: homestead.app
 to: /home/vagrant/Code/Laravel/public
 hhvm: true&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;不用煩惱架設 HHVM 環境了，對開發者真是一大幅音。&lt;/p&gt;</description></item><item><title>在 Windows 上安裝 Sublime Text 2 搭配 PHP-CS-Fixer 套件</title><link>https://blog.wu-boy.com/2014/09/sublime-text-2-php-cs-fixer-on-windows/</link><pubDate>Wed, 10 Sep 2014 08:16:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/09/sublime-text-2-php-cs-fixer-on-windows/</guid><description>&lt;p&gt;&lt;strong&gt;Note: 2014.12.22 PHP-CS-Fixer 不支援 &lt;code&gt;&amp;quot;--level&amp;quot;: &amp;quot;all&amp;quot;&lt;/code&gt; 設定了&lt;/strong&gt;&lt;/p&gt;
&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/13007892705/" title="Sublime_Text_Logo by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm8.staticflickr.com/7458/13007892705_062066d2ab_m.jpg?resize=240%2C240&amp;#038;ssl=1" alt="Sublime_Text_Logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;由於近幾年來 &lt;a href="http://www.php-fig.org/"&gt;PHP-Fig&lt;/a&gt; 發佈 PSR-0 ~ PSR-4 標準，所以在撰寫 PHP 程式碼時，請依照標準，而為了符合這標準，&lt;a href="https://github.com/fabpot"&gt;@fabpot&lt;/a&gt; 寫了一個轉換工具叫 &lt;a href="http://cs.sensiolabs.org/"&gt;PHP-CS-Fixer&lt;/a&gt; (PHP Coding Standards Fixer) 最主要目的是按照 &lt;a href="http://www.php-fig.org/psr/psr-1/"&gt;PSR-1&lt;/a&gt; and &lt;a href="http://www.php-fig.org/psr/psr-2/"&gt;PSR-2&lt;/a&gt; 的 Coding Style，只要透過 command 就可以將程式碼轉成標準格式。此篇要紀錄在 Windows 搭配 &lt;a href="http://www.sublimetext.com/"&gt;Sublime Text&lt;/a&gt; 安裝 PHP-CS-Fixer。&lt;/p&gt;
&lt;p&gt;在 Sublime 編輯器可以使 &lt;code&gt;ctrl + shift + p&lt;/code&gt; 後選 &lt;code&gt;Install package&lt;/code&gt; 找到 &lt;code&gt;PHPCs&lt;/code&gt; 點下安裝即可。打開 &lt;code&gt;Preferences&lt;/code&gt; -&amp;gt; &lt;code&gt;Package settings&lt;/code&gt; -&amp;gt; &lt;code&gt;PHP Code Sniffer&lt;/code&gt; -&amp;gt; &lt;code&gt;Settings&lt;/code&gt;，裡面把相關路徑補上去即可。底下是參考設定&lt;/p&gt;</description></item><item><title>快速安裝 Laravel Homestead 環境</title><link>https://blog.wu-boy.com/2014/09/get-homestead-vagrant-vm-running/</link><pubDate>Fri, 05 Sep 2014 03:56:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/09/get-homestead-vagrant-vm-running/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6248708214/" title="Laravel PHP Framework by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm7.static.flickr.com/6038/6248708214_ef1133d0e9_o.png?resize=283%2C101&amp;#038;ssl=1" alt="Laravel PHP Framework" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;在看本篇安裝教學前可以參考翻譯完成的 &lt;a href="http://laravel.tw/docs/homestead"&gt;Laravel Homestead&lt;/a&gt;，此篇會紀錄如何在 Ubuntu 底下快速架設 &lt;a href="http://Laravel.tw"&gt;Laravel&lt;/a&gt; 環境，對於一般新手而言，剛開始安裝 Laravel 開發環境一定會遇到許多問題，為了解決開發環境，Laravel 推出 Homestead 搭配 Vagrant Box，讓初學者不用為環境問題而煩惱，減少浪費時間在架設 Laravel。簡單來說 Laravel Homestead = Vagrant + &lt;a href="https://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; + Laravel 安裝包。底下簡單幾個步驟就可以完成 Laravel 開發環境。&lt;/p&gt;</description></item><item><title>Laravel 4.2 繁體中文文件完整上線</title><link>https://blog.wu-boy.com/2014/09/laravel-4-2-traditional-chinese-document/</link><pubDate>Mon, 01 Sep 2014 08:11:45 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/09/laravel-4-2-traditional-chinese-document/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6248708214/" title="Laravel PHP Framework by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm7.static.flickr.com/6038/6248708214_ef1133d0e9_o.png?resize=283%2C101&amp;#038;ssl=1" alt="Laravel PHP Framework" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://laravel.com"&gt;Laravel&lt;/a&gt; 是目前最火紅的 PHP Framework，但是對於第一次接觸 Framework 的使用者，安裝或學習方面一定會遇到重重困難，而為了降低學習門檻，網路上集結很多好朋友一起加入翻譯，經過了半年時間，快速的完成 4.2 版本的翻譯文件，雖然 4.3 版本在年底即將推出。這次要好好感謝 &lt;a href="https://www.facebook.com/groups/laravel.tw/"&gt;Facebook Laravel Taiwan 群組&lt;/a&gt;，透過台北的小聚會來定期 review 及分配翻譯項目，才可以在這麼短的時間完成翻譯內容，果然團結力量大。目前線上內容已經翻譯完成，但是還需要網路上各位大大來潤稿，Laravel TW 的 Github 在&lt;a href="https://github.com/laravel-taiwan"&gt;這裡&lt;/a&gt;，若要參與翻譯，請直接看 &lt;a href="https://github.com/laravel-taiwan/docs"&gt;Docs Repo&lt;/a&gt;，有人常常問我，不會 Git 可以幫忙嗎？答案是當然可以阿，可以直接將介面切換到瀏覽模式，找到底下符號，按下編輯，修改完成，拉到底下按下送出就可以了喔&lt;/p&gt;</description></item><item><title>Laravel 不同開發環境設定</title><link>https://blog.wu-boy.com/2014/08/laravel-application-environments-without-hostnames/</link><pubDate>Tue, 12 Aug 2014 02:09:41 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/08/laravel-application-environments-without-hostnames/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6248708214/" title="Laravel PHP Framework by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm7.static.flickr.com/6038/6248708214_ef1133d0e9_o.png?resize=283%2C101&amp;#038;ssl=1" alt="Laravel PHP Framework" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://laravel.com/"&gt;Laravel&lt;/a&gt; 本來預設的 &lt;a href="http://laravel.com/docs/configuration#environment-configuration"&gt;Environment Configuration&lt;/a&gt; 是透過 Domain Name 來區分，程式碼 &lt;code&gt;bootstrap/start.php&lt;/code&gt; 如下&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: php; title: ; notranslate" title=""&gt;&lt;?php
$env = $app-&gt;detectEnvironment(array(
 'local' =&gt; array('your-machine-name'),
));&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;我們可以根據上述程式碼產生不同的開發環境，像是 develop, production, staging… 等，根據不同的 Domain 給予不同的環境設定檔。但是根據使用 Domain Name 來區分各種不同的環境換產生兩種問題&lt;/p&gt;</description></item><item><title>推薦 Sublime Text UI Theme Spacegray</title><link>https://blog.wu-boy.com/2014/08/sublime-text-ui-theme-spacegray/</link><pubDate>Thu, 07 Aug 2014 02:50:16 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/08/sublime-text-ui-theme-spacegray/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/13007892705/" title="Sublime_Text_Logo by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm8.staticflickr.com/7458/13007892705_062066d2ab_m.jpg?resize=240%2C240&amp;#038;ssl=1" alt="Sublime_Text_Logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;不管在 Windows 或 Linux 環境，我都是使用 &lt;a href="http://www.sublimetext.com/"&gt;Sublime Text&lt;/a&gt; 編輯器，推薦這套編輯器的原因無非就是有強大的 Plugin 套件，這次來推薦撰寫程式碼的 UI Theme，好的 UI Theme 可以讓程式設計師的眼睛感覺到很舒服，&lt;a href="http://kkga.github.io/spacegray/"&gt;Spacegray UI Theme&lt;/a&gt; 是 &lt;a href="https://www.facebook.com/groups/open.rgba/"&gt;RGBA.tw&lt;/a&gt; 網站管理者 &lt;a href="https://www.facebook.com/evenwu"&gt;Even Wu&lt;/a&gt; 推薦。安裝方式很簡單 &lt;code&gt;Ctrl + Shift + p&lt;/code&gt; 叫出命令列視窗，找到 &lt;code&gt;Install Packages&lt;/code&gt; 後，搜尋 &lt;code&gt;Theme - Spacegray&lt;/code&gt;。&lt;/p&gt;</description></item><item><title>升級 PHP Facebook SDK 到 4.0.x 版本</title><link>https://blog.wu-boy.com/2014/07/upgrade-php-facebook-sdk-to-4-0-x/</link><pubDate>Thu, 24 Jul 2014 09:11:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/07/upgrade-php-facebook-sdk-to-4-0-x/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;p&gt;最近幫公司建立 Staging 環境，申請了新的 &lt;a href="https://developers.facebook.com"&gt;FB App&lt;/a&gt; 來，用原本 &lt;a href="https://github.com/facebook/facebook-php-sdk"&gt;Facebook v3.2.3 SDK&lt;/a&gt; 發現已經不能 work 了，去翻了 &lt;a href="https://developers.facebook.com/docs/apps/changelog"&gt;Facebook Platform Changelog&lt;/a&gt;，看到今年 4 月 30 號以後申請的 App 會強制走 v2.0 Auth 機制，所以原本用 php sdk 3.2.3 版本的話，完全無法呼叫 Auth 2.0 API，導致整個網站爛掉，當然線上的網站是不會隨意換 App ID 及 secret，免得怎麼爆掉的都不知道。這次來教學在 CodeIgniter 轉換 PHP Facebook SDK，可以直接參考&lt;a href="https://developers.facebook.com/docs/php/gettingstarted/4.0.0"&gt;官方 4.0.0 的教學&lt;/a&gt;，原本 3.2.3 版本直接下載程式碼，放到 library 目錄，直接 include 就可以取得 Facebook 個人資料，4.0.0 版本以後，請先確認系統是否升級為 PHP 5.4 版本以上，並且支援 &lt;a href="https://getcomposer.org/"&gt;Composer&lt;/a&gt; 安裝，當然如果不用 Composer 也可以，只是要 include 很多檔案，真的比較麻煩。&lt;/p&gt;</description></item><item><title>Automating your workflow with Gulp.js</title><link>https://blog.wu-boy.com/2014/07/automating-your-workflow-with-gulp-js/</link><pubDate>Sun, 20 Jul 2014 02:11:13 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/07/automating-your-workflow-with-gulp-js/</guid><description>&lt;div style="margin:0 auto; text-align:center;"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/11616755494/" title="gulp by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm8.staticflickr.com/7354/11616755494_06ef5c0fa5.jpg?w=840&amp;#038;ssl=1" style="max-height: 250px" alt="gulp" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;今年 2014 &lt;a href="http://coscup.org/"&gt;COSCUP&lt;/a&gt; 在 7/19,20 中研院舉辦，由於 &lt;a href="http://jsdc.tw/"&gt;JSDC&lt;/a&gt; 今年比往年還要晚半年舉辦，所以本來想投在 JSDC 的議程，就先拿到投到 COSCUP 議程。去年 JSDC 講了 &lt;a href="http://blog.wu-boy.com/2013/03/javascript-command-line-tool-gruntjs/"&gt;Javascript command line tool GruntJS 介紹&lt;/a&gt;，講完經過半年，&lt;a href="http://gulpjs.com/"&gt;Gulp.js&lt;/a&gt; 就出來了，我馬上跳過去嘗試，用過之後，就像變了心的女朋友，回不來了，底下是 Gulp.js Slides。&lt;/p&gt;</description></item><item><title>在 Debian 安裝 Percona Xtradb Cluster 5.5.34 注意事項</title><link>https://blog.wu-boy.com/2014/07/install-percona-xtradb-cluster-5-5-34-tips/</link><pubDate>Fri, 04 Jul 2014 02:29:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/07/install-percona-xtradb-cluster-5-5-34-tips/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/12023069753/" title="percona by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm4.staticflickr.com/3820/12023069753_de60d0c86d_m.jpg?resize=240%2C234&amp;#038;ssl=1" alt="percona" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;最近幫公司安裝新的三台機器，全部上 &lt;a href="https://www.debian.org/"&gt;Debian&lt;/a&gt; 7.5 Server 版本，統一安裝 &lt;a href="http://www.percona.com/software/percona-xtradb-cluster"&gt;Percona Xtradb Cluster&lt;/a&gt; 最新版本 5.5.37。設定完第一台 Node，並且透過底下指令 boot up 成第一台 PXC。&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ /etc/init.d/mysql bootstrap-pxc&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;後續第二台要啟動跟第一台進行 SST，寫到一半直接噴底下錯誤訊息&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;WSREP_SST: [ERROR] Cleanup after exit with status:32 (20140702 10:57:28.004) WSREP_SST: [INFO] Removing the sst_in_progress file (20140702 10:57:28.006) 140702 10:57:28 [ERROR] WSREP: Process completed with error: wsrep_sst_xtrabackup &amp;ndash;role &amp;lsquo;joiner&amp;rsquo; &amp;ndash;address &amp;lsquo;192.168.1.101&amp;rsquo; &amp;ndash;auth &amp;lsquo;xxxxx:xxxxxx&amp;rsquo; &amp;ndash;datadir &amp;lsquo;/var/lib/mysql/&amp;rsquo; &amp;ndash;defaults-file &amp;lsquo;/etc/mysql/my.cnf&amp;rsquo; &amp;ndash;parent &amp;lsquo;16042&amp;rsquo;: 32 (Broken pipe) 140702 10:57:28 [ERROR] WSREP: Failed to read uuid:seqno from joiner script. 140702 10:57:28 [ERROR] WSREP: SST failed: 32 (Broken pipe)&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>在 Ubuntu 建置 OpenWrt 編譯環境</title><link>https://blog.wu-boy.com/2014/07/openwrt-build-environment-on-ubuntu/</link><pubDate>Tue, 01 Jul 2014 02:53:30 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/07/openwrt-build-environment-on-ubuntu/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/14546598542" title="openwrt-logo by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm4.staticflickr.com/3873/14546598542_5c9337ab7e_o.png?resize=386%2C98&amp;#038;ssl=1" alt="openwrt-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;紀錄一下如何在用 &lt;a href="https://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; 架設 Ubuntu &lt;a href="https://openwrt.org/"&gt;OpenWrt&lt;/a&gt; 編譯環境，請記住不要下載 &lt;strong&gt;Ubuntu Server Disk&lt;/strong&gt; 來安裝，會遇到很多奇怪的問題，為了避免編譯出錯，請選擇 &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; 12.04 Desktop 版本，安裝時空間請盡量調大，反正 VirtualBox 也不會吃掉這麼多空間，用多少吃多少。Ubuntu 安裝完成後，請先安裝 openssh server 套件。完成後透過 VirtualBox Network 開啟 22 port forwarding。&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# 有 aptitude 指令
$ aptitude -y install openssh-server
# 無 aptitude 指令
$ apt-get -y install openssh-server&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;由於是安裝桌面版本，所以一開始就會直接打開 lightdm 服務，請透過之前寫的文章 &lt;a href="http://blog.wu-boy.com/2012/08/how-to-disabled-gui-on-ubuntu-12-04-lts/"&gt;Ubuntu 停止使用 GUI 介面 12.04 LTS&lt;/a&gt; 來把桌面停用，這樣開機就直接進去 Text mode 了，避免浪費記憶體在桌面。最後補上相依性套件安裝&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ aptitude -y install build-essential bison flex gettext g++ help2man help2man zlib1g-dev libssl-dev gawk unzip&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;如果編譯過程有看到 script 檔編譯不過，可能就要換 Bash 環境編譯，請先備份 &lt;code&gt;/bin/sh&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Ngnix 搭配 PHP-FPM 噴 php5-fpm.sock failed (13: Permission denied)</title><link>https://blog.wu-boy.com/2014/06/ngnix-php5-fpm-sock-failed-permission-denied/</link><pubDate>Wed, 25 Jun 2014 02:43:13 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/06/ngnix-php5-fpm-sock-failed-permission-denied/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8684224387/" title="nginx-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm9.staticflickr.com/8401/8684224387_19de454ebf.jpg?resize=320%2C120&amp;#038;ssl=1" alt="nginx-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://nginx.org/"&gt;Nginx&lt;/a&gt; 搭配 &lt;a href="http://php-fpm.org/"&gt;PHP-FPM&lt;/a&gt; 已經是架設 PHP 伺服器基本入門款了，這次升級 CentOS 機器完後，發現 Log 一直噴出底下訊息&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;nginx error connect to php5-fpm.sock failed (13: Permission denied)
透過 &lt;a href="http://stackoverflow.com/"&gt;Stackoverflow&lt;/a&gt; 查到這篇解答 &lt;a href="http://stackoverflow.com/questions/23443398/nginx-error-connect-to-php5-fpm-sock-failed-13-permission-denied"&gt;nginx error connect to php5-fpm.sock failed (13: Permission denied)&lt;/a&gt;，裡面提到兩種作法，其中一解法是直接修改 &lt;code&gt;/var/run/php5-fpm.sock&lt;/code&gt; 為 666，讓其他使用者可以直接存取此檔案，但是此作法在下次重新開機後一樣會出現同問題，最終解法請修改 &lt;code&gt;/etc/php-fpm.d/www.conf&lt;/code&gt; 如果是搭配 Nginx 請使用底下設定&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;user = nginx
group = nginx
; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server. Many
; BSD-derived systems allow connections regardless of permissions.
; Default Values: user and group are set as the running user
; mode is set to 0666
listen.owner = nginx
listen.group = nginx
listen.mode = 0666&lt;/pre&gt;
&lt;/div&gt;</description></item><item><title>Linode 推出每月 10 美金方案</title><link>https://blog.wu-boy.com/2014/06/linode-new-plan-and-11th-birthday/</link><pubDate>Tue, 17 Jun 2014 05:48:20 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/06/linode-new-plan-and-11th-birthday/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/13896098566" title="linode_logo_gray by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm6.staticflickr.com/5165/13896098566_2f86b643bb_o.png?resize=288%2C65&amp;#038;ssl=1" alt="linode_logo_gray" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://www.linode.com"&gt;Linode&lt;/a&gt; 慶祝 11 週年慶，推出&lt;a href="https://blog.linode.com/2014/06/16/11th-linode-birthday-10-linode-plan/"&gt;每月只要 10 美金的 VPS 方案&lt;/a&gt;，其實這方案就是原本最低的 &lt;code&gt;Linode 2GB&lt;/code&gt; 直接打對折啦。流量每月 2TB，記憶體 1G，24GB SSD 硬碟空間，對外頻寬到 125 Mbps，總對外骨幹還是維持在 40 Gbps。重點是 Linode 現在可以用小時付費，但是每個月只要 10 美金，其實真的很便宜，草創時期用 Linode 真的是最好的方案，看來 &lt;a href="https://www.digitalocean.com/"&gt;DigitalOcean&lt;/a&gt; 的出現，這兩年讓 Linode 成長不少，也代表的以前的 Linode 賺很大 XD，補上現在的方案表&lt;/p&gt;</description></item><item><title>用 Google PageSpeed Insights 計算 Desktop 或 Mobile 網站分數</title><link>https://blog.wu-boy.com/2014/06/pagespeed-insights-with-reporting/</link><pubDate>Thu, 12 Jun 2014 02:33:34 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/06/pagespeed-insights-with-reporting/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/14077059487" title="new-google-logo-knockoff by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm3.staticflickr.com/2930/14077059487_58046d689e_n.jpg?resize=320%2C124&amp;#038;ssl=1" alt="new-google-logo-knockoff" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;相信工程師在調整網站效能一定會使用 &lt;a href="https://developers.google.com/speed/docs/insights/v1/getting_started"&gt;Google PageSpeed Insights&lt;/a&gt; 來得到測試效能數據報表，但是這僅限於使用 Chrome 或 Firefox 瀏覽器。每次跑 PageSpeed 時候，Chrome 就會出現哀號，並且吃下許多記憶體。有沒有 command line 可以直接用 Google PageSpeed Insights 測試 Desktop 或 Mobile 的分數。Google 工程師 &lt;a href="https://github.com/addyosmani"&gt;@addyosmani&lt;/a&gt; 寫了一套 &lt;a href="https://github.com/addyosmani/psi"&gt;PageSpeed Insights for Node - with reporting&lt;/a&gt; 稱作 &lt;a href="https://github.com/addyosmani/psi"&gt;PSI&lt;/a&gt;，可以直接透過 Node 來產生基本 report，這 report 真的算很基本，跟 Chrome 的 extension 跑起來的 report 是不一樣的。這工具可以用來紀錄每次 deploy 網站時的一些數據變化。底下附上 Google 網站報告&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/14401120872" title="google_psi_report by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm4.staticflickr.com/3857/14401120872_38d23bc763_z.jpg?resize=640%2C586&amp;#038;ssl=1" alt="google_psi_report" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>安全使用 JavaScript Global Variables</title><link>https://blog.wu-boy.com/2014/06/safely-reference-javascript-global-variables/</link><pubDate>Wed, 11 Jun 2014 03:42:00 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/06/safely-reference-javascript-global-variables/</guid><description>&lt;p&gt;剛開始學習 &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript"&gt;JavaScript&lt;/a&gt; 時候，一定會大量使用 Global Variables。但是使用 Global Variables 的同時，請務必使用 &lt;code&gt;var&lt;/code&gt; 宣告，而不是直接使用阿，否則會常常遇到 &lt;code&gt;ReferenceError&lt;/code&gt; 的錯誤。&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;function addToBlockList (item) {
 block_List.push(item);
}
&lt;p&gt;addToBlockList (&amp;ldquo;add 127.0.0.1&amp;rdquo;);&lt;/pre&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;執行後你可以發現 console 噴出 &lt;code&gt;Uncaught ReferenceError: block_List is not defined&lt;/code&gt;，加上一個判斷試試看。程式碼改成底下&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;function addToBlockList (item) {
 if (block_list) {
 block_List.push(item);
 }
}
&lt;p&gt;addToBlockList (&amp;ldquo;add 127.0.0.1&amp;rdquo;);&lt;/pre&gt;&lt;/p&gt;
&lt;/div&gt;</description></item><item><title>認識現今 Google 搜尋引擎</title><link>https://blog.wu-boy.com/2014/05/understanding-google-search-engine/</link><pubDate>Sun, 25 May 2014 07:04:38 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/05/understanding-google-search-engine/</guid><description>&lt;p&gt;&lt;strong&gt;感謝 &lt;a href="https://www.facebook.com/yhsiang"&gt;@Ly Cheng&lt;/a&gt; 針對第三點補充&lt;/strong&gt;&lt;/p&gt;
&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/14077059487" title="new-google-logo-knockoff by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm3.staticflickr.com/2930/14077059487_58046d689e.jpg?resize=500%2C194&amp;#038;ssl=1" alt="new-google-logo-knockoff" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;1995 年 &lt;a href="http://zh.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt; 第1版出現，到了 1998 年 &lt;a href="https://www.google.com/"&gt;Google&lt;/a&gt; 推出&lt;a href="https://www.google.com/about/company/history/#1998"&gt;第一代搜尋引擎&lt;/a&gt;，當時的 Google 根本不用在乎網頁如何使用 &lt;a href="http://en.wikipedia.org/wiki/Cascading_Style_Sheets"&gt;CSS&lt;/a&gt; 或 JavaScript，而當時的網頁也顯少使用 JavaScript 及 CSS。轉眼間到現在 2014 年，如今現在的 Web，已經離不開 JavaScript 及 CSS 了，而目前 &lt;a href="http://en.wikipedia.org/wiki/Single-page_application"&gt;SPA (Single Page Application)&lt;/a&gt; 的流行，也造成 Google 搜尋引擎讀取資料的困擾，所以 Google 團隊目前也正在朝這方向努力邁進。&lt;/p&gt;</description></item><item><title>Gulp.js 工具包</title><link>https://blog.wu-boy.com/2014/05/gui-tool-for-gulp/</link><pubDate>Fri, 23 May 2014 03:23:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/05/gui-tool-for-gulp/</guid><description>&lt;div style="margin:0 auto; text-align:center;"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/11616755494/" title="gulp by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm8.staticflickr.com/7354/11616755494_06ef5c0fa5.jpg?w=840&amp;#038;ssl=1" style="max-height: 250px" alt="gulp" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;本篇來整理關於 &lt;a href="http://gulpjs.com/"&gt;Gulp.js&lt;/a&gt; 的一些 GUI 工具，對於不瞭解 Gulp.js 可以參考之前我寫的 &lt;a href="http://blog.wu-boy.com/2013/12/streaming-build-system-gulp/"&gt;The streaming build system Gulp&lt;/a&gt;，會紀錄這篇最主要是看到有人在 Github 發了這篇 &lt;a href="https://github.com/gulpjs/gulp/issues/468"&gt;Is there any GUI tool for Gulp?&lt;/a&gt; 而 Gulp.js 底層作者 &lt;a href="https://github.com/robrich"&gt;@robrich&lt;/a&gt; 跳出來列出了很多工具，整理如下&lt;/p&gt;</description></item><item><title>免費下載 Percona MySQL eBooks</title><link>https://blog.wu-boy.com/2014/05/free-download-percona-mysql-ebooks/</link><pubDate>Fri, 09 May 2014 02:24:05 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/05/free-download-percona-mysql-ebooks/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/12023069753/" title="percona by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm4.staticflickr.com/3820/12023069753_de60d0c86d_m.jpg?resize=240%2C234&amp;#038;ssl=1" alt="percona" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;玩 MySQL 的一定知道 &lt;a href="http://www.percona.com/"&gt;Percona&lt;/a&gt;，這次 Percona MySQL 推出&lt;a href="http://www.percona.com/resources/mysql-ebooks"&gt;免費電子書&lt;/a&gt;，電子書內容是從 MySQLPerformanceBlog 裡面精心挑選文章收錄，文章內容也幾乎都是 MySQL 專家寫出來的，電子書內容包含了MySQL server, Percona Server, Percona XtraDB Cluster, MySQL performance, and MySQL troubleshooting，所有的電子書都是免費下載。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.percona.com/resources/mysql-ebooks/how-find-bugs-mysql"&gt;How to find bugs in MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.percona.com/resources/mysql-ebooks/innodb-full-text-search-mysql-56"&gt;InnoDB Full Text Search in MySQL 5.6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.percona.com/resources/mysql-ebooks/innodb-performance-optimization"&gt;InnoDB Performance Optimization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.percona.com/resources/mysql-ebooks/percona-xtradb-cluster-56"&gt;Percona XtraDB Cluster 5.6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.percona.com/resources/mysql-ebooks/percona-xtradb-cluster"&gt;Percona XtraDB Cluster&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;更多主題可以直接參考 &lt;a href="http://www.percona.com/resources/mysql-ebooks"&gt;MySQL eBooks&lt;/a&gt;&lt;/p&gt;</description></item><item><title>修復 Ubuntu 開機 boot loader</title><link>https://blog.wu-boy.com/2014/05/fixed-boot-loader-on-ubuntu/</link><pubDate>Sat, 03 May 2014 01:58:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/05/fixed-boot-loader-on-ubuntu/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6760100409/" title="logo-Ubuntu by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm8.staticflickr.com/7153/6760100409_b23d1ce67b_m.jpg?resize=240%2C165&amp;#038;ssl=1" alt="logo-Ubuntu" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;昨天下午本來想幫自己的筆電 (&lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; OS) 升級記憶體，結果因為機型過於老舊，以現在的記憶體時脈 1600 裝上去後，直接讓 Ubuntu 當機，反覆重新開機，無法向下相容，加上現在記憶體狂漲價，找不到更低階的記憶體安裝了，無奈的是，店員幫忙測試筆電，換個記憶體，結果連 Ubuntu 的 &lt;a href="http://linux.vbird.org/linux_basic/0510osloader.php"&gt;boot loader&lt;/a&gt; 都可以壞掉。我看店員很緊張的說，不好意思，可以幫忙備份，幫忙我重灌。結果我還是自己拿回家處理比較安心。自己也不知道為什麼換個記憶體，可以讓 boot loader 消失。底下是修復 boot loader 過程&lt;/p&gt;</description></item><item><title>在 Ubuntu 底下查詢記憶時脈體資訊</title><link>https://blog.wu-boy.com/2014/05/check-ram-speed-on-ubuntu/</link><pubDate>Fri, 02 May 2014 02:47:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/05/check-ram-speed-on-ubuntu/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6760100409/" title="logo-Ubuntu by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm8.staticflickr.com/7153/6760100409_b23d1ce67b_m.jpg?resize=240%2C165&amp;#038;ssl=1" alt="logo-Ubuntu" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;最近想升級 Notebook 記憶體到 16G，要查看 &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; 底下記憶體時脈資訊，可以透過 &lt;a href="http://www.cyberciti.biz/faq/check-ram-speed-linux/"&gt;dmidecode&lt;/a&gt; 指令來取的記憶體硬體裝置資訊，此指令不只是這樣而已，還可以得知整台電腦硬體 components 資訊，底下擷取如何得到記憶體裝置資訊&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ dmidecode --type 17 | more&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;輸出結果為&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;
# dmidecode 2.11
SMBIOS 2.4 present.
&lt;p&gt;Handle 0x0036, DMI type 17, 27 bytes
Memory Device
Array Handle: 0x0035
Error Information Handle: Not Provided
Total Width: 64 bits
Data Width: 64 bits
Size: 2048 MB
Form Factor: SODIMM
Set: None
Locator: DIMM0
Bank Locator: BANK 0
Type: DDR3
Type Detail: Synchronous
Speed: 1067 MHz
Manufacturer: 80CE
Serial Number: 621AD76C
Asset Tag: Unknown
Part Number: M471B5673FH0-CF8&lt;/pre&gt;&lt;/p&gt;</description></item><item><title>gulp-imagemin 在 Ubuntu 出現錯誤</title><link>https://blog.wu-boy.com/2014/04/gulp-imagemin-lossy-operations-are-not-currently-supported/</link><pubDate>Tue, 29 Apr 2014 06:55:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/04/gulp-imagemin-lossy-operations-are-not-currently-supported/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/11616755494/" title="gulp by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm8.staticflickr.com/7354/11616755494_06ef5c0fa5.jpg?resize=197%2C388&amp;#038;ssl=1" alt="gulp" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;在 deploy 程式碼到 production server 前，透過 &lt;a href="https://www.npmjs.org/package/gulp-imagemin"&gt;gulp-imagemin&lt;/a&gt; 工具將全部圖片優化，上傳到 &lt;a href="http://aws.amazon.com/s3/"&gt;Amazon S3&lt;/a&gt;，Windows 底下正常運作，到了 Ubuntu 環境之下噴出底下錯誤訊息&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Error: Lossy operations are not currently supported
後來在 &lt;a href="https://github.com/gruntjs/grunt-contrib-imagemin/issues/180"&gt;grunt-contrib-imagemin@issues/180&lt;/a&gt; 有提人出此問題，解決方案就是升級 &lt;a href="http://optipng.sourceforge.net/"&gt;OptiPNG&lt;/a&gt;，因為 Ubuntu 的 apt 套件只有支援到 0.6.4 版本，請到 OptiPNG 官網下載最新 tar 檔，編譯重新安裝&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Linode VPS 全面升級 Double RAM &amp; SSD</title><link>https://blog.wu-boy.com/2014/04/linode-vps-double-ram-and-ssd/</link><pubDate>Fri, 18 Apr 2014 05:32:05 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/04/linode-vps-double-ram-and-ssd/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/13896098566" title="linode_logo_gray by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm6.staticflickr.com/5165/13896098566_2f86b643bb_o.png?resize=288%2C65&amp;#038;ssl=1" alt="linode_logo_gray" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://blog.linode.com/2014/04/17/linode-cloud-ssds-double-ram-much-more/"&gt;Linode&lt;/a&gt; 又來了驚人的舉動，現在開始支援 SSD 以及小時計費服務，可以參考官網最新發表的 &lt;a href="https://blog.linode.com/2014/04/17/linode-cloud-ssds-double-ram-much-more/"&gt;The New Linode Cloud: SSDs, Double RAM &amp;amp; much more&lt;/a&gt;，內容講到硬碟現在全面升級為 SSD，而且是 native SSD servers。網路頻寬部份每個 Linode Host 都連接 40 Gbps 的頻寬，對外總頻寬為 160 Gbps，對內頻寬為 40 Gbps，當然根據個人買得 VPS 而有不同的對外頻寬。記憶體則是全面 Double 升級，原本最低的 1G 記憶體，現在都改為 2G 了，每個月才 20 美金，看起來又是被 &lt;a href="https://www.digitalocean.com/"&gt;DigitalOcean&lt;/a&gt; 刺激到，最小的 Linode 流量也改為 3 TB。來看看現在新的方案&lt;/p&gt;</description></item><item><title>OpenSSL CVE-2014-0160 (Heartbleed) 漏洞攻擊手法</title><link>https://blog.wu-boy.com/2014/04/openssl-cve-2014-0160-heartbleed/</link><pubDate>Mon, 14 Apr 2014 06:24:07 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/04/openssl-cve-2014-0160-heartbleed/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/13774392623" title="heartbleed by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm8.staticflickr.com/7102/13774392623_7baaa68597_m.jpg?resize=198%2C240&amp;#038;ssl=1" alt="heartbleed" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://devco.re/"&gt;DEVCORE&lt;/a&gt; 資安公司寫了一篇 &lt;a href="http://devco.re/blog/2014/04/11/openssl-heartbleed-how-to-hack-how-to-protect/"&gt;OpenSSL Heartbleed 全球駭客的殺戮祭典，你參與了嗎？&lt;/a&gt; 內如介紹如何透過工具攻擊及測試現有網站，也提供如何修正 OpenSSL 漏洞，Debian，Centos，FreeBSD 等。要檢查機器是否更新到正確版本，可以透過底下指令&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ openssl version -a&lt;/pre&gt;
&lt;/div&gt;</description></item><item><title>OSDC 2014 Talk: Introduction to Percona XtraDB Cluster and HAProxy</title><link>https://blog.wu-boy.com/2014/04/osdc-2014-talk-introduction-to-percona-xtradb-cluster-and-haproxy/</link><pubDate>Sat, 12 Apr 2014 03:26:19 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/04/osdc-2014-talk-introduction-to-percona-xtradb-cluster-and-haproxy/</guid><description>&lt;p&gt;&lt;strong&gt;2014.05.07 OSDC 影片檔出爐&lt;/strong&gt;&lt;/p&gt;
&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/12023069753/" title="percona by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm4.staticflickr.com/3820/12023069753_de60d0c86d_m.jpg?resize=240%2C234&amp;#038;ssl=1" alt="percona" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;很高興可以參加今年 &lt;a href="http://osdc.tw/2014/"&gt;2014 OSDC&lt;/a&gt;，投了一篇 &lt;a href="http://osdc.tw/program/2014-day2-10.html#content"&gt;Introduction to Percona XtraDB Cluster and HAProxy&lt;/a&gt;，主要介紹 &lt;a href="http://www.percona.com/software/percona-xtradb-cluster"&gt;Percona XtraDB Cluster&lt;/a&gt; 這套 open source 軟體搭配前端 &lt;a href="http://haproxy.1wt.eu/"&gt;HAProxy&lt;/a&gt;，底下是 Slides&lt;/p&gt;</description></item><item><title>StartSSL 關閉註冊 OpenSSL CVE-2014-0160 Heartbleed Security</title><link>https://blog.wu-boy.com/2014/04/startssl-close-registeration-openssl-cve-2014-0160-heartbleed-security/</link><pubDate>Fri, 11 Apr 2014 08:14:26 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/04/startssl-close-registeration-openssl-cve-2014-0160-heartbleed-security/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/13774392623" title="heartbleed by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm8.staticflickr.com/7102/13774392623_7baaa68597_m.jpg?resize=198%2C240&amp;#038;ssl=1" alt="heartbleed" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;這幾天 OpenSSL 發出很嚴重的 &lt;a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0160"&gt;CVE-2014-0160 Bug&lt;/a&gt; 叫做「&lt;a href="http://heartbleed.com/"&gt;Heartbleed&lt;/a&gt;」，台灣資安公司 &lt;a href="http://devco.re/"&gt;DEVCORE&lt;/a&gt; 也直接發布了&lt;a href="http://devco.re/blog/2014/04/09/openssl-heartbleed-CVE-2014-0160/"&gt;一篇文章&lt;/a&gt;，請大家儘快升級系統，並且通知全部會員修改密碼，目前看到 &lt;a href="https://github.com/"&gt;Github&lt;/a&gt; 等大型網站都已經先將使用者 Session 資料清除，另外個人憑證部份也必須要更換，所以這幾天免費提供申請的 &lt;a href="https://www.startssl.com/"&gt;StartSSL&lt;/a&gt; 服務，被大量的使用者來申請，目前看到官方網站直接&lt;del&gt;關閉註冊&lt;/del&gt;給個暫時的 warning 訊息 XD 如下圖&lt;/p&gt;
&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/13774487325" title="startssl by Bo-Yi Wu, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm8.staticflickr.com/7328/13774487325_28dfcf420d_z.jpg?resize=640%2C224&amp;#038;ssl=1" alt="startssl" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;</description></item><item><title>用 Go 語言寫的 Github Git 服務</title><link>https://blog.wu-boy.com/2014/04/go-git-service-using-go-language/</link><pubDate>Mon, 07 Apr 2014 07:22:36 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/04/go-git-service-using-go-language/</guid><description>&lt;img src="https://i1.wp.com/farm4.staticflickr.com/3762/13686798143_dd15f54076_o.png?w=840&amp;#038;ssl=1" alt="null" data-recalc-dims="1" /&gt; 
&lt;p&gt;最近看到大陸那邊用 &lt;a href="http://golang.org/"&gt;Go&lt;/a&gt; 語言寫了一套類似 &lt;a href="https://github.com/"&gt;Github&lt;/a&gt; 服務叫做 &lt;a href="https://github.com/gogits/gogs"&gt;Gogs&lt;/a&gt;(Go Git Service)，目前個人裝起來速度方面相當快，跟 &lt;a href="http://gitlab.org"&gt;GitLab&lt;/a&gt; 用 &lt;a href="https://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; 寫的 Git Service 速度有差，以功能完整性來說，GitLab 還是大勝 Gogs，安裝方式則是 Gogs 勝於 GitLab，如果最後要推薦用 Gogs 還是 GitLab，我個人還是會選 GitLab 因為畢竟還是要搭配 &lt;a href="http://jenkins-ci.org/"&gt;Jenkins&lt;/a&gt; 等 CI 服務才能發揮作用，這次來筆記如何在 Ubuntu 上安裝 Gogs。&lt;/p&gt;</description></item><item><title>html5-boilerplate 打算不支援 IE8 瀏覽器</title><link>https://blog.wu-boy.com/2014/03/html5-boilerplate-drop-ie8-support/</link><pubDate>Fri, 28 Mar 2014 02:15:27 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/03/html5-boilerplate-drop-ie8-support/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i0.wp.com/farm3.staticflickr.com/2939/13458096145_e9761d58cf_o.png?w=840&amp;#038;ssl=1" alt="" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://html5boilerplate.com/"&gt;html5 boilerplate&lt;/a&gt; 是一套免費前端 Html5 模板，裡面支援 &lt;a href="http://necolas.github.io/normalize.css/"&gt;Normalize.css&lt;/a&gt;、&lt;a href="http://jquery.com"&gt;jQuery&lt;/a&gt; (透過 Google CDN 或本地端讀取) 及 &lt;a href="http://modernizr.com/"&gt;Modernizr&lt;/a&gt;，目前支援 IE 8 以上瀏覽器，但是最近看到官方正在討論是否該&lt;a href="https://github.com/h5bp/html5-boilerplate/issues/1524"&gt;拿掉 IE 8 支援&lt;/a&gt;，原因是 &lt;a href="http://www.microsoft.com/"&gt;Microsoft&lt;/a&gt; 今年宣佈 2014 年 4 月 8 日以後將&lt;a href="http://www.microsoft.com/en-us/windows/enterprise/end-of-support.aspx"&gt;不再支援 Windows XP&lt;/a&gt;，討論中也提到目前 IE 8 的市占率，其實還不小，雖然大部分使用者可能來自亞洲&lt;/p&gt;</description></item><item><title>Using Capistrano to deploy current branch</title><link>https://blog.wu-boy.com/2014/03/using-capistrano-to-deploy-current-branch/</link><pubDate>Wed, 19 Mar 2014 03:14:29 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/03/using-capistrano-to-deploy-current-branch/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/13256445484/" title="CapistranoLogo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm4.staticflickr.com/3756/13256445484_d0ca222f48.jpg?resize=500%2C125&amp;#038;ssl=1" alt="CapistranoLogo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://capistranorb.com/"&gt;Capistrano&lt;/a&gt; 是一套用 &lt;a href="https://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; 語言所寫的 Deploy Tool，可以用來管理多台伺服器自動化流程，在 &lt;a href="http://rubyonrails.org/"&gt;Rails&lt;/a&gt; 專案內都會使用這套 Deploy Tool，也方便管理遠端機器。這次有個問題是，假設我們在 Staging 或 Production 設定檔分別定義了 &lt;code&gt;:branch&lt;/code&gt; 變數如下&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: ruby; title: ; notranslate" title=""&gt;set :branch, "master"
set :env, "production"&lt;/pre&gt;
&lt;/div&gt;</description></item><item><title>在 Local 端處理 Github 專案 Pull Request</title><link>https://blog.wu-boy.com/2014/03/checkout-github-pull-request/</link><pubDate>Sat, 15 Mar 2014 03:00:27 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/03/checkout-github-pull-request/</guid><description>&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/13158675193/" title="github-logo"&gt;&lt;img src="https://i2.wp.com/farm3.staticflickr.com/2238/13158675193_2892abac95.jpg?resize=500%2C198&amp;#038;ssl=1" alt="github-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;這篇會筆記如何將 &lt;a href="https://github.com/"&gt;Github&lt;/a&gt; 上專案內的 &lt;a href="https://help.github.com/articles/using-pull-requests"&gt;Pull Request&lt;/a&gt; 拉到 Local 端電腦，雖然現在大部分的 Open Source 都會寫 Unit Test 並且搭配免費的 &lt;a href="https://travis-ci.org/"&gt;Travis CI&lt;/a&gt; 自動化測試，但是有時候也是需要把別人的 Pull Request 拉下來測試後再進行 Merge，而 Github 官方有提供一篇說明文件 &lt;a href="https://help.github.com/articles/checking-out-pull-requests-locally"&gt;Checking out pull requests locally&lt;/a&gt;，底下紀錄操作步驟。&lt;/p&gt;</description></item><item><title>Ruby Compass and Sass Auto Testing Environment</title><link>https://blog.wu-boy.com/2014/03/ruby-compass-and-sass-auto-testing-environment/</link><pubDate>Tue, 11 Mar 2014 02:37:51 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/03/ruby-compass-and-sass-auto-testing-environment/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6213260474/" title="Compass Home Compass Documentation by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm7.static.flickr.com/6217/6213260474_e0e51eeefe_o.png?resize=486%2C110&amp;#038;ssl=1" alt="Compass Home Compass Documentation" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://compass-style.org/"&gt;Compass&lt;/a&gt; 是一套 CSS Authoring Framework，也是基於 &lt;a href="http://sass-lang.com/"&gt;Sass&lt;/a&gt; 語法的一套 Framework，先前寫了 &lt;a href="http://gulpjs.com/"&gt;Gulp&lt;/a&gt; 的 &lt;a href="https://github.com/appleboy/gulp-compass"&gt;Compass Plugin&lt;/a&gt;，在針對自動化測試時候出現版本相依性不同，造成無法自動測試成功。自動化測試目前跟 &lt;a href="http://github.com"&gt;Github&lt;/a&gt; 最常搭配的就是 &lt;a href="https://travis-ci.org/"&gt;Travis CI&lt;/a&gt; 或者是 &lt;a href="https://www.codeship.io/"&gt;Codeship&lt;/a&gt;，當然如果非 Open source 專案可能就要自己架設 &lt;a href="http://en.wikipedia.org/wiki/Continuous_integration"&gt;CI&lt;/a&gt; 伺服器，個人推薦就是 &lt;a href="http://jenkins-ci.org/"&gt;Jenkins&lt;/a&gt;。這次遇到的問題其實跟 Ruby Gem 版本相依性有關，由於要測試 Compass 所有 Command 語法，所以使用了 &lt;a href="http://susy.oddbird.net/"&gt;Susy&lt;/a&gt; + sass + compass，如果在 &lt;code&gt;.travis.yml&lt;/code&gt; 內直接寫&lt;/p&gt;</description></item><item><title>Sublime Text 2 在 Ubuntu 中文輸入問題</title><link>https://blog.wu-boy.com/2014/03/sublime-text-2-input-method-on-ubuntu/</link><pubDate>Sat, 08 Mar 2014 12:00:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/03/sublime-text-2-input-method-on-ubuntu/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/13007892705/" title="Sublime_Text_Logo by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm8.staticflickr.com/7458/13007892705_062066d2ab_m.jpg?resize=240%2C240&amp;#038;ssl=1" alt="Sublime_Text_Logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://www.sublimetext.com/"&gt;Sublime Text&lt;/a&gt; 是一個非常好用的文字編輯器，如果不喜歡 &lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; Console 介面，我強烈推薦這套，因為可以透過 &lt;a href="https://sublime.wbond.net/"&gt;Package Control&lt;/a&gt; 安裝實用的 Plugin。安裝好 Sublime Text 軟體後，發現切換輸入法跟 Sublime 預設的快捷鍵衝突，所以將 &lt;a href="http://zh.wikipedia.org/wiki/Gcin"&gt;gcin&lt;/a&gt; 切換的快捷鍵也換掉，但是似乎沒有作用，網路上找到此篇解法 &lt;a href="http://www.zhihu.com/question/20163104"&gt;Sublime Text 2 如何在 Ubuntu+iBus 下输入中文？&lt;/a&gt;，解法就是安裝 &lt;a href="https://sublime.wbond.net/packages/InputHelper"&gt;InputHelper Plugin&lt;/a&gt; 當然這方法是治標不治本，但是至少解決無法輸入中文的問題，底下是安裝方式&lt;/p&gt;</description></item><item><title>Percona Cloud Tools for MySQL 介紹及安裝</title><link>https://blog.wu-boy.com/2014/03/quick-installation-for-percona-cloud-tools-for-mysql/</link><pubDate>Thu, 06 Mar 2014 07:53:05 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/03/quick-installation-for-percona-cloud-tools-for-mysql/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/12023069753/" title="percona by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm4.staticflickr.com/3820/12023069753_de60d0c86d_m.jpg?resize=240%2C234&amp;#038;ssl=1" alt="percona" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://www.percona.com"&gt;Percona&lt;/a&gt; 去年推出一套 &lt;a href="https://cloud.percona.com"&gt;Cloud Tools for MySQL&lt;/a&gt;，藉由這套雲端服務可以幫忙分析 MySQL 系統內全部 Slow Query，並且計算出時間，畫出統計圖，此套系統目前還在 Beta 版，並且有些限制，只能開 3 個 organizations，每個 organizations 只能有 5 agents，最後資料只會保留 8 天，超過就會清除。這套系統後端是由 &lt;a href="http://golang.org/"&gt;GO Language&lt;/a&gt; 完成，前端則是由 &lt;a href="http://angularjs.org/"&gt;AngularJS&lt;/a&gt; 串起來，上個月 Percona 還在 &lt;a href="http://www.mysqlperformanceblog.com"&gt;MySQL Performance Blog&lt;/a&gt; 徵求 &lt;a href="http://www.mysqlperformanceblog.com/2014/01/20/percona-hiring-go-back-end-engineer/"&gt;GO 的開發者&lt;/a&gt;，可見 Percona 也看好此服務，大膽使用 Google 推的 GO Language。&lt;/p&gt;</description></item><item><title>Ruby 安裝 debugger package 發生 No source for ruby 錯誤</title><link>https://blog.wu-boy.com/2014/02/ruby-debugger-and-no-source-for-ruby-error/</link><pubDate>Thu, 27 Feb 2014 03:22:11 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/02/ruby-debugger-and-no-source-for-ruby-error/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/12343631243/" title="Ruby_logo by appleboy46, on Flickr"&gt;&lt;img style="max-height:200px; " src="https://i2.wp.com/farm6.staticflickr.com/5492/12343631243_7bc052fa05.jpg?w=840&amp;#038;ssl=1" alt="Ruby_logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;當您在特定 &lt;a href="https://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; 版本下安裝 &lt;a href="https://rubygems.org/gems/debugger"&gt;debugger gem&lt;/a&gt; 套件，會碰到底下錯誤訊息&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;Using debugger-ruby_core_source (1.2.4) 
Installing debugger-linecache (1.2.4) with native extensions 
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native
extension.
&lt;p&gt;checking for vm_core.h&amp;hellip; no
checking for vm_core.h&amp;hellip; no
Makefile creation failed&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;No source for ruby-2.0.0-p451 provided with debugger-ruby_core_source
gem.
**************************************************************************&lt;/pre&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;會發生此錯誤的最大原因是在 &lt;code&gt;debugger-ruby_core_source&lt;/code&gt; 原始碼內，只有包含特定少數的 Headers，解決此錯誤也非常簡單，可以直接將目前的 ruby 版本 headers 安裝到 &lt;code&gt;debugger-ruby_core_source&lt;/code&gt; 目錄內即可，透國 rake 就可以完成&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ cd /usr/local/rvm/gems/ruby-2.0.0-p451/gems/debugger-ruby_core_source-1.2.4/lib/debugger/ruby_core_source
$ rake add_source VERSION=2.0.0-p451 --trace&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;執行完成後，就可以回到原專案目錄透過 &lt;code&gt;bundle install&lt;/code&gt; 繼續安裝套件。&lt;/p&gt;</description></item><item><title>Laravel 搭配 Memcached Cross Domain Session</title><link>https://blog.wu-boy.com/2014/02/laravel-memcached-cross-domain-session/</link><pubDate>Mon, 24 Feb 2014 07:09:49 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/02/laravel-memcached-cross-domain-session/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6248708214/" title="Laravel PHP Framework by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm7.static.flickr.com/6038/6248708214_ef1133d0e9_o.png?resize=283%2C101&amp;#038;ssl=1" alt="Laravel PHP Framework" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://laravel.com/"&gt;Laravel&lt;/a&gt; 提供了 &lt;code&gt;file&lt;/code&gt;、&lt;code&gt;cookie&lt;/code&gt;、&lt;code&gt;database&lt;/code&gt;、&lt;code&gt;memcached&lt;/code&gt;、&lt;code&gt;array&lt;/code&gt; 五種方式來存取 &lt;a href="http://laravel.com/docs/session"&gt;Session&lt;/a&gt;，預設的使用方式會是 &lt;code&gt;file&lt;/code&gt; 存取，如果要跨 Domain 存取 Session 基本上只要設定 &lt;code&gt;php.ini&lt;/code&gt; 裡面的 Session 相關參數即可，請注意底下 3 個參數。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://tw1.php.net/manual/en/session.configuration.php#ini.session.save-path"&gt;session.save_handler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tw1.php.net/manual/en/session.configuration.php#ini.session.save-handler"&gt;session.save_path&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tw1.php.net/manual/en/session.configuration.php#ini.session.cookie-domain"&gt;session.cookie_domain&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Backbone.js 1.1.1 Release 釋出 AMD 版本</title><link>https://blog.wu-boy.com/2014/02/backbone-js-1-1-1-amd-release/</link><pubDate>Mon, 17 Feb 2014 05:48:00 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/02/backbone-js-1-1-1-amd-release/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/7059615321/" title="backbone by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm6.staticflickr.com/5338/7059615321_097833dea8.jpg?resize=451%2C80&amp;#038;ssl=1" alt="backbone" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://backbonejs.org/"&gt;Backbone.js&lt;/a&gt; 在 2014.02.13 推出 1.1.1 版本，此次改版沒有推出重大功能，距離上次 &lt;a href="http://blog.wu-boy.com/2013/11/upgrade-backbone-framework-to-1-1-0-tips/"&gt;1.1.0 版本&lt;/a&gt;只有經過四個月，時間也沒有很長。之前版本尚未支援 &lt;a href="https://github.com/amdjs/amdjs-api/wiki/AMD"&gt;AMD&lt;/a&gt;，所以都是使用 &lt;a href="https://github.com/amdjs/backbone"&gt;amdjs/backbone&lt;/a&gt; 版本，但是這次 Backbone 官方直接釋出 AMD 版本，那之後就照官方版本走就可以了，底下是這次改版 Release note&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;釋出 AMD (&lt;a href="http://requirejs.org/"&gt;require.js&lt;/a&gt;) 版本&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;execute&lt;/code&gt; hook 讓開發者可以處理特定 route arguments&lt;/li&gt;
&lt;li&gt;Backbone Event 效能改善&lt;/li&gt;
&lt;li&gt;處理相容舊瀏覽器 URL Unicode&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;近幾年 Javascript Framework 串起，似乎現在大家瘋狂的跟 &lt;a href="http://angularjs.org/"&gt;Angularjs&lt;/a&gt;，所以 Backbone 似乎進度也沒有很快了，就像 PHP Framework 一樣，&lt;a href="http://laravel.com/"&gt;Laravel&lt;/a&gt; 的出現，讓其他 Framework 變得比較少討論了&lt;/p&gt;</description></item><item><title>Percona XtraDB Cluster 5.6 找合適 IST Donor</title><link>https://blog.wu-boy.com/2014/02/percona-xtradb-cluster-5-6-ist-and-sst/</link><pubDate>Sun, 09 Feb 2014 12:55:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/02/percona-xtradb-cluster-5-6-ist-and-sst/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/12023069753/" title="percona by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm4.staticflickr.com/3820/12023069753_de60d0c86d_m.jpg?resize=240%2C234&amp;#038;ssl=1" alt="percona" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Gcache 是用來紀錄 &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt; 最近所使用的 SQL Command，其本身是佔用記憶體空間，大小可以由 &lt;code&gt;wsrep_provider_options&lt;/code&gt; 定義，如果有任何 MySQL Node 重新啟動，那麼可以經由 Live Node 內的 Gcache 將尚未同步的資料補上，同步資料的方式分為兩種一種為 IST(Incremental State Transfer) 另一種為 SST(State Snapshot Transfer)，但是同步資料時，管理者無法決定同步方式。先來看看 Gcache 一些特性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;node 重新啟動，Gcache 資料會全部消失&lt;/li&gt;
&lt;li&gt;Gcache 大小為固定，如果超過大小，則回刪除最早資料&lt;/li&gt;
&lt;li&gt;選擇 Donor node 會直接忽略 Gcache 狀態&lt;/li&gt;
&lt;li&gt;Node 重新啟動，需要同步的資料並非在指定 Node Gcahe 內，則會啟動 SST 同步&lt;/li&gt;
&lt;li&gt;到目前版本為止，沒有任何方式可以知道 Gcache 狀態&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;根據以上特性可以知道，當 Node 重新啟動，很容易就執行 SST 模式，舉例子來說，當有 Node crashed 超過一個晚上，你要如何知道其他 Node 內的 Gcache 資料大於需要同步的資料量？或者是當 Cluster 內只有兩台機器，那重新啟動任何一台 Node 都會是跑 SST 同步。&lt;/p&gt;</description></item><item><title>Git Server 噴 git upload-pack: git-pack-objects died with error</title><link>https://blog.wu-boy.com/2014/02/git-server-git-pack-objects-died-with-error/</link><pubDate>Fri, 07 Feb 2014 10:32:36 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/02/git-server-git-pack-objects-died-with-error/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8455538800/" title="Git-Logo-2Color by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm9.staticflickr.com/8523/8455538800_30f65954f8.jpg?w=840&amp;#038;ssl=1" style="max-width: 250px;" alt="Git-Logo-2Color" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;透過 &lt;a href="http://gitlab.org/"&gt;Gitlab&lt;/a&gt; 架設 &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; Server 來放一些 Document 資料，由於個人 Document 都是 pdf 檔案，所以整個 Git Repository 就非常肥大，今天在 Clone 下來的時候，不僅是主機 CPU 飆高，然後記憶體被吃到快沒了，最後還噴出底下錯誤訊息&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;remote: Counting objects: 4912, done.
remote: fatal: Out of memory, malloc failed
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: aborting due to possible repository corruption on the remote side.
fatal: early EOF
fatal: index-pack failed&lt;/pre&gt;
&lt;/div&gt;</description></item><item><title>在 Ubuntu 或 Debian 上跑 Ruby on Rails + Nginx</title><link>https://blog.wu-boy.com/2014/02/ruby-with-nginx-on-ubuntu-debian/</link><pubDate>Thu, 06 Feb 2014 14:58:14 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/02/ruby-with-nginx-on-ubuntu-debian/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/12343631243/" title="Ruby_logo by appleboy46, on Flickr"&gt;&lt;img style="max-height:200px; " src="https://i2.wp.com/farm6.staticflickr.com/5492/12343631243_7bc052fa05.jpg?w=840&amp;#038;ssl=1" alt="Ruby_logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;本篇用來紀錄學習 &lt;a href="http://rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt; 所需要的開發環境，請不要輕易嘗試使用 Windows 當開發環境，因為真的很不好裝，又很難除錯，所以作者建議開發環境一定要有 Linux 機器，如果是個人電腦用 Mac 也沒這問題。用 Rails 可以快速開發 Web 搭配 MySQL 資料庫，完成後可以透過 &lt;a href="https://github.com/capistrano/capistrano"&gt;Capistrano&lt;/a&gt; 工具幫助 Deploy 到 Production Server。底下會一一介紹如何在 Debian 機器上架設好 &lt;a href="https://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; + &lt;a href="http://nginx.org"&gt;Nginx&lt;/a&gt; 環境&lt;/p&gt;</description></item><item><title>PHP The Right Way 出電子書</title><link>https://blog.wu-boy.com/2014/02/php-the-right-way-best-practices/</link><pubDate>Mon, 03 Feb 2014 01:32:00 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/02/php-the-right-way-best-practices/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/12279756514/" title="PHP The… by Phil Sturgeon et al. [Leanpub PDF iPad Kindle by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm4.staticflickr.com/3722/12279756514_ea2c50b0ca_o.png?resize=304%2C394&amp;#038;ssl=1" alt="PHP The… by Phil Sturgeon et al. [Leanpub PDF iPad Kindle" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;最近看到前 &lt;a href="http://www.codeigniter.org.tw"&gt;CodeIgniter&lt;/a&gt; 及 &lt;a href="http://fuelphp.com/"&gt;FuelPHP&lt;/a&gt; 作者 &lt;a href="https://twitter.com/philsturgeon"&gt;Phil Sturgeon&lt;/a&gt; 和 &lt;a href="http://www.phptherightway.com/"&gt;PHP The Right Way&lt;/a&gt; 發起人 &lt;a href="https://twitter.com/codeguy"&gt;Josh Lockhart&lt;/a&gt; 合力推出&lt;a href="https://leanpub.com/phptherightway"&gt;電子書&lt;/a&gt;，目前一本定價為 4 塊美金，當然作者也不一定要使用者付錢，您可以直接&lt;a href="https://leanpub.com/phptherightway/read"&gt;線上看&lt;/a&gt;。這本線上 PDF 很適合丟給剛進來公司的新人，此新人當然對 PHP 有一定程度的了解，團隊內最重視的就是整個專案素質，也就是如果能達到多人維護同一個專案，讓其他人檢視的時候，不會覺得是好多人共同維護一個專案，也就是要求大家寫法一致 (&lt;a href="https://leanpub.com/phptherightway/read#code_style_guide_title"&gt;Code Style Guide&lt;/a&gt;)。&lt;/p&gt;</description></item><item><title>前端工程師必看 JavaScript The Right Way</title><link>https://blog.wu-boy.com/2014/01/javascript-the-right-way/</link><pubDate>Sun, 26 Jan 2014 07:43:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/01/javascript-the-right-way/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/12164664556/" title="325x450xtech-icon_js-strict.png.pagespeed.ic.iBvyvS-EQY by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm4.staticflickr.com/3744/12164664556_ecf615b4b5_n.jpg?resize=231%2C320&amp;#038;ssl=1" alt="325x450xtech-icon_js-strict.png.pagespeed.ic.iBvyvS-EQY" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;寫 &lt;a href="http://php.net/"&gt;PHP&lt;/a&gt; 的工程師一定知道 &lt;a href="http://www.phptherightway.com/"&gt;PHP The Right Way&lt;/a&gt;，現在 &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt; 也出了 &lt;a href="http://jstherightway.org/"&gt;JavaScript The Right Way&lt;/a&gt;，不管是新手或者是資深工程師，都值得把裡面提到文章一看再看，此網站包含&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://jstherightway.org/#js-code-style"&gt;JavaScript Code Style&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jstherightway.org/#the-good-parts"&gt;The Good Parts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jstherightway.org/#patterns"&gt;Patterns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jstherightway.org/#testing-tools"&gt;Testing Tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jstherightway.org/#frameworks"&gt;Frameworks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jstherightway.org/#game-engines"&gt;Game Engines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jstherightway.org/#reading"&gt;Reading&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jstherightway.org/#whotofollow"&gt;Who to follow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jstherightway.org/#paas"&gt;PaaS Providers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;網站還提供了新手或老手必讀的文章，像是 &lt;a href="http://robotlolita.github.io/2011/10/09/understanding-javascript-oop.html"&gt;Understanding JavaScript OOP&lt;/a&gt;, &lt;a href="http://yehudakatz.com/2011/08/12/understanding-prototypes-in-JavaScript/"&gt;Understanding “Prototypes” in JavaScript&lt;/a&gt; 或 &lt;a href="http://yehudakatz.com/2011/08/11/understanding-JavaScript-function-invocation-and-this/"&gt;Understanding JavaScript Function Invocation and “this”&lt;/a&gt;。也有推薦值的購買的書籍，以及&lt;a href="http://jsbooks.revolunet.com/"&gt;免費書籍&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>MySQL 5.6 UUID 複製資料到 Slave Server</title><link>https://blog.wu-boy.com/2014/01/mysql-5-6-uuid-cloning-slave-server/</link><pubDate>Thu, 23 Jan 2014 03:20:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/01/mysql-5-6-uuid-cloning-slave-server/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8171305355/" title="mysql_logo by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm9.staticflickr.com/8488/8171305355_7fb578fdc9.jpg?w=300&amp;#038;ssl=1" alt="mysql_logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;在 &lt;a href="http://www.mysqlperformanceblog.com/"&gt;MySQL Performance Blog&lt;/a&gt; 看到這篇 &lt;a href="http://www.mysqlperformanceblog.com/2014/01/21/beware-mysql-5-6-server-uuid-cloning-slaves/"&gt;Beware of MySQL 5.6 server UUID when cloning slaves&lt;/a&gt;，裡面提到如果是要複製資料到 Slave 機器，大部分的使用者肯定是將 &lt;code&gt;/var/lib/mysql&lt;/code&gt; 目錄整個 copy 到 Slave 機器上。如果是 &lt;a href="http://dev.mysql.com/tech-resources/articles/whats-new-in-mysql-5.6.html"&gt;MySQL 5.6&lt;/a&gt; Server 目錄內會有 &lt;code&gt;auto.cnf&lt;/code&gt; 設定檔，這是 MySQL 5.6 新的功能叫做 &lt;a href="http://dev.mysql.com/doc/refman/5.6/en/replication-options.html#sysvar_server_uuid"&gt;server_uuid&lt;/a&gt;，在啟動 MySQL 後，就會自動建立 &lt;code&gt;auto.cnf&lt;/code&gt; 檔案，此檔案就像是 &lt;code&gt;my.cnf&lt;/code&gt; 或 &lt;code&gt;my.ini&lt;/code&gt; 設定檔一樣，只是內容只有支援 &lt;code&gt;[auto]&lt;/code&gt; 並且只有支援 &lt;code&gt;server_uuid&lt;/code&gt; 這 key 值，例如&lt;/p&gt;</description></item><item><title>啟動 Percona XtraDB Cluster 注意事項</title><link>https://blog.wu-boy.com/2014/01/start-percona-xtradb-cluster-tips/</link><pubDate>Mon, 20 Jan 2014 06:50:45 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/01/start-percona-xtradb-cluster-tips/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/12023069753/" title="percona by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm4.staticflickr.com/3820/12023069753_de60d0c86d_m.jpg?resize=240%2C234&amp;#038;ssl=1" alt="percona" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;在 &lt;a href="http://www.percona.com/software/percona-xtradb-cluster"&gt;Percona XtraDB Cluster&lt;/a&gt; 推出 &lt;a href="http://www.percona.com/doc/percona-xtradb-cluster/5.5/release-notes/Percona-XtraDB-Cluster-5.5.28.html"&gt;5.5.28&lt;/a&gt; 以前，最簡單的啟動方式就是打開 &lt;code&gt;my.cnf&lt;/code&gt; 設定 &lt;code&gt;wsrep_urls&lt;/code&gt; 在 &lt;code&gt;[mysqld_safe]&lt;/code&gt; section 內。假設我們有三台 Node 分別為底下 IP:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;node1 = 192.168.1.100&lt;/li&gt;
&lt;li&gt;node2 = 192.168.1.101&lt;/li&gt;
&lt;li&gt;node3 = 192.168.1.102&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Percona XtraDB Cluster 搭配 HAProxy</title><link>https://blog.wu-boy.com/2014/01/percona-xtradb-cluster-reference-architecture-with-haproxy/</link><pubDate>Sun, 19 Jan 2014 13:02:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/01/percona-xtradb-cluster-reference-architecture-with-haproxy/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/12023069753/" title="percona by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm4.staticflickr.com/3820/12023069753_de60d0c86d_m.jpg?resize=240%2C234&amp;#038;ssl=1" alt="percona" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;本篇文章紀錄安裝 &lt;a href="http://www.percona.com/software/percona-xtradb-cluster"&gt;Percona XtraDB Cluster&lt;/a&gt; (簡稱 PXC) 及搭配 &lt;a href="http://haproxy.1wt.eu/"&gt;HAProxy&lt;/a&gt; 做分散流量系統，其實在業界已經很常看到 HAProxy + MySQL Cluster Database 解決方案，HAProxy 幫您解決負載平衡，並且偵測系統是否存活，管理者也就不用擔心 MySQL 服務是否會掛掉。本篇會著重於 HAProxy 設定部份，並且紀錄每一步安裝步驟。之前本作者寫過一篇 &lt;a href="http://blog.wu-boy.com/2013/03/galera-cluster-for-mysql-multi-master-replication/"&gt;Galera Cluster for MySQL Multi-master Replication&lt;/a&gt;，也可以參考。今天測試系統都會以 &lt;a href="http://www.centos.org/"&gt;CentOS&lt;/a&gt; 為主，各位讀者可以直接開 &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazone EC2&lt;/a&gt; 來測試，測試完成再關閉即可。&lt;/p&gt;</description></item><item><title>Percona XtraDB Server 出現 read only issue</title><link>https://blog.wu-boy.com/2014/01/percona-xtradb-server-read-only-issue/</link><pubDate>Thu, 16 Jan 2014 08:25:42 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/01/percona-xtradb-server-read-only-issue/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8171305355/" title="mysql_logo by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm9.staticflickr.com/8488/8171305355_7fb578fdc9.jpg?w=300&amp;#038;ssl=1" alt="mysql_logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;最近在整理 &lt;a href="http://www.percona.com/software/percona-server"&gt;Percona XtraDB Server&lt;/a&gt; 將 Read Write 全部拆開，寫入部份只開一台 Node，讀取機器 Replica 則是越多越好，當然如果預計 write 都不會有任何 conflict 的話，那就不用拆開，read write 都可以在同一台即可，拆開的目的要解決 &lt;code&gt;Innodb transaction locking&lt;/code&gt; 問題。今天遇到的是將機器讀寫都放在同一台，然後同時多台 Master 架構，結果跑在 &lt;a href="http://www.codeigniter.org.tw/"&gt;CodeIgniter&lt;/a&gt; 上面出現底下錯誤訊息&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The MySQL server is running with the &amp;ndash;read-only option so it cannot execute this statement&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Sysbench 測試 Percona XtraDB Server 效能</title><link>https://blog.wu-boy.com/2014/01/sysbench-test-percona-xtradb-server-performance/</link><pubDate>Wed, 15 Jan 2014 11:00:15 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/01/sysbench-test-percona-xtradb-server-performance/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8171305355/" title="mysql_logo by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm9.staticflickr.com/8488/8171305355_7fb578fdc9.jpg?w=300&amp;#038;ssl=1" alt="mysql_logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;今天拿 &lt;a href="https://launchpad.net/sysbench"&gt;MySQL benchmark tool - Sysbench&lt;/a&gt; 來測試看看 &lt;a href="http://www.percona.com/software/percona-server"&gt;Percona XtraDB Server&lt;/a&gt; + &lt;a href="http://haproxy.1wt.eu/"&gt;Haproxy&lt;/a&gt; 效能如何，實驗主機是執行在 &lt;a href="http://www.centos.org/"&gt;CentOS&lt;/a&gt; 6.4 版本，記憶體 128 G，在 CentOS 本身用 Yum 安裝 Sysbench 時，內建的版本為 0.4.12，單機測試 MySQL 效能不會出現任何錯誤，但是只要是透過 Haproxy，並且有兩台以上的 Server，就會噴出底下錯誤訊息:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ALERT: failed to execute mysql_stmt_execute(): Err1317 Query execution was interrupted&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>在 Chrome 瀏覽器使用 Terminal 終端機</title><link>https://blog.wu-boy.com/2014/01/terminal-in-chrome-devtools/</link><pubDate>Sun, 05 Jan 2014 13:43:46 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/01/terminal-in-chrome-devtools/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i2.wp.com/farm8.staticflickr.com/7350/9333443162_20e7e5d5f2_m.jpg?w=840&amp;#038;ssl=1" alt="Google Chrome" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;h2 id="簡介"&gt;簡介&lt;/h2&gt;
&lt;p&gt;不知道大家有無在瀏覽器內直接連上 Terminal 終端機，今天來介紹 &lt;a href="https://github.com/petethepig/devtools-terminal"&gt;DevTools Terminal&lt;/a&gt;，這是一套 &lt;a href="https://chrome.google.com/webstore/category/extensions"&gt;Chrome extension&lt;/a&gt;，它可以讓您在 &lt;a href="http://www.google.com/intl/zh-TW/chrome/"&gt;Chrome 瀏覽器&lt;/a&gt;直接使用 Terminal，平常開發程式，一定會常常切換瀏覽器及 Terminal 軟體，現在開發者可以直接在瀏覽器連上 Terminal，並且開始使用 &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt;, &lt;a href="http://gruntjs.com/"&gt;Grunt&lt;/a&gt;, wget 甚至 &lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; 等指令。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/11773943433/" title="Screenshot from 2014-01-05 20:36:26 by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm3.staticflickr.com/2837/11773943433_e0f20349fb.jpg?resize=500%2C282&amp;#038;ssl=1" alt="Screenshot from 2014-01-05 20:36:26" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>前端工程師必看: 十大 CSS 技巧</title><link>https://blog.wu-boy.com/2014/01/10-great-css-tips-for-every-web-developer/</link><pubDate>Fri, 03 Jan 2014 07:05:53 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2014/01/10-great-css-tips-for-every-web-developer/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/11699847034/" title="css3 by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm3.staticflickr.com/2847/11699847034_6b43d779b8_n.jpg?resize=228%2C320&amp;#038;ssl=1" alt="css3" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;2014 年第一篇文章來寫前端工程師必須要瞭解的 [CSS] 技巧，此篇其實來自於 &lt;a href="http://www.kidsil.net"&gt;KidsIL Blog&lt;/a&gt; 內的一篇 &lt;a href="http://www.kidsil.net/2013/12/10-great-css-tips/"&gt;10 Great CSS Tips for every Web Developer&lt;/a&gt;，裡面作者紀錄了十大 CSS 技巧，看完這十大後，發現有些技巧曾經出現在 &lt;a href="http://blog.evendesign.tw/post/38567423298/web-designer"&gt;Even Wu 給網頁設計師的建議一文&lt;/a&gt;，這些技巧都算是蠻基本的，對於前端工程師有很大的幫助，如果尚未瞭解或還沒開始使用的開發者，也可以建議團隊開始使用。底下內容來自於原網站，在加上筆者的一些補充。&lt;/p&gt;</description></item><item><title>增加 phpMyAdmin 登入時間</title><link>https://blog.wu-boy.com/2013/12/increase-phpmyadmin-login-time/</link><pubDate>Tue, 31 Dec 2013 07:19:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/12/increase-phpmyadmin-login-time/</guid><description>&lt;img src="https://i0.wp.com/upload.wikimedia.org/wikipedia/commons/9/95/PhpMyAdmin_logo.png?w=840" alt="phpMyAdmin" data-recalc-dims="1" /&gt;
&lt;p&gt;&lt;a href="http://www.phpmyadmin.net/home_page/index.php" title="phpMyAdmin"&gt;phpMyAdmin&lt;/a&gt; 是一套管理 MySQL 資料庫的 UI 介面工具，預設登入時間為 1440 秒，這時間是定義在 &lt;code&gt;libraries/config.default.php&lt;/code&gt; 內，phpMyAdmin 也是透過 &lt;a href="http://tw1.php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime"&gt;gc-maxlifetime&lt;/a&gt; 來決定 Session 存在與否，所以如果要增加登入時間，比如說設定一年 &lt;code&gt;(3600 * 24 * 365)&lt;/code&gt; 好了，請按照底下設定&lt;/p&gt;
&lt;h2 id="php-設定檔"&gt;PHP 設定檔&lt;/h2&gt;
&lt;p&gt;如果是裝 &lt;a href="http://php-fpm.org/"&gt;php-fpm&lt;/a&gt; 請修改 &lt;code&gt;/etc/php5/fpm/php.ini&lt;/code&gt; 路徑&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;After this number of seconds, stored data will be seen as &lt;span style="color:#cd5555"&gt;\&amp;#39;&lt;/span&gt;garbage&lt;span style="color:#cd5555"&gt;\&amp;#39;&lt;/span&gt; and ; cleaned up by the garbage collection process. 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;; http://php.net/session.gc-maxlifetime 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;session.gc_maxlifetime = &lt;span style="color:#b452cd"&gt;315360000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;重新啟動 php-fpm&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ /etc/init.d/php5-fpm restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="phpmyadmin-設定檔"&gt;phpMyAdmin 設定檔&lt;/h2&gt;
&lt;p&gt;修改 &lt;code&gt;config.inc.php&lt;/code&gt; 如果找不到此檔案，請複製 &lt;strong&gt;config.sample.inc.php&lt;/strong&gt; 為 &lt;strong&gt;config.inc.php&lt;/strong&gt;，接著增加底下設定即可&lt;/p&gt;</description></item><item><title>The streaming build system Gulp</title><link>https://blog.wu-boy.com/2013/12/streaming-build-system-gulp/</link><pubDate>Sun, 29 Dec 2013 08:25:22 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/12/streaming-build-system-gulp/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/11616755494/" title="gulp by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm8.staticflickr.com/7354/11616755494_06ef5c0fa5.jpg?resize=197%2C388&amp;#038;ssl=1" alt="gulp" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;看到 &lt;a href="https://github.com/yeoman" target="_blank"&gt;Yeoman&lt;/a&gt; 作者之一 &lt;a href="https://github.com/addyosmani" target="_blank"&gt;Addy Osmani&lt;/a&gt; 開始 &lt;a href="https://github.com/yeoman/yeoman/issues/1232" target="_blank"&gt;review Gulp build system&lt;/a&gt;，由於 Yeoman framework 跟 &lt;a href="http://gruntjs.com/" target="_blank"&gt;GruntJS&lt;/a&gt; 是很緊密結合的，但是 GruntJS 套件愈來愈多，漸漸的執行 GruntJS 後，開始吃了系統 CPU 及記憶體，這對於開發環境而言，會是一大負擔阿，大家不知道有無發現，跑 &lt;a href="http://nodejs.org/"&gt;Nodejs&lt;/a&gt; GruntJS 時，每當存檔的時候，CPU 就開始哀嚎了，我自己是有這方面的體會，加上團隊內並不是每位同仁的電腦都是很 powerful，原本是好意讓團隊開發更遵守 coding style 及統一開發環境，但是 Grunt 的肥大，讓整個 Client 環境 Loading 飆高。所以 Yeoman 看到了 &lt;a href="https://github.com/gulpjs/gulp" target="_blank"&gt;Gulp&lt;/a&gt;。也有考慮如何將 Gulp 整合到 Yeoman 專案。&lt;/p&gt;</description></item><item><title>CodeIgniter 初始化 Library 流程</title><link>https://blog.wu-boy.com/2013/12/codeigniter-load-library-process/</link><pubDate>Fri, 20 Dec 2013 15:52:13 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/12/codeigniter-load-library-process/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;p&gt;好久沒寫 &lt;a href="http://www.codeigniter.org.tw/" target="_blank"&gt;CodeIgniter&lt;/a&gt; 相關文章，這次看到在論壇有人發問 &lt;a href="http://www.codeigniter.org.tw/forum/viewtopic.php?f=6&amp;t=3885" target="_blank"&gt;application/libraries 優先權&lt;/a&gt;，想說把整個 CodeIgniter 如何讀取 Library 的流程整個寫下來，其實也不會很難，但是就是要照著 CI 定義的規則來命名檔名以及 Class。假設要讀取 Email Library，我們可以透過底下方式讀取&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: php; title: ; notranslate" title=""&gt;$this-&gt;load-&gt;library('email');&lt;/pre&gt;
&lt;/div&gt;</description></item><item><title>Jenkins + Apache User Auth</title><link>https://blog.wu-boy.com/2013/12/jenkins-apache-auth-setting/</link><pubDate>Sun, 08 Dec 2013 12:45:16 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/12/jenkins-apache-auth-setting/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/10830034484/" title="jenkins_logo by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm6.staticflickr.com/5507/10830034484_95cba45707.jpg?resize=398%2C128&amp;#038;ssl=1" alt="jenkins_logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;上個月寫過一篇如何設定 &lt;a href="http://nginx.org/" target="_blank"&gt;Nginx&lt;/a&gt; + &lt;a href="http://jenkins-ci.org/" target="_blank"&gt;Jenkins&lt;/a&gt; 文章，可以參考: &lt;a href="http://blog.wu-boy.com/2013/11/jenkins-nginx-auth/" target="_blank"&gt;Jenkins + Nginx User Auth&lt;/a&gt;，這次筆記 Jenkins + &lt;a href="http://httpd.apache.org" target="_blank"&gt;Apache&lt;/a&gt; 設定方式&lt;/p&gt;</description></item><item><title>Javscript 18 歲生日歷史演進</title><link>https://blog.wu-boy.com/2013/12/happy-18th-birthday-javascript/</link><pubDate>Sat, 07 Dec 2013 11:41:50 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/12/happy-18th-birthday-javascript/</guid><description>&lt;p&gt;在 &lt;a href="http://resin.io/blog/" target="_blank"&gt;resin.io&lt;/a&gt; 看到這篇 &lt;a href="http://resin.io/happy-18th-birthday-javascript/" target="_blank"&gt;Happy 18th Birthday JavaScript! A look at an unlikely past and bright future.&lt;/a&gt; 裡面有些 Javascript 發展史，蠻有趣的，分享給大家看看。18 年前由 Netscape 和 Sun 共同 Release Javscript，在當年18天後，Ruby 也同時&lt;a href="http://en.wikipedia.org/wiki/Ruby_(programming_language)#First_publication" target="_blank"&gt;發佈&lt;/a&gt;了，底下來看看 Javscript 歷史演進。&lt;/p&gt;</description></item><item><title>玩命關頭主角 Paul Walker 享年 40 歲</title><link>https://blog.wu-boy.com/2013/12/fast-furious-star-paul-walker-dead-at-40-in-fiery-car-crash/</link><pubDate>Sun, 01 Dec 2013 07:34:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/12/fast-furious-star-paul-walker-dead-at-40-in-fiery-car-crash/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/11146830493/" title="PaulWalkerEdit-1 by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm4.staticflickr.com/3805/11146830493_ce1f12dffa.jpg?resize=373%2C500&amp;#038;ssl=1" alt="PaulWalkerEdit-1" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 今天最震驚的消息就是
&lt;p&gt;&lt;a href="http://zh.wikipedia.org/zh-tw/%E7%8E%A9%E5%91%BD%E9%97%9C%E9%A0%AD" target="_blank"&gt;玩命關頭&lt;/a&gt;主角 &lt;a href="http://en.wikipedia.org/wiki/Paul_Walker" target="_blank"&gt;Paul Walker&lt;/a&gt; 發生車禍意外享年 40 歲，在 &lt;a href="http:/twitter.com" target="_blank"&gt;Twitter&lt;/a&gt; 得知此消息，Wiki 上面也已經更新死亡訊息了。&lt;/p&gt;
&lt;blockquote class="twitter-tweet" lang="en"&gt;
 &lt;p&gt;
 It's with a heavy heart that we must confirm Paul Walker passed away today in a tragic car accident...MORE: &lt;a href="http://t.co/9hDuJMH99M"&gt;http://t.co/9hDuJMH99M&lt;/a&gt; - &lt;a href="https://twitter.com/search?q=%23TeamPW&amp;src=hash"&gt;#TeamPW&lt;/a&gt;
 &lt;/p&gt;&amp;mdash; Paul Walker (@RealPaulWalker) 
&lt;p&gt;&lt;a href="https://twitter.com/RealPaulWalker/statuses/406984510367350784"&gt;December 1, 2013&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt; 玩命關頭一直是我追逐的動作片，如今主角已經先走一步，希望能有 Paul Walker 的紀錄片出來 ... 底下是車禍現場影片</description></item><item><title>Youtube IFrame API Unable to post message Issue</title><link>https://blog.wu-boy.com/2013/11/youtube-iframe-api-unable-to-post-message-issue/</link><pubDate>Fri, 29 Nov 2013 08:43:31 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/11/youtube-iframe-api-unable-to-post-message-issue/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/11113610676/" title="Solid_color_You_Tube_logo by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm6.staticflickr.com/5474/11113610676_bcbbbe5164_n.jpg?resize=320%2C128&amp;#038;ssl=1" alt="Solid_color_You_Tube_logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://developers.google.com/youtube/iframe_api_reference" target="_blank"&gt;YouTube IFrame Player API&lt;/a&gt; 提供了簡單的介面及方法，讓網站可以快速整合 Youtube 影片，但是不得不說 Google 針對 Youtube API 時常改版，所以就會常常碰道友時候可以動，有時後不可以動。&lt;a href="http://apiblog.youtube.com/2011/02/https-support-for-youtube-embeds.html" target="_blank"&gt;Youtube 在 2011 公告開始支援 https protocol&lt;/a&gt;，所以現在很多網站存取 Youtube API 時，都會使用底下寫法&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;&lt;/pre&gt;</description></item><item><title>jquery-serialize-object 不支援 IE7,8 瀏覽器?</title><link>https://blog.wu-boy.com/2013/11/jquery-serialize-object-no-support-ie7-8-browser/</link><pubDate>Wed, 20 Nov 2013 06:54:03 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/11/jquery-serialize-object-no-support-ie7-8-browser/</guid><description>&lt;p&gt;最近專案需求用到 &lt;a href="https://github.com/macek/jquery-serialize-object" target="_blank"&gt;jQuery Serialize Object plugin&lt;/a&gt;，它能夠自動將 Form 表單內的值，全部轉成 object 或 json 字串，減少開發者每次都要寫抓取 Form 表單內全部欄位的值。此套件安裝及使用方法都很容易，安裝可以透過 &lt;a href="http://bower.io/" target="_blank"&gt;Bower&lt;/a&gt; 方式，或者是下載 source code 直接 include 即可，在 IE 7 或 8 為什麼沒辦法使用呢，原因是作者使用了 &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach" target="_blank"&gt;Array.prototype.forEach&lt;/a&gt;，此語法需要 JavaScript 1.6 版本，很抱歉，在 IE8 並不支援 forEach 寫法，所以 &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript" target="_blank"&gt;Mozilla Javascript 開發者文件&lt;/a&gt;內有提供 Compatibility 方法： if (!Array.prototype.forEach) { Array.prototype.forEach = function (fn, scope) { &amp;lsquo;use strict&amp;rsquo;; var i, len; for (i = 0, len = this.length; i &amp;lt; len; ++i) { if (i in this) { fn.call(scope, this[i], i, this); } } }; }[/code] 但是既然這是 &lt;a href="http://plugins.jquery.com/" target="_blank"&gt;jQuery Plugin&lt;/a&gt;，就可以透過 jQuery 內建的 &lt;a href="http://api.jquery.com/each/" target="_blank"&gt;each&lt;/a&gt; 函式來解決，最後發了 &lt;a href="https://github.com/macek/jquery-serialize-object/pull/14" target="_blank"&gt;Pull request&lt;/a&gt; 給作者，就看作者收不收了 XD&lt;/p&gt;</description></item><item><title>西聯匯款 Google Adsense 取款步驟</title><link>https://blog.wu-boy.com/2013/11/western-union-quick-cash-google-adsense/</link><pubDate>Fri, 15 Nov 2013 04:45:42 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/11/western-union-quick-cash-google-adsense/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/10864787693/" title="GoogleAdsense by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm6.staticflickr.com/5500/10864787693_63f54411b8_n.jpg?resize=320%2C133&amp;#038;ssl=1" alt="GoogleAdsense" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 如果有在用 
&lt;p&gt;&lt;a href="https://www.google.com/adsense/" target="_blank"&gt;Google Adsense&lt;/a&gt; 服務朋友們，相信在台灣的取款方式都是透過&lt;a href="http://www.westernunion.tw/tc/" target="_blank"&gt;西聯匯款&lt;/a&gt;，以前支援西聯匯款服務的銀行還蠻多的，但是這次取款發現只剩下兩間銀行&lt;a href="http://www.tcbank.com.tw" target="_blank"&gt;大眾銀行&lt;/a&gt;及&lt;a href="http://www.ktb.com.tw/" target="_blank"&gt;京城銀行&lt;/a&gt;，所以大家不要再跑去其他銀行了，取款之前請先到&lt;a href="http://www.westernunion.tw/tc/" target="_blank"&gt;西聯匯款&lt;/a&gt;查詢家裡附近有哪些銀行可取款，出發前，你只要準備好底下資料即可。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;* 收件人 first name 及 last name (您的英文名字) * 匯款人 first name 及 last name (Google Inc) * 匯款人城市及國家 US-United States 美國 * 匯款處理編號 (MTCN) Money Transfer Control Number (請由後台觀看) * 款項金額 * 身份證 以上是櫃台小姐會請你提供，另外也會詢問你這筆費用的作用是？就回答廣告費即可，最後會依照當天的匯率轉換成美金給你。步驟相當簡單，給需要的朋友們參考看看。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>將 Backbone Framework 升級到 1.1.0 注意事項</title><link>https://blog.wu-boy.com/2013/11/upgrade-backbone-framework-to-1-1-0-tips/</link><pubDate>Thu, 14 Nov 2013 06:26:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/11/upgrade-backbone-framework-to-1-1-0-tips/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/7059615321/" title="backbone by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm6.staticflickr.com/5338/7059615321_097833dea8.jpg?resize=451%2C80&amp;#038;ssl=1" alt="backbone" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://backbonejs.org/" target="_blank"&gt;Backbone.js&lt;/a&gt; 經過了半年終於在 10 月 &lt;a href="http://backbonejs.org/#changelog"&gt;Release 了 1.1.0 版本&lt;/a&gt;，這次升級最重要的一點就是，Backbone 本來在 View 有支援 options，讓你可以透過初始化過程，將自定額外的 key 及 value 帶入，並且可以隨時透過 this.options.key 的方式取得資料。直接給例子來解說好了&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;this.example = new Backbone.View.extend({
 template_name: "user_edit",
 el: "#main"
});&lt;/pre&gt; 上面是宣告 Backbone.view 的寫法，程式設計師可以傳入 object 設定，並且可以在程式任意地方，使用 
&lt;p&gt;&lt;strong&gt;&lt;span style="color:green"&gt;this.example.options.template_name&lt;/span&gt;&lt;/strong&gt; 方式來得到 &lt;strong&gt;&lt;span style="color:green"&gt;user_edit&lt;/span&gt;&lt;/strong&gt; 值，如果是使用 Backbone 1.1.0 之前的版本都沒問題，要升級到 1.1.0，又想要此功能，請務必在 view 的宣告前就必須加一段程式碼(後面解說)。為什麼作者會拿掉呢？因為有開發者發 issue 說&lt;a href="https://github.com/jashkenas/backbone/issues/2458" target="_blank"&gt;為什麼 View 有這功能，那 Model 為什麼沒有呢？&lt;/a&gt;，這會讓未來加入開發的程式設計師感到困擾，所以作者就決定拿掉這塊&lt;/p&gt;</description></item><item><title>Jenkins + Nginx User Auth</title><link>https://blog.wu-boy.com/2013/11/jenkins-nginx-auth/</link><pubDate>Wed, 13 Nov 2013 02:57:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/11/jenkins-nginx-auth/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/10830034484/" title="jenkins_logo by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm6.staticflickr.com/5507/10830034484_95cba45707.jpg?resize=398%2C128&amp;#038;ssl=1" alt="jenkins_logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://jenkins-ci.org/" target="_blank"&gt;Jenkins CI&lt;/a&gt; 是一套非常好的 Job 執行 Tool，可以幫忙跑專案測試，測試完成後繼續 Deploy 到相對應的伺服器，也可以自動寄信給開發者或者是指定的內部人員。在 &lt;a href="http://www.ubuntu.com/" target="_blank"&gt;Ubuntu&lt;/a&gt; 或 &lt;a href="http://www.debian.org/" target="_blank"&gt;Debian&lt;/a&gt; 安裝方式非常簡單，按照下述操作就可以簡易架設完成&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ aptitude -y install openjdk-7-jre openjdk-7-jdk
$ wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
$ sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ &gt; /etc/apt/sources.list.d/jenkins.list'
$ aptitude -y update
$ aptitude -y install jenkins&lt;/pre&gt;
&lt;/div&gt;</description></item><item><title>Gitlab CE + Gitlab CI 打造版本控制及自動測試流程</title><link>https://blog.wu-boy.com/2013/11/intergrate-work-flow-with-gitlab/</link><pubDate>Fri, 01 Nov 2013 09:00:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/11/intergrate-work-flow-with-gitlab/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/10605193576/" title="gitlab_logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm4.staticflickr.com/3830/10605193576_54b54e4dfc_n.jpg?resize=320%2C206&amp;#038;ssl=1" alt="gitlab_logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Git 版本控制不管在嵌入式或 Web 領域都是很受歡迎的工具，尤其是不會遇到像 svn 搞爛 source tree，然後又要 Google 一堆解法。一般公司入門大概就是買 &lt;a href="https://github.com/" target="_blank"&gt;Github&lt;/a&gt; 服務，一個月才五美金，可以提供五個 Private Project，當然你也可以不付錢，而去使用 &lt;a href="https://bitbucket.org/" target="_blank"&gt;Bitbucket&lt;/a&gt;，好處就是無限的 Private Project，唯一的限制就是開發者數量，只能在五個以內，設定超過五個，就不給 push 或 pull 了，完成版本控制後，接著就是專案的自動測試，在 github 上面，推的就是 &lt;a href="https://travis-ci.org/" target="_blank"&gt;travis-ci&lt;/a&gt;，這也是全部 open source 專案的喜好，你會發現大部分的專案都會放上 &lt;a href="https://github.com/appleboy/backbone-template-engine/blob/master/.travis.yml" target="_blank"&gt;.travis.yml&lt;/a&gt;，來告訴 travis 需要的測試步驟，測試步驟完成後，就要將 source code deploy 到 Amazone 或其他雲端服務，到這個服務基本上都要收費了，所以&lt;a href="http://blog.wu-boy.com/2013/10/drone-io-with-runy-compass-setup/" target="_blank"&gt;上一篇&lt;/a&gt;有介紹 &lt;a href="https://drone.io/" target="_blank"&gt;Drone.io&lt;/a&gt; 服務，可以自動測試加上 Deploy 到遠端機器，不過缺點就是不支援 Private Project，要的話就是要收費。&lt;/p&gt;</description></item><item><title>Drone.io 搭配 Ruby 環境測試</title><link>https://blog.wu-boy.com/2013/10/drone-io-with-runy-compass-setup/</link><pubDate>Thu, 17 Oct 2013 02:54:54 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/10/drone-io-with-runy-compass-setup/</guid><description>&lt;p&gt;相信現在 &lt;a href="http://git-scm.com/" target="_blank"&gt;Git&lt;/a&gt; 已經是大家共通的版本控制工具，每當專案有新的 commit，我們可以透過 &lt;a href="https://travis-ci.org/" target="_blank"&gt;Travis&lt;/a&gt; 來幫忙做測試，但是 Travis 真的只有支援測試而已，如果測試成功想要進一步 Deploy 到任何機器或者是繼續做任何動作，這些都不支援的，那國外有些 Service 可以整合 &lt;a href="https://github.com/" target="_blank"&gt;Github&lt;/a&gt; 或 &lt;a href="https://bitbucket.org/" target="_blank"&gt;Bitbucket&lt;/a&gt; Project 幫忙做到自動測試及 Deploy，比較常見的就是 &lt;a href="https://www.codeship.io" target="_blank"&gt;Codeship&lt;/a&gt;，這服務非常強大，整合了 &lt;a href="https://www.heroku.com/" target="_blank"&gt;Heroku&lt;/a&gt;，&lt;a href="https://appengine.google.com/" target="_blank"&gt;App Engine&lt;/a&gt;，&lt;a href="https://www.nodejitsu.com/" target="_blank"&gt;Nodejitsu&lt;/a&gt; .. 等服務，Deploy 也支援 &lt;a href="https://github.com/fabric/fabric" target="_blank"&gt;Fabric&lt;/a&gt;, &lt;a href="http://puppetlabs.com/" target="_blank"&gt;Puppet&lt;/a&gt;, Shell script 等等，這家的收費是看每個月做了多少次編譯測試動作，最便宜的方案每個月 $9 美金，只能編譯 50 次。&lt;/p&gt;</description></item><item><title>HAProxy 搭配 CodeIgniter 取使用者真實 IP</title><link>https://blog.wu-boy.com/2013/10/haproxy-get-user-real-ip-using-codeigniter/</link><pubDate>Wed, 09 Oct 2013 02:57:24 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/10/haproxy-get-user-real-ip-using-codeigniter/</guid><description>&lt;p&gt;前端 Load Balance 首選就是 &lt;a href="http://haproxy.1wt.eu/" target="_blank"&gt;HAProxy&lt;/a&gt;，後端架設 &lt;a href="http://nginx.org/" target="_blank"&gt;Nginx&lt;/a&gt; 搭配 &lt;a href="http://www.codeigniter.org.tw/" target="_blank"&gt;CodeIgniter&lt;/a&gt;，紀錄使用者 IP 時，Nginx 總是只有抓到內部 IP 192.168.x.x，而無法抓到真實 Public IP，要抓到 Public IP 必須修改 HAProxy + Nginx 設定檔，HAProxy 只要在 Backend 地方加入 &lt;a href="http://code.google.com/p/haproxy-docs/wiki/forwardfor" target="_blank"&gt;forward&lt;/a&gt; 選項，這樣 HAProxy 會送 X-Forwarded-For header 給後端 Nginx。&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;option forwardfor&lt;/pre&gt;</description></item><item><title>2013 PHPConf Introduction to Gearman in PHP</title><link>https://blog.wu-boy.com/2013/10/2013-phpconf-introduction-to-gearman-in-php/</link><pubDate>Sat, 05 Oct 2013 06:21:21 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/10/2013-phpconf-introduction-to-gearman-in-php/</guid><description>&lt;p&gt;今天 &lt;a href="http://phpconf.tw/2013/" target="_blank"&gt;PHPConf&lt;/a&gt; 簡報檔，介紹 &lt;a href="http://gearman.org/" target="_blank"&gt;Gearman&lt;/a&gt; in PHP 應用，歡迎自取，有問題可以留言&lt;/p&gt;</description></item><item><title>RequireJS 搭配 CKEditor</title><link>https://blog.wu-boy.com/2013/09/load-ckeditor-using-requirejs/</link><pubDate>Wed, 25 Sep 2013 02:20:42 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/09/load-ckeditor-using-requirejs/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/9911959726/" title="requirejs-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm4.staticflickr.com/3677/9911959726_a40988a62d_o.png?resize=200%2C200&amp;#038;ssl=1" alt="requirejs-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 網頁編輯器大家推薦的就 
&lt;p&gt;&lt;a href="http://ckeditor.com/" target="_blank"&gt;CKEditor&lt;/a&gt; 或 &lt;a href="http://www.tinymce.com/" target="_blank"&gt;TinyMCE&lt;/a&gt;，兩套各有優缺點，CKEditor 雖然功能最完整，也是最肥了，雖然官網可以自己挑選 plugin 來簡化肥肥的 source code。如果是單純用在後台管理，我還是推薦 CKEditor，給前端使用者的話，就推薦 TinyMCE 了，畢竟前台還是要以輕量為主。&lt;/p&gt;</description></item><item><title>CodeIgniter REST Server with Backbone.js Issue</title><link>https://blog.wu-boy.com/2013/09/codeigniter-rest-server-with-backbone-js-issue/</link><pubDate>Fri, 20 Sep 2013 04:20:20 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/09/codeigniter-rest-server-with-backbone-js-issue/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 如果有在用 
&lt;p&gt;&lt;a href="http://www.codeigniter.org.tw/" target="_blank"&gt;CodeIgniter&lt;/a&gt; 來當作 &lt;a href="http://en.wikipedia.org/wiki/Representational_state_transfer" target="_blank"&gt;REST&lt;/a&gt; Server 的朋友們，我相信都會找到 &lt;a href="http://philsturgeon.co.uk/" target="_blank"&gt;philsturgeon&lt;/a&gt; 所寫的 &lt;a href="https://github.com/philsturgeon/codeigniter-restserver" target="_blank"&gt;codeigniter-restserver&lt;/a&gt;，此套件幫你完成底層 API Response 動作，讓你可以輕易處理 REST URL。但是如果拿這套程式碼來搭配 &lt;a href="http://backbonejs.org/" target="_blank"&gt;Backbone.js&lt;/a&gt; 你會遇到拿不到 POST 或 PUT 變數問題，作者來一一描述。&lt;/p&gt;</description></item><item><title>CSS Clear Fix 小技巧</title><link>https://blog.wu-boy.com/2013/09/css-clear-fix-tip/</link><pubDate>Sun, 15 Sep 2013 15:19:01 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/09/css-clear-fix-tip/</guid><description>&lt;p&gt;記的之前 &lt;a href="http://blog.evendesign.tw" target="_blank"&gt;evenwu&lt;/a&gt; 為了找尋外包 CSS 人才，出了一份&lt;a href="http://blog.evendesign.tw/post/38567423298/web-designer" target="_blank"&gt;考題&lt;/a&gt;，有提供上機考，真是佛心來的，還給用 Inspector 或上網。其中一題就是&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;第二題、如果一個X元素內的子元素通通 float: left 請問X元素本身會有什麼狀況？如果我要在X元素內下背景，卻沒有顯示，請問如何解決？
解決方式就是實作本身 &lt;code&gt;clearfix&lt;/code&gt;，或者是在元素後加上 &lt;code&gt;clear: both&lt;/code&gt; 的標籤，大概就是底下的樣子&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div&gt;
 &lt;pre class="brush: xml; title: ; notranslate" title=""&gt;&lt;div class="container"&gt;
 &lt;div class="floated"&gt;
 &lt;/div&gt;
 &lt;div class="floated"&gt;
 &lt;/div&gt;
 &lt;div class="floated"&gt;
 &lt;/div&gt;
 &lt;p style="clear:both"&gt;
 &lt;/p&gt;
&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;如果是要在 container 實作 clearfix，就必須透過 css &lt;code&gt;before&lt;/code&gt; 和 &lt;code&gt;after&lt;/code&gt;。&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: css; title: ; notranslate" title=""&gt;.clearfix {
 *zoom: 1;
}
.clearfix:before, .clearfix:after {
 content: "";
 display: table;
 line-height: 0;
}
.clearfix:after {
 clear: both;
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;SASS 版本&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: css; title: ; notranslate" title=""&gt;.clearfix {
 *zoom: 1;
 &amp;:before,
 &amp;:after {
 display: table;
 content: "";
 line-height: 0;
 }
 &amp;:after {
 clear: both;
 }
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;這樣只要在任何 element 加上 clearfix css 就可以了，支援瀏覽器版版: &lt;a href="http://moztw.org/firefox/"&gt;Firefox&lt;/a&gt; 3.5+, &lt;a href="https://www.apple.com/tw/safari/"&gt;Safari&lt;/a&gt; 4+, &lt;a href="http://www.google.com/intl/zh-TW/chrome/browser/"&gt;Chrome&lt;/a&gt;, &lt;a href="http://www.opera.com/"&gt;Opera&lt;/a&gt; 9+, &lt;a href="http://windows.microsoft.com/zh-tw/internet-explorer/download-ie"&gt;IE&lt;/a&gt; 6+&lt;/p&gt;</description></item><item><title>Nginx 搭配 Laravel PHP Framework 設定</title><link>https://blog.wu-boy.com/2013/09/setup-laravel-with-nginx/</link><pubDate>Thu, 12 Sep 2013 07:45:45 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/09/setup-laravel-with-nginx/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6248708214/" title="Laravel PHP Framework by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm7.static.flickr.com/6038/6248708214_ef1133d0e9_o.png?resize=283%2C101&amp;#038;ssl=1" alt="Laravel PHP Framework" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 筆記在 
&lt;p&gt;&lt;a href="http://nginx.org/" target="_blank"&gt;Nginx&lt;/a&gt; 設定 &lt;a href="http://laravel.com" target="_blank"&gt;Laravel&lt;/a&gt; 專案，現在的 PHP Framework 都將 query string 整個導向首頁 index.php，就拿 &lt;a href="http://www.codeigniter.org.tw/" target="_blank"&gt;CodeIgniter&lt;/a&gt; 來說，在 &lt;a href="http://httpd.apache.org/" target="_blank"&gt;Apache&lt;/a&gt; 只要設定&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;RewriteEngine on
RewriteBase /
RewriteCond $1 !^(index\.php|images|robots\.txt|$)
RewriteRule ^(.*)$ index.php/$1 [L,QSA]&lt;/pre&gt; 在 Nginx 內只要透過 
&lt;p&gt;&lt;a href="http://wiki.nginx.org/HttpCoreModule#try_files" target="_blank"&gt;try_files&lt;/a&gt; 即可&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;location / {
 try_files $uri $uri/ /index.php
}&lt;/pre&gt; 正常來說 Laravel 直接用上面的設定即可，但是我發現在 $_GET 這全域變數會拿到空值，解法也很簡單，在 Nginx 將 query string 變數帶到 index.php 後面即可 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;location / {
 try_files $uri $uri/ /index.php?$query_string;
}&lt;/pre&gt;</description></item><item><title>Postfix mailbox 設定</title><link>https://blog.wu-boy.com/2013/09/postfix-mailbox-preference/</link><pubDate>Fri, 06 Sep 2013 11:39:58 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/09/postfix-mailbox-preference/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/9683449971/" title="Postfix_logo by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm3.staticflickr.com/2817/9683449971_5fc991dd0c_z.jpg?resize=545%2C289&amp;#038;ssl=1" alt="Postfix_logo" data-recalc-dims="1" /&gt;&lt;/a&gt; 此篇不會講太多 &lt;a href="http://www.postfix.org/" target="_blank"&gt;Postfix&lt;/a&gt; 的設定，只是紀錄如何設定 Postfix mailbox。Postfix 提供兩種 E-mail 儲存格式，一種就是將全部的 mail 都寫到同一個檔案，此方式是 Postfix 裝好後預設的模式，另外的就是一封 E-mail 一個檔案，這兩者各有優缺點好壞，前者最大的問題就在於如果該檔案壞掉，那使用者的全部 Email 就消失了，所以個人比較偏好後面方式，最主要最近裝按要實做 E-mail Queue 功能，後者才能讓程式好判斷該目錄是否有異動。&lt;/p&gt;
&lt;h3 id="mailbox-如果都不修改任何設定預設裝好-postfix就可以看到-varspoolmail-目錄下有許多使用者檔案一個使用者一個檔案當然你也可以將使檔案設定在家目錄裡面打開-etcpostfixmaincf-設定檔並加入底下設定"&gt;Mailbox 如果都不修改任何設定預設裝好 Postfix，就可以看到 /var/spool/mail/ 目錄下有許多使用者檔案，一個使用者一個檔案，當然你也可以將使檔案設定在家目錄裡面。打開 /etc/postfix/main.cf 設定檔，並加入底下設定&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;home_mailbox = Mailbox&lt;/pre&gt; 此設定會將原本放在 /var/spool/mail/ 目錄下的檔案都換成 /home/appleboy/Mailbox，注意在 bashrc 請加入 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ export MAIL=~/Mailbox&lt;/pre&gt;
&lt;h3 id="maildir-如果改成此設定就會變成一個檔案代表一封-email請在"&gt;Maildir 如果改成此設定，就會變成一個檔案代表一封 email，請在&lt;/h3&gt;
&lt;p&gt;&lt;span style="color:green"&gt;/etc/postfix/main.cf&lt;/span&gt; 加入底下設定&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;home_mailbox = Maildir/&lt;/pre&gt; 接著取消 MAIL 變數 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ unset MAIL&lt;/pre&gt; 最後寫入新的變數內容 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ export MAILDIR=~/Maildir&lt;/pre&gt; 重新啟動 postfix 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ /etc/init.d/postfix restart&lt;/pre&gt; 寄封信測試看看目錄是否有建立: 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ echo "This is the message body" | mail -s "This is the subject" root@localhost&lt;/pre&gt; 這時你會發現在自己的 Home 目錄底下多出了 
&lt;p&gt;&lt;span style="color:red"&gt;Maildir/tmp&lt;/span&gt;, &lt;span style="color:red"&gt;Maildir/cur&lt;/span&gt;, &lt;span style="color:red"&gt;Maildir/new&lt;/span&gt; 等三個目錄，代表設定成功了&lt;/p&gt;</description></item><item><title>Git rebase + stash 小技巧</title><link>https://blog.wu-boy.com/2013/08/git-rebase-stash-tip/</link><pubDate>Sun, 18 Aug 2013 03:37:01 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/08/git-rebase-stash-tip/</guid><description>&lt;p&gt;每天打開電腦，第一件事情就是將專案程式碼更新的最新，以便整合同事新開發的功能，免的跟自己寫的功能衝突，所以最常用用的就是 &lt;code&gt;git pull --rebase origin master&lt;/code&gt;，此命令使用 &lt;code&gt;rebase&lt;/code&gt; 來取代 &lt;code&gt;merge&lt;/code&gt; 程式碼，也可以避免在 log 清單內出現 &lt;code&gt;merge branch master into master&lt;/code&gt; 等字樣，但是如果在開發一半進度時，想同時將同事的程式碼先 merge 進來，會發現無法 merge，git 會請你先將 local 修改過的檔案 commit，才可以讓您更新，所以這時候我們可以用 git stash 方式來解決&lt;/p&gt;
&lt;p&gt;如果你在 master 分支上，並且想 pull 最新的 commit，可以透過底下指令步驟&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash --include-untracked
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git pull --rebase origin master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash pop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Cross Site Request Forgery in JS Web Apps and CodeIgniter PHP Framework</title><link>https://blog.wu-boy.com/2013/08/cross-site-request-in-js-web-apps-and-codeigniter-php-framework/</link><pubDate>Thu, 15 Aug 2013 03:43:44 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/08/cross-site-request-in-js-web-apps-and-codeigniter-php-framework/</guid><description>&lt;p&gt;Cross Site Request Forgery 簡稱 &lt;a href="http://en.wikipedia.org/wiki/Cross-site_request_forgery" target="_blank"&gt;CSRF&lt;/a&gt; 是網路上最常見的攻擊方式，由於前端的盛行，現在開發網站偏向前後端拆開，前端使用大量的 Javascript 及 CSS3 效果，後端則是使用 PHP, Ruby, Python… 等，前端如何拿到資料庫資料呢，必需透 過 AJAX 方式來存取，常見的後端 API 會設計成 &lt;a href="http://en.wikipedia.org/wiki/Representational_state_transfer" target="_blank"&gt;RESTful&lt;/a&gt; (GET/PUT/POST/DELETE)，後端為了擋住 CSRF 攻擊，所以限定了特殊 Content-Type Header，前端需要帶 application/json 給後端才可以拿到資料，這只能透過 Ajax requests 才可以做到。&lt;/p&gt;</description></item><item><title>Twitter Bootstrap 發佈 3 RC1 版本</title><link>https://blog.wu-boy.com/2013/07/twitter-bootstrap-release-3-rc1/</link><pubDate>Tue, 30 Jul 2013 11:19:29 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/07/twitter-bootstrap-release-3-rc1/</guid><description>&lt;p&gt;今天非常開心看到 &lt;a href="https://twitter.com/" target="_blank"&gt;Twitter&lt;/a&gt; 團隊發佈 &lt;a href="http://blog.getbootstrap.com/2013/07/27/bootstrap-3-rc1/" target="_blank"&gt;Bootstrap 3 RC1&lt;/a&gt; 版本，Twitter 這次是大動作的改版，連&lt;a href="http://getbootstrap.com/" target="_blank"&gt;官網&lt;/a&gt;都換掉了，如果你還在使用 2.3.2，Twitter 也提供之前的&lt;a href="http://getbootstrap.com/2.3.2/." target="_blank"&gt;網站版本&lt;/a&gt;，讓使用者可以繼續使用，當然希望各開發者可以盡快轉換到 3 RC1，此版本超過 1600 commits 修正。Twitter 也另外開了 &lt;a href="https://github.com/twbs" target="_blank"&gt;Github Organization&lt;/a&gt;，如果要找範例的話，可以到 &lt;a href="https://github.com/twbs/bootstrap-examples" target="_blank"&gt;bootstrap-examples&lt;/a&gt; 來看看。另外大家最關心的是效能，底下影片介紹 Bootstrap 3 vs Bootstrap 2.3.2 版本差異。&lt;/p&gt;</description></item><item><title>Linode 升級硬碟空間</title><link>https://blog.wu-boy.com/2013/07/linode-storage-space-doubled/</link><pubDate>Sat, 27 Jul 2013 00:45:42 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/07/linode-storage-space-doubled/</guid><description>&lt;p&gt;Linode 繼上次升級了&lt;a href="http://blog.wu-boy.com/2013/03/linode-nextgen-the-network-and-hardware/" target="_blank"&gt;硬體及網路設備&lt;/a&gt;，這次又來升級硬碟空間，每個方案將空間調到兩倍 &lt;a href="https://blog.linode.com/2013/07/25/storage-space-doubled/" target="_blank"&gt;Storage Space Doubled!&lt;/a&gt;，所以整體方案表格如下: &lt;a href="https://www.flickr.com/photos/appleboy/9372047355/" title="Linode by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm4.staticflickr.com/3669/9372047355_840d80c1e1_z.jpg?resize=640%2C304&amp;#038;ssl=1" alt="Linode" data-recalc-dims="1" /&gt;&lt;/a&gt; 今年的動作還真多，果然是受到同業 &lt;a href="https://www.digitalocean.com/" target="_blank"&gt;DigitalOcean&lt;/a&gt; 的影響，網路虛擬主機還是需要一點競爭比較好。&lt;/p&gt;</description></item><item><title>Coding on workspace of Chrome Developer tools</title><link>https://blog.wu-boy.com/2013/07/coding-on-workspace-of-chrome-developer-tools/</link><pubDate>Sun, 21 Jul 2013 10:48:36 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/07/coding-on-workspace-of-chrome-developer-tools/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i2.wp.com/farm8.staticflickr.com/7350/9333443162_20e7e5d5f2_m.jpg?w=840&amp;#038;ssl=1" alt="Google Chrome" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;p&gt;相信網頁設計師並不陌生 &lt;a href="https://developers.google.com/chrome-developer-tools/" target="_blank"&gt;Chrome DevTools&lt;/a&gt;，善用 DevTools 可以減少很多 Debug 時間，今天來介紹如何在 &lt;a href="https://www.google.com/intl/zh-TW/chrome/browser/" target="_blank"&gt;Chrome 瀏覽器&lt;/a&gt;上直接編輯程式，並且存檔，重新整理網頁後便可看到結果。聽到這裡大家一定會很好奇，不就開系統編輯器 (sublime, pspad, vim &amp;hellip;) 工具，直接修改 =&amp;gt; 存檔 =&amp;gt; 重新整理嘛？但是這並不稀奇阿，重點是 Chrome 瀏覽器可以直接支援 &lt;code&gt;線上編輯檔案&lt;/code&gt;，而不是透過系統工具做編輯。這就是 Chrome 強大的地方，今天就來介紹 &lt;a href="https://developers.google.com/chrome-developer-tools/docs/settings?hl=en#workspace" target="_blank"&gt;Chrome workspace&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>HAproxy 搭配 Nginx port redirect issue</title><link>https://blog.wu-boy.com/2013/07/nginx-port-redirect-issue-with-haproxy/</link><pubDate>Wed, 17 Jul 2013 11:42:13 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/07/nginx-port-redirect-issue-with-haproxy/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8684224387/" title="nginx-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm9.staticflickr.com/8401/8684224387_19de454ebf.jpg?resize=320%2C120&amp;#038;ssl=1" alt="nginx-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://haproxy.1wt.eu/" target="_blank"&gt;HAproxy&lt;/a&gt; 是一套高效能分散式系統軟體，後端可搭配 Web 或 SQL 服務，這次在後端搭配 &lt;a href="http://nginx.org/" target="_blank"&gt;Nginx&lt;/a&gt; 出現 port redirect 問題，問題很簡單，在 Haproxy 設定 80 port 對應到內部三台 Nginx 機器，但是 Nginx port 設定 8080，這樣當我們在瀏覽網址如下:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://aaa.bbb.ccc.ddd/test"&gt;http://aaa.bbb.ccc.ddd/test&lt;/a&gt; (請注意，最後沒有 slash 喔) 你會發現 Nginx 將網址轉成&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://aaa.bbb.ccc.ddd:8080/test/"&gt;http://aaa.bbb.ccc.ddd:8080/test/&lt;/a&gt; 為了避免 Nginx 自動將 port 加入到網址列，我們可以透過設定 &lt;a href="http://wiki.nginx.org/HttpCoreModule#port_in_redirect" target="_blank"&gt;port_in_redirect&lt;/a&gt;，Nginx 預設將此設定為 On，所以將此設定為 off，並且重新啟動 Nginx 即可&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;port_in_redirect off;&lt;/pre&gt;</description></item><item><title>CodeIgniter 尋找新東家</title><link>https://blog.wu-boy.com/2013/07/seeking-new-owner-for-codeigniter/</link><pubDate>Wed, 10 Jul 2013 07:13:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/07/seeking-new-owner-for-codeigniter/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;p&gt;很高興看到 &lt;a href="http://www.codeigniter.org.tw/" target="_blank"&gt;CodeIgniter&lt;/a&gt; 出了 2.1.4 版本了，距離上個版本大約 9 個月，但是這次的 Release 只針對 Security 做改善，可以參考 &lt;a href="http://www.codeigniter.org.tw/user_guide/changelog.html" target="_blank"&gt;Change Log&lt;/a&gt;。然而在今天看到 &lt;a href="http://ellislab.com" target="_blank"&gt;Ellislab&lt;/a&gt; 宣佈&lt;a href="http://ellislab.com/blog/entry/ellislab-seeking-new-owner-for-codeigniter" target="_blank"&gt;找尋 CodeIgniter 新東家&lt;/a&gt;，也就是官網不再維護此 Project，希望有新的團隊或公司可以接手，繼續讓 CodeIgniter 發揚光大，在 &lt;a href="https://github.com/" target="_blank"&gt;GitHub&lt;/a&gt; 上的 &lt;a href="https://github.com/languages/PHP" target="_blank"&gt;PHP Language&lt;/a&gt; 排名上，CodeIgniter 幾乎榜上有名，討論活躍度也是非常高的，但是公司就是找不到任何 Business Model 來支撐整個 Project 維護成本。其實觀察幾年下來，本來寫 CodeIgniter 核心人物都漸漸不在了，像是 &lt;a href="https://github.com/philsturgeon" target="_blank"&gt;@Philsturgeon&lt;/a&gt; 自己創了 &lt;a href="http://fuelphp.com/" target="_blank"&gt;Fuel PHP Framework&lt;/a&gt;，現在似乎也沒在參與此 Project？CodeIgniter 最後都是由 &lt;a href="https://github.com/narfbg" target="_blank"&gt;@narfbg&lt;/a&gt; 來 maintain 以及開發新功能，世界各地的 Pull Request 也都是由他負責審核並且參與討論，但是一個人還是無法負擔這麼多事情阿，所以現在 CodeIgniter 3.0 還是生不出來。最後希望還是有人可以接手 CodeIgniter，很期待 3.0 出來的說，都已經做了一半以上了，不要放棄阿。&lt;/p&gt;</description></item><item><title>CSS 垂直置中解法</title><link>https://blog.wu-boy.com/2013/07/css-vertical-align-center/</link><pubDate>Thu, 04 Jul 2013 05:14:21 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/07/css-vertical-align-center/</guid><description>&lt;p&gt;相信大家在 &lt;a href="http://www.google.com" target="_blank"&gt;Google&lt;/a&gt; 可以找到很多&lt;a href="https://www.google.com.tw/search?q=css+vertical-align+center&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla:en-US:official&amp;client=firefox-a" target="_blank"&gt;解法&lt;/a&gt;，這幾天在 Facebook 發現&lt;a href="https://www.facebook.com/josephj6802/posts/10200920251622230" target="_blank"&gt;更精彩的解決方式&lt;/a&gt;，就是用 &lt;a href="http://www.w3schools.com/cssref/sel_before.asp" target="_blank"&gt;CSS:before&lt;/a&gt; 跟 &lt;a href="http://www.w3schools.com/cssref/pr_class_display.asp" target="_blank"&gt;inline-block&lt;/a&gt;，底下提供範例:&lt;/p&gt;
&lt;p&gt;html 程式碼&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#8b008b;font-weight:bold"&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#8b008b;font-weight:bold"&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#8b008b;font-weight:bold"&gt;meta&lt;/span&gt; &lt;span style="color:#658b00"&gt;charset&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;utf-8&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#8b008b;font-weight:bold"&gt;title&lt;/span&gt;&amp;gt;JS Bin&amp;lt;/&lt;span style="color:#8b008b;font-weight:bold"&gt;title&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#8b008b;font-weight:bold"&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#8b008b;font-weight:bold"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#8b008b;font-weight:bold"&gt;div&lt;/span&gt; &lt;span style="color:#658b00"&gt;class&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;ot&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#8b008b;font-weight:bold"&gt;div&lt;/span&gt; &lt;span style="color:#658b00"&gt;class&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;wrapper&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#8b008b;font-weight:bold"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#8b008b;font-weight:bold"&gt;div&lt;/span&gt;&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#8b008b;font-weight:bold"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#8b008b;font-weight:bold"&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>PHP 5.5.0 Release note: support Zend OPcache</title><link>https://blog.wu-boy.com/2013/06/php-5-5-0-release-zend-opcache/</link><pubDate>Tue, 25 Jun 2013 06:53:45 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/06/php-5-5-0-release-zend-opcache/</guid><description>&lt;p&gt;&lt;a title="php-logo by appleboy46, on Flickr" href="https://www.flickr.com/photos/appleboy/6034284842/"&gt;&lt;img alt="php-logo" src="https://i2.wp.com/farm7.static.flickr.com/6186/6034284842_351ff33711_m.jpg?resize=240%2C127&amp;#038;ssl=1" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.php.net/" target="_blank"&gt;PHP&lt;/a&gt; 5.5.0 在上週 20 號正式 Release，也看到 PHP 官網終於改版了，新的版面看起來比較清爽，想嘗試新版面的朋友們，可以點選官網最上面鎖提示的 Bar，如果覺得新版面不是很好看，也可以切回去舊版。本篇來介紹 PHP 5.5.0 有哪些新 Feature。&lt;/p&gt;
&lt;h2 id="新增-generators-and-coroutines-功能"&gt;新增 generators and coroutines 功能&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://php.net/generators" target="_blank"&gt;Generators&lt;/a&gt; 提供了最簡單的寫法來實做 iterators，而不需要實做 Class 去實做 Iterator 介面，generators function 就跟一般的 PHP function 一樣，只是多了 yield 這 keyword，簡單舉個例子&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;?php
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;function&lt;/span&gt; &lt;span style="color:#008b45"&gt;gen_one_to_three&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;for&lt;/span&gt; (&lt;span style="color:#00688b"&gt;$i&lt;/span&gt; = &lt;span style="color:#b452cd"&gt;1&lt;/span&gt;; &lt;span style="color:#00688b"&gt;$i&lt;/span&gt; &amp;lt;= &lt;span style="color:#b452cd"&gt;3&lt;/span&gt;; &lt;span style="color:#00688b"&gt;$i&lt;/span&gt;++) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#228b22"&gt;// Note that $i is preserved between yields.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;yield&lt;/span&gt; &lt;span style="color:#00688b"&gt;$i&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b"&gt;$generator&lt;/span&gt; = gen_one_to_three();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;foreach&lt;/span&gt; (&lt;span style="color:#00688b"&gt;$generator&lt;/span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;as&lt;/span&gt; &lt;span style="color:#00688b"&gt;$value&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#cd5555"&gt;$value\n&lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#a61717;background-color:#e3d2d2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>How to install Gearman on Ubuntu or Debian with MySQL 安裝測試篇</title><link>https://blog.wu-boy.com/2013/06/how-to-install-gearman-on-ubuntu-or-debian-with-mysql/</link><pubDate>Thu, 13 Jun 2013 09:31:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/06/how-to-install-gearman-on-ubuntu-or-debian-with-mysql/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i2.wp.com/gearman.org/_media/:wiki:logo.png?w=840" alt="" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://gearman.org/" target="_blank"&gt;Gearman&lt;/a&gt; 可以在背景幫忙處理繁瑣的工作，例如壓縮影片、處理縮圖、發送認證信…等，這次不會提到太多 Gearman 介紹，如果想瞭解 Gearman 可以參考&lt;a href="http://www.jaceju.net/" target="_blank"&gt;小鐵兄&lt;/a&gt;寫的 &lt;a href="http://www.jaceju.net/blog/archives/1211/" target="_blank"&gt;Gearman 心得&lt;/a&gt;，此篇會筆記如何在 Ubuntu or Debian 安裝 Gearman 搭配 MySQL 服務，當然如果你不是使用 MySQL，也可以另外搭配 &lt;a href="http://memcached.org/" target="_blank"&gt;Memcached&lt;/a&gt; 或 &lt;a href="http://www.sqlite.org/" target="_blank"&gt;SQLite&lt;/a&gt; 都可以&lt;/p&gt;</description></item><item><title>JSDC 和 KSDG 影音紀錄 (淺談 GruntJS 整合開發工具)</title><link>https://blog.wu-boy.com/2013/06/jsdc-ksdg-gruntjs-tool/</link><pubDate>Tue, 11 Jun 2013 02:38:38 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/06/jsdc-ksdg-gruntjs-tool/</guid><description>&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;a title="gruntlogo by appleboy46, on Flickr" href="https://www.flickr.com/photos/appleboy/8591850168/"&gt;&lt;img alt="gruntlogo" src="https://i2.wp.com/farm9.staticflickr.com/8244/8591850168_ca0e125ffa_n.jpg?resize=200%2C200&amp;#038;ssl=1" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 很高興今年在 
&lt;p&gt;&lt;a href="http://jsdc.tw/2013/" target="_blank"&gt;JSDC&lt;/a&gt; 擔任講師，演講主題為『&lt;a href="http://blog.wu-boy.com/2013/05/2013-javascript-conference-front-tool-grunt-js/" target="_blank"&gt;你不可不知的前端開發工具&lt;/a&gt;』，這場議程只有30分鐘可以講，時間實在是不太夠，要消化這麼多工具其實對於聽眾有點困難，真是對不起聽眾了，不過沒關係，高雄 &lt;a href="https://www.facebook.com/groups/KSDGroup" target="_blank"&gt;KSDG&lt;/a&gt; 五月份邀請我講『&lt;a href="http://blog.wu-boy.com/2013/05/how-to-integrate-front-end-tools-via-gruntjs/" target="_blank"&gt;打造團隊共同開發環境&lt;/a&gt;』，其實就是將 &lt;a href="http://gruntjs.com/" target="_blank"&gt;GruntJS&lt;/a&gt; 精華整個講一遍，大概有一個多小時，底下是官方影音，如果朋友們沒北上參加，也可以透過 &lt;a href="http://www.youtube.com/user/JSDCTW/videos" target="_blank"&gt;JSDC Youtube&lt;/a&gt; 來欣賞。 JSDC 35分鐘議程&lt;/p&gt;</description></item><item><title>Nginx + phpMyAdmin 搭配 SSL 設定</title><link>https://blog.wu-boy.com/2013/06/force-phpmyadmin-ssl-with-nginx/</link><pubDate>Sat, 08 Jun 2013 07:51:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/06/force-phpmyadmin-ssl-with-nginx/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8171305355/" title="mysql_logo by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm9.staticflickr.com/8488/8171305355_7fb578fdc9.jpg?w=300&amp;#038;ssl=1" alt="mysql_logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://www.phpmyadmin.net/home_page/index.php" target="_blank"&gt;phpMyAdmin&lt;/a&gt; 是一套用來管理 &lt;a href="http://www.mysql.com/" target="_blank"&gt;MySQL&lt;/a&gt; 的 Web 介面，如果要讓 phpMyAdmin 強制走 https 的話，可以透過兩種方式，一種是直接設定 phpMyAdmin，另外一種方式是透過 &lt;a href="http://httpd.apache.org/docs/current/mod/mod_rewrite.html" target="_blank"&gt;Apache rewrite&lt;/a&gt; 或 &lt;a href="http://nginx.org/" target="_blank"&gt;Nginx&lt;/a&gt; 設定，底下來分別說明。&lt;/p&gt;</description></item><item><title>高雄 KSDG 分享: 打造團隊共同開發環境</title><link>https://blog.wu-boy.com/2013/05/how-to-integrate-front-end-tools-via-gruntjs/</link><pubDate>Sat, 25 May 2013 13:28:21 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/05/how-to-integrate-front-end-tools-via-gruntjs/</guid><description>&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;a title="gruntlogo by appleboy46, on Flickr" href="https://www.flickr.com/photos/appleboy/8591850168/"&gt;&lt;img alt="gruntlogo" src="https://i2.wp.com/farm9.staticflickr.com/8244/8591850168_ca0e125ffa_n.jpg?resize=200%2C200&amp;#038;ssl=1" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 很高興受到高雄 
&lt;p&gt;&lt;a href="https://www.facebook.com/groups/KSDGroup/" target="_blank"&gt;KSDG&lt;/a&gt; 邀請，分享上禮拜在 &lt;a href="http://jsdc.tw/2013/" target="_blank"&gt;JSDC&lt;/a&gt; 所介紹主題: &lt;a href="http://blog.wu-boy.com/2013/05/2013-javascript-conference-front-tool-grunt-js/" target="_blank"&gt;你不可不知的前端開發工具&lt;/a&gt;，在 JSDC 現場只有半小時可以講，這次在高雄有一個半小時可以講，如果想詳細了解前端工具，可以參考上禮拜的投影片，底下是在高雄軟體科技園區所分享。謝謝 &lt;a href="https://www.facebook.com/hsuani.bi" target="_blank"&gt;Eric Bi&lt;/a&gt; 及工作人員可以讓我分享這次議題。&lt;/p&gt;</description></item><item><title>Flickr 改版及收費方式改變</title><link>https://blog.wu-boy.com/2013/05/flickr-pro-limits-and-free-accounts/</link><pubDate>Tue, 21 May 2013 03:29:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/05/flickr-pro-limits-and-free-accounts/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm9.staticflickr.com/8267/8760804361_8fb7888250.jpg?w=840&amp;#038;ssl=1" alt="" data-recalc-dims="1" /&gt;
&lt;/div&gt; 在
&lt;p&gt;&lt;a href="http://www.cool3c.com/" target="_blank"&gt;癮科技&lt;/a&gt;看到 &lt;a href="http://www.cool3c.com/article/67746" target="_blank"&gt;Flickr大改版，收費方式也有異動&lt;/a&gt;，&lt;a href="https://www.flickr.com" target="_blank"&gt;Flickr&lt;/a&gt; 整個介面大改版，這個就算了，連收費方式也大改，本來 Pro 的用戶，以後不再有 &lt;strong&gt;&lt;span style="color:red"&gt;Unlimited storage&lt;/span&gt;&lt;/strong&gt; 的優惠了，等到 pro 帳戶到期，系統會將帳戶轉為 Free 機制，雖然容量有到 1TB 的空間，其實也用不太完，但是整個感覺非常不好。 Flickr 目前只有三種帳戶機制，Free, Ad Free, Doublr，三個差異沒有很多，Free 的帳戶幾乎同等於之前的 pro 帳戶，只是有容量限制上限 1TB，再來就是有廣告，接著 Ad Free 一年49美金，差別就是沒有廣告，最後 Doublr 只是容量變成 2TB，也沒有廣告，但是價錢 &amp;hellip;.. 每年 499.9 美金 .. 這價位，真的還蠻高的，我想之後也不打算續約了。更多 FQA 可以參考 &lt;a href="https://www.flickr.com/help/limits/" target="_blank"&gt;Free Accounts, Upgrading and Gifts&lt;/a&gt;&lt;/p&gt;</description></item><item><title>2013 Javascript Conference: 你不可不知的前端開發工具</title><link>https://blog.wu-boy.com/2013/05/2013-javascript-conference-front-tool-grunt-js/</link><pubDate>Sun, 19 May 2013 05:56:03 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/05/2013-javascript-conference-front-tool-grunt-js/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm6.staticflickr.com/5454/7238452668_82262e37dc_o.png?w=840&amp;#038;ssl=1" alt="JSDC 2013" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;p&gt;台灣第 2 屆 JavaScript 研討會在 5/18, 5/19 登場，今年報到率到 95% 了，我也給了一場 Talk，關於前端工具介紹，包含 &lt;a href="http://coffeescript.org/" target="_blank"&gt;CoffeeScript&lt;/a&gt;, &lt;a href="http://compass-style.org/" target="_blank"&gt;Compass&lt;/a&gt;, &lt;a href="http://livereload.com/" target="_blank"&gt;Livereload&lt;/a&gt;, &lt;a href="http://bower.io/" target="_blank"&gt;Bower&lt;/a&gt; Package Manager .. 等，最後介紹主軸 &lt;a href="http://gruntjs.com/" target="_blank"&gt;Grunt.js&lt;/a&gt; 來整合這些工具。&lt;/p&gt;</description></item><item><title>IE 6 瀏覽器用戶全球分佈</title><link>https://blog.wu-boy.com/2013/05/internet-explorer-6-countdown/</link><pubDate>Wed, 15 May 2013 06:21:51 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/05/internet-explorer-6-countdown/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8739672579/" title="IE_world by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm8.staticflickr.com/7291/8739672579_3eff76916f_z.jpg?resize=640%2C357&amp;#038;ssl=1" alt="IE_world" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 此資料來自 
&lt;p&gt;&lt;a href="http://www.ie6countdown.com/" target="_blank"&gt;The Internet Explorer 6 Countdown&lt;/a&gt;，大家注意上面圖示，沒想到台灣高居第二名，佔了 3.5% 僅次於大陸的 24%，大陸不感到意外，但是台灣的比例還真是高，難怪一堆程式開發者，抱怨連連 XD，這是統計到 2013 年 04 月，在這邊紀錄一下，等到明年這個時候再來看看此統計圖。&lt;/p&gt;</description></item><item><title>Backbone Routing pushState in IE</title><link>https://blog.wu-boy.com/2013/05/backbone-routing-pushstate-in-ie/</link><pubDate>Thu, 09 May 2013 05:26:58 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/05/backbone-routing-pushstate-in-ie/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/7059615321/" title="backbone by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm6.staticflickr.com/5338/7059615321_097833dea8.jpg?resize=451%2C80&amp;#038;ssl=1" alt="backbone" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; Backbone.js 幫忙處理掉所有瀏覽器 
&lt;p&gt;&lt;a href="http://diveintohtml5.info/history.html" target="_blank"&gt;Html5 History pushState&lt;/a&gt; 功能，除了 IE 9 以下(含 IE 9)不支援 &lt;strong&gt;history.pushState()&lt;/strong&gt; 跟 &lt;strong&gt;history.replaceState()&lt;/strong&gt;，其他 Browser 幾乎都支援了，在 &lt;a href="http://backbonejs.org" target="_blank"&gt;Backbone.js&lt;/a&gt; 如何處理 URL 變化呢？以往透過 handle URL hash 來決定網頁要處理哪些資料，這也是 Backbone 預設的處理方式，範例如下 URL:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;http://xxx/#!/user/list http://xxx/#!/user/add&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>測試 Web Responsive Design Tool</title><link>https://blog.wu-boy.com/2013/05/web-responsive-design-test-tool/</link><pubDate>Fri, 03 May 2013 03:21:45 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/05/web-responsive-design-test-tool/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8703913582/" title="responsive-website-design-tips by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm9.staticflickr.com/8395/8703913582_1e15c97803.jpg?resize=500%2C294&amp;#038;ssl=1" alt="responsive-website-design-tips" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Web CSS Programer 在撰寫 Responsive CSS Style 時，手邊一定會有一堆 Device，來測試當畫面小於 480 px 或大於 768 px 時，呈現的版面是否有亂掉，公司也花費許多成本來測試，現在不需要這樣了，我們可以透過線上 Tool 或者是 Plugin 來測試 Responsive Web Page，首先來介紹&lt;/p&gt;
&lt;p&gt;&lt;a href="http://lab.maltewassermann.com/viewport-resizer/" target="_blank"&gt;Viewport resizer&lt;/a&gt;，此工具用法很簡單，進入官網後，將官網 Javascript 連結加入到我的最愛或 bookmarks，之後打開您的測試網站，再點選該 bookmark，你會發現網站上面多了一條 tool bar，可以自訂或調整 view size，預設也給了平板手機等多種畫面調整，讓您測試 &lt;a href="https://developer.mozilla.org/en-US/docs/CSS/Media_queries" target="_blank"&gt;Media Queries&lt;/a&gt; 是否有錯誤。&lt;/p&gt;</description></item><item><title>Install Nginx + spdy module on Ubuntu or Debian</title><link>https://blog.wu-boy.com/2013/04/install-nginx-spdy-module-on-ubuntu-or-debian/</link><pubDate>Tue, 30 Apr 2013 15:42:30 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/04/install-nginx-spdy-module-on-ubuntu-or-debian/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8684224387/" title="nginx-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm9.staticflickr.com/8401/8684224387_19de454ebf.jpg?resize=320%2C120&amp;#038;ssl=1" alt="nginx-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 上一篇提到 
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/2013/04/nginx-1-4-0-support-spdy-module/" target="_blank"&gt;nginx 1.4.0 釋出並支援 SPDY&lt;/a&gt;，教學環境是 CentOS，這次在 Ubuntu 環境編譯遇到&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;/usr/bin/ld: cannot find -lperl 找不到 perl library，解法可以透過 aptitude 安裝 libperl5.14，安裝好後，到 /usr/lib 底下找到 libperl.so.5.14.2，由於檔案命名關係，請用 ln 將檔案 link 成 libperl.so&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ ln -s libperl.so.5.14.2 libperl.so&lt;/pre&gt; 接著可以正確編譯了，底下安裝相關套件 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ aptitude -y install libpcre3-dev libgd-dev libgd2-xpm-dev libgeoip-dev&lt;/pre&gt;</description></item><item><title>nginx 1.4.0 釋出並支援 SPDY</title><link>https://blog.wu-boy.com/2013/04/nginx-1-4-0-support-spdy-module/</link><pubDate>Sun, 28 Apr 2013 08:15:48 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/04/nginx-1-4-0-support-spdy-module/</guid><description>&lt;p&gt;&lt;strong&gt;Update: 由於 OpenSSL CVE-2014-0160 Heartbleed Security，請將 openssl 升級到 1.0.1g 版本&lt;/strong&gt;&lt;/p&gt;
&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8684224387/" title="nginx-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm9.staticflickr.com/8401/8684224387_19de454ebf.jpg?resize=320%2C120&amp;#038;ssl=1" alt="nginx-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;很高興看到 &lt;a href="http://nginx.org/" target="_blank"&gt;Nginx&lt;/a&gt; Release 1.4.0 版本，此新版本開始支援 &lt;a href="http://nginx.org/en/docs/http/ngx_http_spdy_module.html" target="_blank"&gt;SPDY module&lt;/a&gt;，對於 SPDY 還不熟悉了解的，可以參考今年 &lt;a href="http://www.webconf.tw" target="_blank"&gt;2013 WebConf&lt;/a&gt; 講師 ihower 介紹的 &lt;a href="http://www.slideshare.net/ihower/a-brief-introduction-to-spdy-http20" target="_blank"&gt;A brief introduction to SPDY - 邁向 HTTP/2.0&lt;/a&gt;，要提升整個 Web Performance，可以將 SPDY 導入，對於使用 Apache 使用者，請參考 &lt;a href="http://code.google.com/p/mod-spdy/" target="_blank"&gt;mod_spdy&lt;/a&gt;，如果是 Nginx 用戶，在 1.3.x 版本，可以直接用官方 &lt;a href="http://nginx.org/patches/spdy/patch.spdy.txt"&gt;patch&lt;/a&gt;，升級到 1.4.x 就不需要 patch 了，但 OS 是 &lt;a href="http://www.ubuntu.com/" target="_blank"&gt;Ubuntu&lt;/a&gt; 或 &lt;a href="http://www.centos.org/" target="_blank"&gt;CentOS&lt;/a&gt; 系列是需要自行編譯，這次會筆記在 CentOS 下將 spdy 編譯進系統。&lt;/p&gt;
&lt;h3 id="安裝方式"&gt;安裝方式&lt;/h3&gt;
&lt;p&gt;先看 Ngix 是否有支援 spdy，直接下 nginx -V 觀看&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;nginx version: nginx/1.1.19 TLS SNI support enabled configure arguments: &amp;ndash;prefix=/etc/nginx &amp;ndash;conf-path=/etc/nginx/nginx.conf &amp;ndash;erth=/var/lib/nginx/body &amp;ndash;http-fastcgi-temp-path=/var/lib/nginx/fastcgi &amp;ndash;http-lb/nginx/proxy &amp;ndash;http-scgi-temp-path=/var/lib/nginx/scgi &amp;ndash;http-uwsgi-temp-path==/var/run/nginx.pid &amp;ndash;with-debug &amp;ndash;with-http_addition_module &amp;ndash;with-http_dav_moith-http_image_filter_module &amp;ndash;with-http_realip_module &amp;ndash;with-http_stub_status__xslt_module &amp;ndash;with-ipv6 &amp;ndash;with-sha1=/usr/include/openssl &amp;ndash;with-md5=/usr/includ/buildd/nginx-1.1.19/debian/modules/nginx-auth-pam &amp;ndash;add-module=/build/buildd/d/nginx-1.1.19/debian/modules/nginx-upstream-fair &amp;ndash;add-module=/build/buildd/ng&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Fabric 管理多台 Linux 機器的 command tool</title><link>https://blog.wu-boy.com/2013/04/fabric-ssh-for-deploy-or-systems-administration/</link><pubDate>Thu, 25 Apr 2013 16:35:37 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/04/fabric-ssh-for-deploy-or-systems-administration/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8679381967/" title="python-logo-master-v3-TM by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm9.staticflickr.com/8123/8679381967_75cee4e0e9_n.jpg?resize=320%2C108&amp;#038;ssl=1" alt="python-logo-master-v3-TM" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 相信 Administrator 管理過兩台以上的 Linux Server 都一定會找 tool 讓多台機器同時執行指令，這也應用在 Deploy 任何 application 到多台機器或者是同時更新系統套件…等，網路上有蠻多套 command line tool 像是 
&lt;p&gt;&lt;a href="https://github.com/capistrano/capistrano" target="_blank"&gt;capistrano&lt;/a&gt;、&lt;a href="http://docs.fabfile.org" target="_blank"&gt;Fabric&lt;/a&gt;、&lt;a href="http://code.google.com/p/parallel-ssh/" target="_blank"&gt;pssh&lt;/a&gt;、&lt;a href="http://packages.debian.org/search?keywords=dsh" target="_blank"&gt;dsh&lt;/a&gt;…等都，本篇會以 &lt;a href="http://www.python.org/" target="_blank"&gt;Python&lt;/a&gt; 所推的 Fabric 來做介紹。另外 Ruby 所寫的 capistrano tool 也是不錯的選擇，這兩套其實大同小異，可以將 Deploy 的邏輯寫成單一 file 再透過 task 定義來決定執行的工作。當然你也可以透過此 tool 來管理 local 端動作，但是這有點多此一舉，因為基本的 Shell 就可以完成了，如果熟悉 Python 則選 fabric，如果喜歡寫 &lt;a href="http://www.ruby-lang.org/en/" target="_blank"&gt;Ruby&lt;/a&gt; 則可以試試看 capistrano。&lt;/p&gt;
&lt;h3 id="安裝方式installation-如果是"&gt;安裝方式(Installation) 如果是&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.centos.org/" target="_blank"&gt;CentOS&lt;/a&gt; 系列可以透過 yum 套件管理，&lt;a href="http://www.ubuntu.com/" target="_blank"&gt;Ubuntu&lt;/a&gt; 或 &lt;a href="http://www.debian.org/" target="_blank"&gt;Debian&lt;/a&gt; 則是透過 aptitude 方式安裝。 Yum&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# install python pip tool and fabric command
yum -y install python-pip
pip-python install fabric&lt;/pre&gt; APT 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# install python easy_install
aptitude -y install python-pip
# install fabric command
pip install fabric&lt;/pre&gt; 安裝 capistrano 可以透過 Ruby gem。 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ gem install capistrano&lt;/pre&gt;</description></item><item><title>Linode 最後優惠 升級記憶體</title><link>https://blog.wu-boy.com/2013/04/linode-nextgen-ram-upgrade/</link><pubDate>Sat, 13 Apr 2013 03:20:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/04/linode-nextgen-ram-upgrade/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/www.linode.com/images/linode_logo_gray.png?w=840" alt="Linode VPS" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://www.linode.com/" target="_blank"&gt;Linode&lt;/a&gt; 最後的&lt;a href="http://blog.linode.com/2013/04/09/linode-nextgen-ram-upgrade/" target="_blank"&gt;優惠出來&lt;/a&gt;了，之前寫了一篇 &lt;a href="http://blog.wu-boy.com/2013/03/linode-nextgen-the-network-and-hardware/" target="_blank"&gt;Linode VPS 升級網路及硬體設備&lt;/a&gt;，回顧 Linode 今年的優惠大清倉，第一次專注在網路效能及流量頻寬升級，第二次則著重在硬體升級，也就是升級 CPU，那這次要升級什麼呢，難不成 Linode 有聽到上一篇最後我講到的心聲，就是記憶體升級啦，Linode 大手筆將全部 Plan 的記憶體都 double，底下這張圖就是升級過後的價目表。 &lt;a href="https://www.flickr.com/photos/appleboy/8644720634/" title="Linode - Xen VPS Hosting 2013-04-13 11-04-36 by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm9.staticflickr.com/8523/8644720634_2aa50ba238.jpg?resize=500%2C198&amp;#038;ssl=1" alt="Linode - Xen VPS Hosting 2013-04-13 11-04-36" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[小技巧] JavaScript Cross Browser Best Practices</title><link>https://blog.wu-boy.com/2013/04/javascript-cross-browser-best-practices/</link><pubDate>Fri, 12 Apr 2013 02:50:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/04/javascript-cross-browser-best-practices/</guid><description>&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;a title="ie-logo-small by appleboy46, on Flickr" href="https://www.flickr.com/photos/appleboy/8443574444/"&gt;&lt;img alt="ie-logo-small" src="https://i2.wp.com/farm9.staticflickr.com/8216/8443574444_c01f821c31_m.jpg?resize=240%2C240&amp;#038;ssl=1" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 先前寫了一篇 
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/2013/02/testing-for-internet-explorer-with-web-page/" target="_blank"&gt;modern.IE 的使用方式及介紹&lt;/a&gt;，今天在 &lt;a href="http://Facebook.com" target="_blank"&gt;Facebook&lt;/a&gt; 上看到 &lt;a href="https://twitter.com/ericsk" target="_blank"&gt;Eric Shangkuan&lt;/a&gt; 說已經有了&lt;a href="http://www.modern.ie/zh-tw" target="_blank"&gt;中文介面&lt;/a&gt;，如果你的瀏覽器是中文版，應該就可以直接看到中文介面了，裡面有篇文章非常重要，寫 Web 的工程師都必須注意，那就是 &lt;a href="http://www.modern.ie/zh-tw/cross-browser-best-practices" target="_blank"&gt;Cross Browser Best Practices&lt;/a&gt;，這篇文章教您如何撰寫相容於舊版 IE 瀏覽器的一些小技巧，這些技巧也不只用在 IE 上，更是教您在實做 CSS，JavaScript 的注意事項。我們來看看 Javascript 的小技巧。&lt;/p&gt;</description></item><item><title>MySQL 用 MySQLDump 備份 InnoDB 注意事項</title><link>https://blog.wu-boy.com/2013/04/best-mysqldump-innodb-data/</link><pubDate>Fri, 05 Apr 2013 02:20:22 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/04/best-mysqldump-innodb-data/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8171305355/" title="mysql_logo by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm9.staticflickr.com/8488/8171305355_7fb578fdc9.jpg?w=300&amp;#038;ssl=1" alt="mysql_logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 大家在備份 
&lt;p&gt;&lt;a href="http://www.mysql.com/" target="_blank"&gt;MySQL&lt;/a&gt; 資料庫時一定是使 mysqldump 指令，不管是 MyISAM 或 &lt;a href="http://dev.mysql.com/doc/refman/5.5/en/innodb-storage-engine.html" target="_blank"&gt;InnoDB&lt;/a&gt; 都一樣， 在處理 InnoDB 格式備份時使用 &lt;strong&gt;&lt;span style="color:green"&gt;mysqldump -single-transaction&lt;/span&gt;&lt;/strong&gt;，但是你會發現在大多的備份狀況都是 OK 的，只是有時候會發現有的資料表只有備份到 structure 而無備份到 Data？ 在 &lt;a href="http://www.mysqlperformanceblog.com" target="_blank"&gt;MySQL Performance Blog&lt;/a&gt; 看到這篇講解 &lt;a href="http://www.mysqlperformanceblog.com/2012/03/23/best-kept-mysqldump-secret/" target="_blank"&gt;Best kept MySQLDump Secret&lt;/a&gt;，此問題出在 how MySQL’s Transactions work with DDL，ALTER TABLE 會建立一個 temporary table，並且將該資料表資料複製過去，接著刪除原有資料表，最後將 temporary table 命名為原來資料表。 底下是原作者提到的原因&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How does data visibility works in this case ? DDLs are not transactional and as such the running transaction will not see the contents of old table once it is dropped, transaction also will see the new table which was created after transaction was started, including table created by ALTER TABLE statement. Transactions however apply to DATA which is stored in this table and so data which was inserted after start of transaction (by ALTER TABLE statement) will not be visible. In the end we will get new structure in the dump but no data. 最好的解法就是改用 &lt;strong&gt;&lt;span style="color:green"&gt;mysqldump -lock-all-tables&lt;/span&gt;&lt;/strong&gt;，但是備份的時候，資料庫是無法寫入，僅能讀取，也或者可以透過 &lt;a href="http://blog.wu-boy.com/2013/01/percona-xtrabackup-innodb/" target="_blank"&gt;Percona Xtrabackup&lt;/a&gt; 工具來備份 InnoDB。&lt;/p&gt;</description></item><item><title>Galera Cluster for MySQL Multi-master Replication</title><link>https://blog.wu-boy.com/2013/03/galera-cluster-for-mysql-multi-master-replication/</link><pubDate>Sun, 31 Mar 2013 04:48:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/03/galera-cluster-for-mysql-multi-master-replication/</guid><description>&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;a title="galera_mysql_replication by appleboy46, on Flickr" href="https://www.flickr.com/photos/appleboy/8603447002/"&gt;&lt;img alt="galera_mysql_replication" src="https://i0.wp.com/farm9.staticflickr.com/8383/8603447002_050ecd1b53.jpg?resize=500%2C247&amp;#038;ssl=1" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 最近公司買了幾台機架伺服器來處理 HTTP 跟 DB Load balancer，要做到 DB 的分散式架構，首先需要同步多台機器資料，也就是寫入或更動任意一台單筆資料，另外平行的機器也會同時進行更新。同步的好處可以用來做備援及分散處理連線，而要做到此功能，可子參考網路上評價不錯的 
&lt;p&gt;&lt;a href="http://www.codership.com/content/using-galera-cluster" target="_blank"&gt;Galera Cluster for MySQL&lt;/a&gt; 方案。本篇會介紹在 &lt;a href="http://www.ubuntu.com/" target="_blank"&gt;Ubuntu&lt;/a&gt; 或 &lt;a href="http://www.centos.org/" target="_blank"&gt;CentOS&lt;/a&gt; 6.x final 版本如何安裝 Galera 伺服器套件及設定。要架設 Galera Cluster Server，有兩種套件選擇，一個是 &lt;a href="http://www.percona.com/software/percona-xtradb-cluster" target="_blank"&gt;Percona XtraDB Cluster&lt;/a&gt; 另一個是 &lt;a href="https://downloads.mariadb.org/mariadb-galera/" target="_blank"&gt;MariaDB Galera Cluster&lt;/a&gt;，這次作者會介紹後者的安裝。&lt;/p&gt;
&lt;h3 id="galera-cluster-介紹-為什麼要選擇-galera-cluster-server它有什麼優點及功能呢mysqlgalera-是一套可以同步多台-mysqlinnodb-機器的叢集系統底下可以列出功能"&gt;Galera Cluster 介紹 為什麼要選擇 Galera Cluster Server，它有什麼優點及功能呢？MySQL/Galera 是一套可以同步多台 MySQL/InnoDB 機器的叢集系統，底下可以列出功能。&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;同步複製資料&lt;/li&gt;
&lt;li&gt;可讀取和寫入叢集系統內任一節點&lt;/li&gt;
&lt;li&gt;自動偵測節點錯誤，如果有節點當機，則叢集系統自動移除該節點&lt;/li&gt;
&lt;li&gt;可任意擴充節點&lt;/li&gt;
&lt;li&gt;採用 row level 方式來平行複製資料 從上面功能看來，我們可以平行任意擴充節點，動態增加伺服器到叢集系統，要做到上面功能，就是利用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://www.codership.com/products/galera_replication" target="_blank"&gt;Galera library&lt;/a&gt; 來做到同步資料處理，同步的詳細細節，可以參考 Galera library 連結。這邊就不再多描述了。&lt;/p&gt;</description></item><item><title>統一開發者編輯器 Coding Style</title><link>https://blog.wu-boy.com/2013/03/coding-style-tool-editorconfig/</link><pubDate>Thu, 28 Mar 2013 06:50:07 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/03/coding-style-tool-editorconfig/</guid><description>&lt;p&gt;在多人開發專案時候，一定會遇到大家使用的編輯器大不相同 &lt;a href="http://macromates.com/" target="_blank"&gt;TextMate&lt;/a&gt;, &lt;a href="http://www.vim.org/" target="_blank"&gt;Vim&lt;/a&gt;, &lt;a href="http://www.sublimetext.com/" target="_blank"&gt;Sublime Text 2&lt;/a&gt;, &lt;a href="http://www.geany.org/" target="_blank"&gt;Geany&lt;/a&gt;, &lt;a href="http://notepad-plus-plus.org/" target="_blank"&gt;Notepad++&lt;/a&gt;…等，該如何統一程式碼的一致性呢？這邊要講得不是各種語言的 Coding Style，而是編輯器的設定，例如大家一定會遇到有的開發者使用 Tab 另外一群人使用 Space，在同一專案裡面就會發現有的 tab 有的 space，這樣看起來非常的亂，該如何統一大家的預設 indent style，就是要使用 &lt;a href="http://editorconfig.org/" target="_blank"&gt;EditorConfig&lt;/a&gt; 啦。使用方式很簡單，可以在專案目錄內加入 .editorconfig 內容設定如下&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;; EditorConfig is awesome: http://EditorConfig.org

root = true ; top-most EditorConfig file

; Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true

; 4 space indentation
[*.py]
indent_style = space
indent_size = 4

; Tab indentation (no size specified)
[*.js]
indent_style = tab

; Indentation override for all JS under lib directory
[lib/**.js]
indent_style = space
indent_size = 2&lt;/pre&gt; 設定方式真的很簡單，如果是 Makefile 可以加入底下 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;[Makefile]
indent_style = tab&lt;/pre&gt; 設定完成，最後只要裝上編輯器的 Plugin 即可，可以
&lt;p&gt;&lt;a href="http://editorconfig.org/#download" target="_blank"&gt;參考這裡&lt;/a&gt;，目前支援編輯器如下&lt;/p&gt;</description></item><item><title>Javascript command line tool GruntJS 介紹</title><link>https://blog.wu-boy.com/2013/03/javascript-command-line-tool-gruntjs/</link><pubDate>Tue, 26 Mar 2013 07:35:21 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/03/javascript-command-line-tool-gruntjs/</guid><description>&lt;p&gt;&lt;strong&gt;Update: 補上一張執行後的截圖 2013.03.27&lt;/strong&gt;&lt;/p&gt;
&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;a title="gruntlogo by appleboy46, on Flickr" href="https://www.flickr.com/photos/appleboy/8591850168/"&gt;&lt;img alt="gruntlogo" src="https://i2.wp.com/farm9.staticflickr.com/8244/8591850168_ca0e125ffa_n.jpg?resize=320%2C320&amp;#038;ssl=1" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://gruntjs.com/" target="_blank"&gt;GruntJS&lt;/a&gt; 是一套 JavaScript Task Runner，為什麼官網會這樣寫呢？網站上線之前，是不是需要經過測試，壓縮，及品質控管，這些 Task 該如何實現，在 GruntJS 還沒出現之前，大家可以透過 Linux command 的方式來達成，但是對於前端工程師而言，多學習 command line 真的是要他們的命，所以 GruntJS 解決了此問題，將所有的 Task 用 Javascript 方式設定就可以自動佈署或測試。GruntJS 的 Plugin 也非常多且完整，像是大家常用的 &lt;a href="http://coffeescript.org/" target="_blank"&gt;CoffeeScript&lt;/a&gt;、&lt;a href="http://handlebarsjs.com/" target="_blank"&gt;Handlebars&lt;/a&gt;、&lt;a href="http://jade-lang.com/" target="_blank"&gt;Jade&lt;/a&gt;、&lt;a href="http://www.jshint.com/" target="_blank"&gt;JsHint&lt;/a&gt;、&lt;a href="http://lesscss.org/" target="_blank"&gt;Less&lt;/a&gt;、&lt;a href="http://sass-lang.com/" target="_blank"&gt;Sass&lt;/a&gt;、&lt;a href="http://compass-style.org/" target="_blank"&gt;Compass&lt;/a&gt;、&lt;a href="http://learnboost.github.com/stylus/" target="_blank"&gt;Stylus&lt;/a&gt;…等都有支援。更多好用的 Plugin 可以在&lt;a href="http://gruntjs.com/plugins" target="_blank"&gt;官網搜尋頁面&lt;/a&gt;上找到。&lt;/p&gt;
&lt;h3 id="安裝方式-grunt-可以透過"&gt;安裝方式 Grunt 可以透過&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://nodejs.org/" target="_blank"&gt;Node.js&lt;/a&gt; 的管理工具 &lt;a href="https://npmjs.org/" target="_blank"&gt;npm&lt;/a&gt; 方式來安裝，Windows 只要到 Node.js 官網下載安裝包，直接按下一步即可安裝完畢，Linux 可以透過 NVM 方式來管理 Node.js 版本，可以參考作者之前寫的 &lt;a href="http://blog.wu-boy.com/2013/01/node-version-manager/" target="_blank"&gt;Node Version Manager 版本管理 NVM&lt;/a&gt;。需要注意的是 Grunt 0.4.x 需要 Node.js &lt;span style="color: red;"&gt;&lt;strong&gt;&amp;gt;= 0.8.0&lt;/strong&gt;&lt;/span&gt; 版本才可以。&lt;/p&gt;</description></item><item><title>Linode VPS 升級網路及硬體設備</title><link>https://blog.wu-boy.com/2013/03/linode-nextgen-the-network-and-hardware/</link><pubDate>Thu, 21 Mar 2013 11:00:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/03/linode-nextgen-the-network-and-hardware/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/www.linode.com/images/linode_logo_gray.png?w=840" alt="Linode VPS" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="linode.com" target="_blank"&gt;Linode&lt;/a&gt; 是我最喜歡的國外 VPS 廠商，重點是速度跟穩定度都還不錯，不過今年不知道是不是被 &lt;a href="https://www.digitalocean.com/" target="_blank"&gt;DigitalOcean&lt;/a&gt; 刺激到？所以這個月將網路設備全面升級，不僅降低 latency 和 redundancy，出口端網路設備全部換成 Cisco Nexus 7000 series 等級，此系列提供了足夠的 Mac Address 及處理大量 Request，另外 access layer switches 則換成 Cisco Nexus 5000 series switches 跟 Nexus 2000 series Fabric Extenders，這些都不是重點，重點是每台 VPS 現在**&lt;span style="color:red"&gt;對外流量都變成原先的十倍&lt;/span&gt;**，當然&lt;a href="http://blog.wu-boy.com/2011/09/linode-vps-inbound-%E6%B5%81%E9%87%8F%E5%B0%87%E4%B8%8D%E5%86%8D%E6%94%B6%E8%B2%BB/" target="_blank"&gt;對內流量是無限制的&lt;/a&gt;，底下是 Linode 最新網路架構圖&lt;/p&gt;</description></item><item><title>Git denying non-fast forward 問題</title><link>https://blog.wu-boy.com/2013/03/git-denying-non-fast-forward/</link><pubDate>Thu, 14 Mar 2013 08:21:01 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/03/git-denying-non-fast-forward/</guid><description>&lt;p&gt;最近幫別公司處理 denying non-fast forward 的 git server 問題，沒事就別動檔案權限，不管是不是修改內容，只要用 chmod 指令，&lt;a href="http://git-scm.com/" target="_blank"&gt;Git&lt;/a&gt; 還是會判別檔案變動。處理 git push 直接給我噴&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ git push --force origin master
Total 0 (delta 0), reused 0 (delta 0) 
error: denying non-fast forward refs/heads/master (you should pull first) 
To git@git.example.com:myrepo.git 
! [remote rejected] master -&gt; master (non-fast forward) 
error: failed to push some refs to 'git@git.example.com:myrepo.git'&lt;/pre&gt; 會遇到這問題的原因是使用者將不該 commit 的程式碼都 push 到伺服器上面，例如資料庫帳號密碼，個人帳蜜等等，這真的是不應該，解決方式也沒有很難，只要用 git reset --hard 到您需要的 commit hash 值，並且 git push --force 方式蓋掉 Server 上面的程式碼，但是如果遇到 
&lt;p&gt;&lt;span style="color:green"&gt;git push &amp;ndash;force origin&lt;/span&gt; 或 &lt;span style="color:green"&gt;git push &amp;ndash;force origin master&lt;/span&gt; 都無作用，那就請加上底下設定&lt;/p&gt;</description></item><item><title>Remove Google CDN reference for jQuery?</title><link>https://blog.wu-boy.com/2013/03/remove-google-cdn-reference-for-jquery/</link><pubDate>Thu, 07 Mar 2013 04:03:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/03/remove-google-cdn-reference-for-jquery/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8442641115/" title="OQAAAI1PPrJY0nBALB7mkvju3mkQXqLmzMhxEjeb4gp8aujEUQcLfLyy-Sn4gZdkAas6-k8eYbQlGDE-GCjKfF5gIrUA15jOjFfLRv77VBd5t-WfZURdP9V3PdmT by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm9.staticflickr.com/8378/8442641115_8564013cea.jpg?resize=500%2C123&amp;#038;ssl=1" alt="jquery logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 在 
&lt;p&gt;&lt;a href="http://html5boilerplate.com/" target="_blank"&gt;html5-boilerplate&lt;/a&gt; 看到有人發 &lt;a href="https://github.com/h5bp/html5-boilerplate/pull/1327" target="_blank"&gt;Remove Google CDN reference for jQuery&lt;/a&gt; 的 pull request，發現國外鄉民其實蠻有趣的，也很會表達自己的想法，根據 &lt;a href="http://statichtml.com/about.html" target="_blank"&gt;Steve Webster&lt;/a&gt; 在 2011/11/21 寫了一篇 &lt;a href="http://statichtml.com/2011/google-ajax-libraries-caching.html" target="_blank"&gt;Caching and the Google AJAX Libraries&lt;/a&gt; 裡面的結論是: 使用 &lt;a href="https://developers.google.com/speed/libraries/devguide?hl=zh-TW" target="_blank"&gt;Google CDN Library&lt;/a&gt; 對於第一次訪問網站並沒有很大的幫助，其實這句話非常有疑問，如果網站不想 host 一些 static file 又想要用 CDN 的話，Google 絕對是最好的選擇，&lt;a href="https://github.com/h5bp/html5-boilerplate/pull/1327#issuecomment-14537298" target="_blank"&gt;底下就有人反駁&lt;/a&gt; Google CDN 還是比自己 host 檔案快很多，所以此 pull request 好像沒有啥意義。&lt;/p&gt;</description></item><item><title>Backbone.js rewrite into CoffeeScript?</title><link>https://blog.wu-boy.com/2013/03/backbone-js-rewrite-into-coffeescript/</link><pubDate>Fri, 01 Mar 2013 13:56:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/03/backbone-js-rewrite-into-coffeescript/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/7059615321/" title="backbone by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm6.staticflickr.com/5338/7059615321_097833dea8.jpg?resize=451%2C80&amp;#038;ssl=1" alt="backbone" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 看到 
&lt;p&gt;&lt;a href="https://github.com/gsamokovarov" target="_blank"&gt;@gsamokovarov&lt;/a&gt; 提出將 &lt;a href="http://backbonejs.org/" target="_blank"&gt;Backbone.js&lt;/a&gt; 改寫成 &lt;a href="http://coffeescript.org/" target="_blank"&gt;CoffeeScript&lt;/a&gt; 架構的 &lt;a href="https://github.com/documentcloud/backbone/pull/2317" target="_blank"&gt;Pull request&lt;/a&gt;，結果官方團隊其中一位開發作者回應了一張圖，代表他的心情 XD，各位有興趣可以點上面連結看看，後來有其他人回應說，為什麼官方不用 CoffeeScript 來寫了，發此 Pull Request 的作者也有說，他只是將架構改成 CoffeeScript 讓大家參考看看而已，沒有真的希望可以納入整個 Backbone.js 專案，如果有其他開發者需要的話，一樣可以 fork 此&lt;a href="https://github.com/gsamokovarov/backbone.coffee" target="_blank"&gt;專案&lt;/a&gt;，說明文件也用 &lt;a href="http://jashkenas.github.com/docco/" target="_blank"&gt;docco&lt;/a&gt; 產生好了，可以參考此&lt;a href="http://gsamokovarov.github.com/backbone.coffee/" target="_blank"&gt;連結&lt;/a&gt;，官方作者也提到，大部份的第3方 Library 還是不會使用 CoffeeScript 來當作基底開發，畢竟並非所有人都知道 CoffeeScript，如果官方想這麼開發的話，早就再 2010 年丟釋出 Backbone.js 的時候就直接採用了，不會拖到現在還沒出來，當然最後官方也希望將此 pull request 寫到 wiki 裡面給大家參考，等待原作者補開發動機及細節。&lt;/p&gt;</description></item><item><title>壓縮 Javascript 和 CSS 檔案 script command</title><link>https://blog.wu-boy.com/2013/02/compress-css-javascript-script-command/</link><pubDate>Thu, 21 Feb 2013 10:45:48 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/02/compress-css-javascript-script-command/</guid><description>&lt;div style="margin: 0 auto;text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6033708087/" title="nodejs-light by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm7.static.flickr.com/6199/6033708087_ff1a02a337_o.jpg?resize=260%2C71&amp;#038;ssl=1" alt="nodejs-light" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 網站上站前要做的事情非常多，其中一項為大家所知就是壓縮 
&lt;p&gt;&lt;a href="http://www.w3schools.com/css/" target="_blank"&gt;CSS&lt;/a&gt; 跟 &lt;a href="http://www.w3schools.com/js/default.asp" target="_blank"&gt;JavaScript&lt;/a&gt; 檔案，減少 Http request 流量，網路上已經有非常多的 Compressor tool，像是 &lt;a href="https://developers.google.com/closure/compiler/" target="_blank"&gt;Google Closure Compiler&lt;/a&gt; 或 &lt;a href="http://yui.github.com/yuicompressor/" target="_blank"&gt;YUI Compressor&lt;/a&gt;，都是用來壓縮 JS 或 CSS 檔案，這次寫了 script 來壓縮整個網站目錄裡的 js 或 css 檔案，不過 script 所使用的 Compressor command 是 Node Base 的 tool，分別是 &lt;a href="https://github.com/mishoo/UglifyJS2" target="_blank"&gt;UglifyJS&lt;/a&gt; 及 &lt;a href="https://github.com/ded/sqwish" target="_blank"&gt;sqwish&lt;/a&gt; 這兩套，當然使用 command 之前，請務必先安裝好 &lt;a href="http://nodejs.org/" target="_blank"&gt;Node.js&lt;/a&gt; 最新版本啦，不過沒安裝也沒關係，底下有懶人安裝 script command。這些 tool 對於 Embedded System 在 build firmware 相當有用，可以減少不少 code size 阿。 可以直接看&lt;a href="https://github.com/appleboy/minify-tool" target="_blank"&gt;專案說明&lt;/a&gt;，就可以不必看底下步驟了&lt;/p&gt;</description></item><item><title>HTML5 Boilerplate 不再支援 legacy browser</title><link>https://blog.wu-boy.com/2013/02/html5-boilerplate-drop-legacy-browser/</link><pubDate>Wed, 13 Feb 2013 12:22:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/02/html5-boilerplate-drop-legacy-browser/</guid><description>&lt;p&gt;&lt;a href="http://html5boilerplate.com/" target="_blank"&gt;HTML5 Boilerplate&lt;/a&gt; 在 V5.0 版本將不支援舊有瀏覽器，包含 &lt;a href="http://windows.microsoft.com/zh-TW/internet-explorer/download-ie" target="_blank"&gt;IE&lt;/a&gt;6/7. &lt;a href="http://www.mozilla.org/en-US/firefox/fx/" target="_blank"&gt;Firefox&lt;/a&gt; 3.6 (Mozilla 已經不再維護) 及 &lt;a href="https://www.apple.com/tw/safari/" target="_blank"&gt;Safari&lt;/a&gt; 4，詳細資料可以參考 V5.0 的 Milestone (&lt;a href="https://github.com/h5bp/html5-boilerplate/issues/1050" target="_blank"&gt;Drop legacy browser support&lt;/a&gt;) 下一版本會有哪些改變呢？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;html tag 將不會出現 conditional comments&lt;/li&gt;
&lt;li&gt;&lt;a href="http://necolas.github.com/normalize.css/" target="_blank"&gt;normalize.css&lt;/a&gt; 升級到 2.1.x&lt;/li&gt;
&lt;li&gt;main.css 移除 IE6/7 Hacks 部份 此次重大改變包含移除 IE conditional classes，因為&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms537512%28v=VS.85%29.aspx" target="_blank"&gt;IE 10+ 將不再支援 conditional comments&lt;/a&gt;，至於 normalize.css 轉換到 2.1.x 版本，如果有用 &lt;a href="http://sass-lang.com/" target="_blank"&gt;Sass&lt;/a&gt; 的朋友們，可以參考我改的 &lt;a href="https://github.com/appleboy/normalize.scss" target="_blank"&gt;normalize.scss&lt;/a&gt;，非常期待 Version 5 出來，會拿掉很多 legacy code。&lt;/p&gt;</description></item><item><title>Backbone.js event bind 新功能 listenTo and stopListening</title><link>https://blog.wu-boy.com/2013/02/backbone-js-event-bind-listento-and-stoplistening/</link><pubDate>Wed, 13 Feb 2013 04:42:03 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/02/backbone-js-event-bind-listento-and-stoplistening/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/7059615321/" title="backbone by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm6.staticflickr.com/5338/7059615321_097833dea8.jpg?resize=451%2C80&amp;#038;ssl=1" alt="backbone" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 之前寫了一篇 
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/2012/04/introduction-to-backbone-js-event/" target="_blank"&gt;Backbone.js Event 事件介紹&lt;/a&gt;，簡介 &lt;a href="http://backbonejs.org/#Events" target="_blank"&gt;Backbone.js Events&lt;/a&gt; 如何使用 &lt;a href="http://backbonejs.org/#Events-on" target="_blank"&gt;on&lt;/a&gt; 跟 &lt;a href="http://backbonejs.org/#Events-off" target="_blank"&gt;off&lt;/a&gt; 來處理事件，在升級 Backbone 到 0.9.9 過程中，其中一項重大新功能就是 Backbone &lt;a href="http://backbonejs.org/#Events-listenTo" target="_blank"&gt;listenTo&lt;/a&gt; and &lt;a href="http://backbonejs.org/#Events-stopListening" target="_blank"&gt;stopListening&lt;/a&gt;，大家來看看 Change logs:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Added listenTo and stopListening to Events. They can be used as inversion-of-control flavors of on and off, for convenient unbinding of all events an object is currently listening to. view.remove() automatically calls view.stopListening().&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>在 git Commit 之前檢查 PHP 是否有錯誤</title><link>https://blog.wu-boy.com/2013/02/git-hooks-parse-php-error-before-commit/</link><pubDate>Fri, 08 Feb 2013 07:12:00 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/02/git-hooks-parse-php-error-before-commit/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8455538800/" title="Git-Logo-2Color by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm9.staticflickr.com/8523/8455538800_30f65954f8.jpg?resize=500%2C209&amp;#038;ssl=1" alt="Git-Logo-2Color" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 在 commit code 之前，程式設計師必須確保程式碼的正確性，包含不要放入 debug message 到 
&lt;p&gt;&lt;a href="http://git-scm.com/" target="_blank"&gt;git&lt;/a&gt; server，寫了一個簡單的 pre-commit 程式，來確保 PHP 是否有 Parse error，或者是在寫 CoffeeScript 及 JavaScript 時，常常會用到 console.* 來當作中斷點或者是顯示變數資料，這也是需要盡量避免 commit 到伺服器，你可不想要長官 review 的時候看到這麼多 debug 訊息吧。這時候就是需要 &lt;a href="http://git-scm.com/book/en/Customizing-Git-Git-Hooks" target="_blank"&gt;git-hooks&lt;/a&gt; 的 &lt;strong&gt;&lt;span style="color:red"&gt;pre-commit&lt;/span&gt;&lt;/strong&gt; 幫忙檢查這些 Syntax 語法，可以直接參考&lt;a href="https://github.com/appleboy/git-hooks"&gt;我的 git-hooks 專案&lt;/a&gt;。安裝方式很簡單:&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ git clone https://github.com/appleboy/git-hooks.git
$ chmod +x bin/hooks.sh pre-commit
$ ./bin/hooks.sh your_project_path&lt;/pre&gt; 如果使用 git commit 之前，就會檢查 .js、.coffee、.php 等副檔名。</description></item><item><title>使用不同 IE 版本測試網站</title><link>https://blog.wu-boy.com/2013/02/testing-for-internet-explorer-with-web-page/</link><pubDate>Mon, 04 Feb 2013 03:15:19 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/02/testing-for-internet-explorer-with-web-page/</guid><description>&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;a title="ie-logo-small by appleboy46, on Flickr" href="https://www.flickr.com/photos/appleboy/8443574444/"&gt;&lt;img alt="ie-logo-small" src="https://i2.wp.com/farm9.staticflickr.com/8216/8443574444_c01f821c31_m.jpg?resize=240%2C240&amp;#038;ssl=1" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 大家還在為了測試不同 IE 版本而安裝虛擬機器 
&lt;p&gt;&lt;a href="https://www.virtualbox.org/" target="_blank"&gt;VirtulBox&lt;/a&gt; 或 &lt;a href="http://www.vmware.com/" target="_blank"&gt;VMware&lt;/a&gt; 嗎？現在不必這麼麻煩了，可以到 &lt;a href="http://www.modern.ie/" target="_blank"&gt;modern.IE&lt;/a&gt; 直接測試 IE6/7/8/9/10 任何版本，或者是檢查網頁相容性以及 coding practices。&lt;/p&gt;</description></item><item><title>jQuery Migrate 1.1.0 Released 注意事項</title><link>https://blog.wu-boy.com/2013/02/jquery-migrate-1-1-0-released-note/</link><pubDate>Sun, 03 Feb 2013 03:53:29 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/02/jquery-migrate-1-1-0-released-note/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8442641115/" title="OQAAAI1PPrJY0nBALB7mkvju3mkQXqLmzMhxEjeb4gp8aujEUQcLfLyy-Sn4gZdkAas6-k8eYbQlGDE-GCjKfF5gIrUA15jOjFfLRv77VBd5t-WfZURdP9V3PdmT by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm9.staticflickr.com/8378/8442641115_8564013cea.jpg?resize=500%2C123&amp;#038;ssl=1" alt="jquery logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 上個月大家可以注意到 
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/2013/01/jquery-1-9-final-jquery-2-0-beta-migrate-final-released/" target="_blank"&gt;jQuery 釋出 1.9 及 2.0 版本&lt;/a&gt;，官方團隊也同時推出 &lt;a href="https://github.com/jquery/jquery-migrate/" target="_blank"&gt;jQuery Migrate Plugin&lt;/a&gt; 1.0.0 版本，此 Plugin 是跟 &lt;a href="http://jquery.com" target="_blank"&gt;jQuery&lt;/a&gt; 1.9 或 2.0 一起搭配使用，偵測 jQuey 已移除或者是將被移除的功能，讓您之前開發的 jQuey 功能可以持續使用，但是似乎很多使用者不知道此 plugin 用處，就直接升級 1.9 或 2.0，並未載入 migrate plugin，造成官方收到很多 feed back 都是關於一些舊功能不能使用。半個月後 jQuery 官方收到很多 migrate plugin 回報問題，這次一樣可以透過 jQuuery CDN 載入，程式碼如下。&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;&lt;/pre&gt; 壓縮版本 
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;&lt;/pre&gt;</description></item><item><title>CodeIgniter Error Handler 處理</title><link>https://blog.wu-boy.com/2013/02/codeigniter-error-handler/</link><pubDate>Fri, 01 Feb 2013 02:54:37 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/02/codeigniter-error-handler/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://www.codeigniter.org.tw/" target="_blank"&gt;CodeIgniter&lt;/a&gt; 在處理 PHP Error handler 是直接呼叫內建的 Exceptions Class 顯示在瀏覽器上，如果有打開 log，系統另外會紀錄在 &lt;strong&gt;&lt;span style="color:green"&gt;application/logs&lt;/span&gt;&lt;/strong&gt; 目錄。這是 CodeIgniter 預設作法，但是我希望能把這些錯誤訊息都紀錄到 Database，相關 Notice, Error 訊息都一律寫到 DB 裡面，但是如果用 extend 系統內的 Exceptions 是完全做不到的，所以我寫了一個 Library 只要直接 include 系統就可以直接開始紀錄，因為在 PHP 你會遇到無數種 User experience，都會產生相關錯誤訊息，在產品上線都會將 &lt;strong&gt;&lt;span style="color:red"&gt;display_errors&lt;/span&gt;&lt;/strong&gt; 設定為 0，不要讓使用者看到任何錯誤訊息，但是我們還是需要全部的錯誤訊息阿，底下來看看如何安裝 Log Library。&lt;/p&gt;
&lt;h3 id="建立-log-table-可以直接參考"&gt;建立 log table 可以直接參考&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/appleboy/CodeIgniter-Log-Library/blob/master/sql/mysql.sql" target="_blank"&gt;連結&lt;/a&gt;，或者是複製底下資料貼到 phpMyAdmin。&lt;/p&gt;
&lt;pre class="brush: sql; title: ; notranslate" title=""&gt;--
-- Table structure for table `logs`
--

DROP TABLE IF EXISTS `logs`;
CREATE TABLE IF NOT EXISTS `logs` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `errno` int(2) NOT NULL,
 `errtype` varchar(32) CHARACTER SET utf8 NOT NULL,
 `errstr` text CHARACTER SET utf8 NOT NULL,
 `errfile` varchar(255) CHARACTER SET utf8 NOT NULL,
 `errline` int(4) NOT NULL,
 `time` datetime NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;/pre&gt;</description></item><item><title>JavaScript 的 if 條件判斷式</title><link>https://blog.wu-boy.com/2013/01/you-must-be-known-js-condition/</link><pubDate>Fri, 25 Jan 2013 08:26:09 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/01/you-must-be-known-js-condition/</guid><description>&lt;p&gt;網路上看到這篇 &lt;a href="http://rmurphey.com/blog/2012/12/10/js-conditionals/" target="_blank"&gt;Two Things About Conditionals in JavaScript&lt;/a&gt;，比較另我訝異的是第一點 &lt;code&gt;One: There is no else if&lt;/code&gt;，該作者提到在 JavaScript 的寫法裡面沒有 else if，底下直接看例子:&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;function saySomething( msg ) {
 if ( msg === 'Hello' ) {
 console.log('Hello there');
 } else if ( msg === 'Yo' ) {
 console.log('Yo dawg');
 }
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;上面是我們一般在寫 JS 會用到的條件子句，但是實際上 JS 寫的就是&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;function saySomething( msg ) {
 if ( msg === 'Hello' ) {
 console.log('Hello there');
 } else {
 if ( msg === 'Yo' ) {
 console.log('Yo dawg');
 }
 }
}&lt;/pre&gt;
&lt;/div&gt;</description></item><item><title>Firefox OS Developer Preview Phone 簡介</title><link>https://blog.wu-boy.com/2013/01/firefox-os-developer-preview-phone-%E7%B0%A1%E4%BB%8B/</link><pubDate>Tue, 22 Jan 2013 15:25:52 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/01/firefox-os-developer-preview-phone-%E7%B0%A1%E4%BB%8B/</guid><description>&lt;div style="text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8304883463/" title="firefox-phone by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm9.staticflickr.com/8351/8304883463_f8139ea7ee.jpg?resize=384%2C312&amp;#038;ssl=1" alt="firefox-phone" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 上次提到今年 
&lt;p&gt;&lt;a href="http://moztw.org/firefox/" target="_blank"&gt;Firefox&lt;/a&gt; 將會舉辦 &lt;a href="http://blog.wu-boy.com/2012/12/httpwww-apple-comtw2013-firefox-os-app-days/" target="_blank"&gt;2013 Firefox OS App Days&lt;/a&gt;，這次看到 &lt;a href="https://hacks.mozilla.org/" target="_blank"&gt;mozilla hacks&lt;/a&gt; 提到一篇: &lt;a href="https://hacks.mozilla.org/2013/01/announcing-the-firefox-os-developer-preview-phone/" target="_blank"&gt;Announcing the Firefox OS Developer Preview Phone!&lt;/a&gt;，Firefox OS 是新一代的作業系統，跟 Android 或 IOS 比較不同的地方就是，你可以用 &lt;a href="http://firefoxosappday-taipei.eventbrite.com/" target="_blank"&gt;HTML5&lt;/a&gt; 可以做到手機的任何事情，包括讓手機振動，傳簡訊，或者是撥打電話，我想這是 iOS 或者是 Android 是無法做到的，該篇還提到 Firefox Phone 硬體規格:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;CPU Qualcomm Snapdragon S1 1Ghz UMTS 2100/1900/900 (3G HSPA) GSM 850/900/1800/1900 (2G EDGE) Screen 3.5″ HVGA Multitouch 3 MP Camera 4GB ROM, 512 MB RAM MicroSD, Wifi N, Light and proxmity Sensor, G-Sensor, GPS, MicroUSB 1580 mAh battery Over the air updates Unlocked, add your own SIM card 如果想開始設計 App for Firefox OS 可以參考&lt;a href="https://developer.mozilla.org/en-US/docs/Apps/Getting_Started" target="_blank"&gt;這篇&lt;/a&gt;，另外文章有提到如果你要試試看 Firefox OS + 自己開發的 App，可以透過底下方式: 1. 安裝 &lt;a href="https://hacks.mozilla.org/2012/10/firefox-marketplace-aurora/" target="_blank"&gt;Marketplace for Android&lt;/a&gt; 在您的 Android 手機上。 2. 安裝&lt;a href="https://hacks.mozilla.org/2012/12/firefox-os-simulator-1-0-is-here/" target="_blank"&gt;瀏覽器版本 Firefox OS 模擬器&lt;/a&gt; 3. 安裝 &lt;a href="https://developer.mozilla.org/en-US/docs/Mozilla/Firefox_OS/Building_and_installing_Firefox_OS" target="_blank"&gt;Firefox OS 到各家硬體上&lt;/a&gt;。 4. 最後一種方法：那就是買支 &lt;a href="http://www.geeksphone.com/" target="_blank"&gt;Firefox OS Developer Preview device&lt;/a&gt;。 如果想更了解 Firefox OS 的話或有興趣的可以自行報名參加&lt;a href="http://firefoxosappday-taipei.eventbrite.com/" target="_blank"&gt;台北 Mozilla 1/26 場次&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>CodeIgniter 台灣官網原始碼釋出</title><link>https://blog.wu-boy.com/2013/01/taiwain-codeigniter-source-code-release/</link><pubDate>Sun, 20 Jan 2013 02:06:34 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/01/taiwain-codeigniter-source-code-release/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 2009 年開始接觸 
&lt;p&gt;&lt;a href="http://www.codeigniter.org.tw/" target="_blank"&gt;CodeIgniter&lt;/a&gt;，拿到第1版原始碼來自 &lt;a href="http://codeigniter.org.cn" target="_blank"&gt;中國 CodeIgniter &lt;/a&gt;，版本是很舊的 1.7.x 版本，目前官方已經是 2.1.3 版本，現在朝 3.0.x 版本邁進，這次有機會將整個原始碼改寫成 3.0.x develop 分支版本，也將整個官方 source code 分享出來，讓需要原始碼範例初學者可以參考，Source Code 已經放在 &lt;a href="http://github.com" target="_blank"&gt;github&lt;/a&gt; 上面，由於是拿大陸那邊的原始碼，也許有些地方寫的不是很完整，歡迎大家 pull request。 &lt;a href="https://github.com/CodeIgniter-TW/Web" target="_blank"&gt;台灣 CodeIgniter Source Code Github&lt;/a&gt;&lt;/p&gt;</description></item><item><title>jQuery 1.9 final, jQuery 2.0 beta and Migrate plugin 釋出</title><link>https://blog.wu-boy.com/2013/01/jquery-1-9-final-jquery-2-0-beta-migrate-final-released/</link><pubDate>Wed, 16 Jan 2013 03:29:22 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/01/jquery-1-9-final-jquery-2-0-beta-migrate-final-released/</guid><description>&lt;p&gt;今天早上來到公司就發現一個令人振奮的訊息，那就是 &lt;a href="http://blog.jquery.com/2013/01/15/jquery-1-9-final-jquery-2-0-beta-migrate-final-released/" target="_blank"&gt;jQuery 1.9 and 2.0 beta Release&lt;/a&gt; 了，相信大家對於 &lt;a href="http://jquery.com" target="_blank"&gt;jQuery&lt;/a&gt; 應該都不是很陌生了，釋出同時官網也有寫一份 &lt;a href="http://jquery.com/upgrade-guide/1.9/" target="_blank"&gt;jQuery 1.9 upgrade guide&lt;/a&gt; 文件，來幫助大家升級舊版本。那為什麼這次會同時釋出 1.9 以及 2.0 beta 呢？我們來看看 jQuery 團隊如何定位 jQuery 1.9 及 2.0: 1. jQuery 1.9 和 2.0 擁有相同的 API，一些官方打算移除的 API 像是 $.bowser，在這兩版本都已經移除，更多的訊息可以參考 jQuery 1.9 upgrade guide 2. jQuery 1.9 可以執行在 IE 6,7 和 8 版本(&amp;ldquo;old IE&amp;rdquo;)，就如同之前的版本一樣升級 3. jQuery 2.0 將不在 old IE 版本上執行，此版本會比 1.9 版本還要小以及效能好 4. jQuery 團隊會持續維護 jQuery 1.9 及 2.0 版本，所以開發者根據自己的需求下載對應版本&lt;/p&gt;</description></item><item><title>Bower 管理網站套件的好工具</title><link>https://blog.wu-boy.com/2013/01/bower-is-a-package-manager-for-the-web/</link><pubDate>Tue, 15 Jan 2013 03:34:00 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/01/bower-is-a-package-manager-for-the-web/</guid><description>&lt;p&gt;&lt;strong&gt;Update: bower 在 0.9.0 版以前可以使用 &lt;span style="color:red"&gt;component.json&lt;/span&gt;，但是為了避免跟其他工具命名衝突，故 0.9.0 以後版本請改為 &lt;span style="color:green"&gt;bower.json&lt;/span&gt;&lt;/strong&gt; &lt;a href="http://twitter.github.com/bower/" target="_blank"&gt;bower&lt;/a&gt; 是 &lt;a href="http://twitter.com" target="_blank"&gt;Twitter&lt;/a&gt; 團隊開發的一套網頁工具，用來管理或安裝 Web 開發所需要的 Package，像是 CSS 和 JavaScript，也可以依據套件的相依性來安裝，簡單來說，開發者不用再去煩惱套件相依性問題，以及時間久了想更新最新版本，還要到各 Package 網站來下載，這些步驟都省了，一個指令就可以全部做完上述的步驟。&lt;/p&gt;
&lt;h3 id="安裝-bower-管理套件-透過"&gt;安裝 Bower 管理套件 透過&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://nodejs.org/" target="_blank"&gt;Node.js&lt;/a&gt; 的 npm 工具來安裝&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ npm install bower -g&lt;/pre&gt;</description></item><item><title>Node Version Manager 版本管理 NVM</title><link>https://blog.wu-boy.com/2013/01/node-version-manager/</link><pubDate>Wed, 09 Jan 2013 10:34:07 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/01/node-version-manager/</guid><description>&lt;p&gt;&lt;strong&gt;2015.02.12 官方已經支援 nvm install stable，補上 io.js 說明&lt;/strong&gt;&lt;/p&gt;
&lt;div style="margin: 0 auto;text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6033708087/" title="nodejs-light by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm7.static.flickr.com/6199/6033708087_ff1a02a337_o.jpg?resize=260%2C71&amp;#038;ssl=1" alt="nodejs-light" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;本篇不是要介紹 &lt;a href="http://nodejs.org/" target="_blank"&gt;Node.js&lt;/a&gt;，是要介紹管理 Node.js 版本的工具，之前是玩 &lt;a href="https://github.com/visionmedia" target="_blank"&gt;Visionmedia&lt;/a&gt; 開發的 &lt;a href="https://github.com/visionmedia/n" target="_blank"&gt;n&lt;/a&gt;，後來跳到玩 &lt;a href="https://github.com/creationix" target="_blank"&gt;Creationix&lt;/a&gt; 開發的 &lt;a href="https://github.com/creationix/nvm" target="_blank"&gt;nvm&lt;/a&gt; tool，目前支援 stable command，也就是下 &lt;code&gt;nvm install stable&lt;/code&gt; (直接裝好 v0.12.0)。&lt;/p&gt;
&lt;h1 id="安裝方式"&gt;安裝方式&lt;/h1&gt;
&lt;p&gt;可以使用 &lt;code&gt;curl&lt;/code&gt; 或 &lt;code&gt;wget&lt;/code&gt; 方式安裝&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ curl https://raw.githubusercontent.com/creationix/nvm/v0.23.3/install.sh | bash
$ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.23.3/install.sh | bash&lt;/pre&gt;
&lt;/div&gt;
&lt;h1 id="使用方式"&gt;使用方式&lt;/h1&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# 安裝最新穩定版本
$ nvm install stable
# 移除最新穩定版本
$ nvm uninstall stable
# 使用穩定版本
$ nvm use stable
$ nvm run unstable --version&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;如果有玩 &lt;a href="https://iojs.org/"&gt;io.js&lt;/a&gt; 可以下&lt;/p&gt;</description></item><item><title>Percona XtraBackup InnoDB 備份工具</title><link>https://blog.wu-boy.com/2013/01/percona-xtrabackup-innodb/</link><pubDate>Tue, 01 Jan 2013 04:13:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2013/01/percona-xtrabackup-innodb/</guid><description>&lt;p&gt;&lt;a href="http://www.percona.com/software/percona-xtrabackup/" target="_blank"&gt;Percona XtraBackup&lt;/a&gt; 是一套 compiled C 程式，用於備份 MySQL InnoDB 資料庫，過去備份 MyISAM 或 InnoDB 都是透過 mysqldump 指令，或者是直接 copy &lt;strong&gt;&lt;span style="color: #008000;"&gt;/var/lib/mysql&lt;/span&gt;&lt;/strong&gt; 目錄當作備份(這方法盡量少做，請確定 MySQL 版本一致)，XtraBackup 用於備份 InnoDB 資料部份，請注意這邊，真的只有&amp;quot;備份資料&amp;quot;，而不是全部(結構跟資料)，底下仔細介紹如何安裝:&lt;/p&gt;
&lt;h3 id="安裝方式-大家可以選擇透過"&gt;安裝方式 大家可以選擇透過&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.percona.com/doc/percona-xtrabackup/installation/yum_repo.html" target="_blank"&gt;yum&lt;/a&gt; 或 &lt;a href="http://www.percona.com/doc/percona-xtrabackup/installation/apt_repo.html" target="_blank"&gt;apt&lt;/a&gt; Repository 方式安裝，下面介紹 apt 方式即可。&lt;/p&gt;</description></item><item><title>2013 Firefox OS App Days</title><link>https://blog.wu-boy.com/2012/12/httpwww-apple-comtw2013-firefox-os-app-days/</link><pubDate>Tue, 25 Dec 2012 02:13:09 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/12/httpwww-apple-comtw2013-firefox-os-app-days/</guid><description>&lt;div style="text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8304883463/" title="firefox-phone by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm9.staticflickr.com/8351/8304883463_f8139ea7ee.jpg?resize=384%2C312&amp;#038;ssl=1" alt="firefox-phone" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 今天看到一則消息，就是 
&lt;p&gt;&lt;a href="http://www.mozilla.org/en-US/firefoxos/" target="_blank"&gt;Firefox OS&lt;/a&gt; 在明年一月會舉辦全球性的 Firefox OS App Days，台灣部份也會在 2013/01/26 進行，地點也就在台灣 Mozilla 台北辦公室，這次的活動主要的目的是讓其他程式開發者可以瞭解如何開發 HTML5 apps 以及將 apps 提交到 Firefox Marketplace，並且可能會有一些機會讓開發者可以發表自行開發的 apps，另外還有一個重點就是會詳細介紹 Firefox OS 的生態消息，個人非常期待 Firefox OS 正式 Release，以及 App Marketplace 平台，是否可以跟 &lt;a href="http://www.apple.com/tw/" target="_blank"&gt;Apple&lt;/a&gt; 或 &lt;a href="http://www.android.com/" target="_blank"&gt;Android&lt;/a&gt; 平起平坐，如果想多瞭解 Firefox OS 可以參考 &lt;a href="https://developer.mozilla.org/en-US/docs/Mozilla/Firefox_OS" target="_blank"&gt;Wiki 平台&lt;/a&gt;，一月的活動也算是 Hack Day，參考 &lt;a href="https://wiki.mozilla.org/Engagement/Developer_Engagement/FirefoxAppDays#Event_Schedule" target="_blank"&gt;FirefoxAppDays&lt;/a&gt; 裡面的活動介紹。&lt;/p&gt;</description></item><item><title>網頁重構工程師</title><link>https://blog.wu-boy.com/2012/12/code-refactoring-programer/</link><pubDate>Thu, 20 Dec 2012 02:45:13 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/12/code-refactoring-programer/</guid><description>&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;a style="margin: 0 auto;" title="qq_logo by appleboy46, on Flickr" href="https://www.flickr.com/photos/appleboy/8290154056/"&gt;&lt;img alt="qq_logo" src="https://i2.wp.com/farm9.staticflickr.com/8495/8290154056_e0d3545a34.jpg?resize=372%2C159&amp;#038;ssl=1" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 看到這標題不要懷疑，昨日看到這篇 
&lt;p&gt;&lt;a title="Permanent Link: 騰訊招聘——網頁重構工程師" href="http://www.qianduan.net/jobs-web-rebuilder-engineer-tencent.html" rel="bookmark"&gt;騰訊招聘——網頁重構工程師&lt;/a&gt;，我第一次看到有公司在徵求網頁重構工程師，不愧是大陸知名上市公司，重構是一件非常繁瑣的事情，如果在多人團隊合作底下，沒有制定一套開發流程以及 Coding Style 的話，隨著網站變大，程式碼一定會非常複雜，你也會發現裡面有很多人的足跡，制定良好的 Coding Style 可以讓新人快速學習，也讓後續開發功能可以 follow 一套標準。另外重構還有另一個重大原因，可能網站效能蠻差的，才需要重構，我們看看重構工程師需要的技術:&lt;/p&gt;
&lt;h3 id="職位要求"&gt;職位要求：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;大專以上學歷，從事網頁重構工作2年以上；2.對符合web標準的網站重構有豐富經驗，有成功案例；&lt;/li&gt;
&lt;li&gt;精通html、css，能快構建出兼容主流瀏覽器的頁面；&lt;/li&gt;
&lt;li&gt;熟悉javascript語言，對性能優化有一定瞭解；&lt;/li&gt;
&lt;li&gt;瞭解至少一種後台語言的開發機制(如php，Java等)，能配合開發人員進行頁面聯調整合；&lt;/li&gt;
&lt;li&gt;良好的項目管理和溝通表達能力；&lt;/li&gt;
&lt;li&gt;熱愛遊戲行業，能接受挑戰並承受工作壓力。 看起來這些要求還蠻基本的，不過重點是大陸公司願意花這樣的時間跟人力來把網頁整個優化，反觀台灣老闆的角度:『能動就好，專案時程都趕不出來了，還重構呢？』。&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>虛擬主機商 Linode 增加 20% 儲存空間</title><link>https://blog.wu-boy.com/2012/12/linode-storage-increased-by-20/</link><pubDate>Sun, 16 Dec 2012 09:05:21 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/12/linode-storage-increased-by-20/</guid><description>&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;img src="https://i1.wp.com/www.linode.com/images/linode_logo_gray.png?w=840" alt="Linode VPS" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://www.linode.com/" target="_blank"&gt;Linode&lt;/a&gt; 在美國時間 2012/12/14 宣佈&lt;a href="http://blog.linode.com/2012/12/14/storage-increased-by-20/" target="_blank"&gt;全部方案增加 20% 儲存空間&lt;/a&gt;，Linode 是一個蠻穩定的虛擬主機商，除了有時候常常維護以外，目前找不到有任何值得探討的缺點，每年周年慶也推出&lt;a href="http://blog.wu-boy.com/2010/12/%E8%99%9B%E6%93%AC%E4%B8%BB%E6%A9%9F-vps-linode-%E8%B4%88%E9%80%81-100000-%E7%BE%8E%E5%85%83%E7%B5%A6%E6%96%B0%E8%A8%BB%E5%86%8A%E6%9C%83%E5%93%A1/" target="_blank"&gt;贈送 100 美金的方案&lt;/a&gt;，也不定時增加記憶體，像是以前有 720方案，現在已經看不到了，每個月39美元就可以租到 1GB Ram 的方案，這次增加儲存空間，可以透過後台方式將&lt;a href="https://library.linode.com/disk-images-config-profiles#sph_resizing-a-disk-image" target="_blank"&gt;硬碟容量調整&lt;/a&gt;。真的是太感謝 Linode 了。如果想玩 VPS 我首推的就是 Linode，或者是可以嘗試免費的 &lt;a href="http://aws.amazon.com/free/" target="_blank"&gt;AWS Free Usage Tier EC2&lt;/a&gt;。Linode 容量調整如下:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Linode 512 goes from 20GB to 24GB Linode 1GB goes from 40GB to 48GB Linode 2GB goes from 80GB to 96GB Linode 4GB goes from 160GB to 192GB Linode 8GB goes from 320GB to 384GB Linode 12GB goes from 480GB to 576GB Linode 20GB goes from 800GB to 960GB&lt;/p&gt;</description></item><item><title>MySQL MyISAM Engine 轉換成 InnoDB</title><link>https://blog.wu-boy.com/2012/12/mysql-myisam-tables-convert-to-innodb/</link><pubDate>Sat, 15 Dec 2012 02:50:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/12/mysql-myisam-tables-convert-to-innodb/</guid><description>&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;img src="https://i2.wp.com/farm9.staticflickr.com/8488/8171305355_db09e220a4_o.png?w=840&amp;#038;ssl=1" alt="" data-recalc-dims="1" /&gt;
&lt;/div&gt; 如果對於 InnoDB 不了解的讀者們，可以參考作者之前寫的 
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/2012/11/innodb-as-the-default-mysql-storage-engine/" target="_blank"&gt;MySQL 預設儲存引擎: InnoDB 介紹&lt;/a&gt;，最近開始把原本 &lt;a href="http://dev.mysql.com" target="_blank"&gt;MySQL&lt;/a&gt; 5.1 預設 &lt;a href="http://dev.mysql.com/doc/refman/5.5/en/myisam-storage-engine.html" target="_blank"&gt;MyISAM&lt;/a&gt; Table 全部轉換成 &lt;a href="http://dev.mysql.com/doc/refman/5.5/en/innodb-storage-engine.html" target="_blank"&gt;InnoDB&lt;/a&gt;，MySQL 5.5 版本開始預設的儲存引擎就是 InnoDB，InnoDB 現在也非常完整，也支援 Full Text (5.6.4 開始支援)。作者在轉換過程其實蠻順利的，步驟也不是很複雜，只要按底下步驟，就可以順利轉換。&lt;/p&gt;</description></item><item><title>PHPFog 即將關閉，請儘速轉移到 AppFog</title><link>https://blog.wu-boy.com/2012/12/phpfog-will-be-closed/</link><pubDate>Wed, 05 Dec 2012 02:19:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/12/phpfog-will-be-closed/</guid><description>&lt;div style="margin: 0 auto;text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6034284842/" title="php-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm7.static.flickr.com/6186/6034284842_351ff33711_m.jpg?resize=240%2C127&amp;#038;ssl=1" alt="php-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 在10月寫了一篇 
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/2012/10/php-cloud-hosting-phpfog-pagoda-appfog/" target="_blank"&gt;PHP 免費雲端主機 PHPFog vs Pagoda vs AppFog 介紹&lt;/a&gt;，上個月很不幸接到 mail 通知，說在今年12月即將關閉 &lt;a href="https://phpfog.com/" target="_blank"&gt;PHPFog&lt;/a&gt;，所以免費的服務會在12月21號全部斷線，所以官方寫了 &lt;a href="http://blog.phpfog.com/2012/11/30/saying-farewell-to-php-fog/" target="_blank"&gt;如何轉移 PHPFog 到 AppFog&lt;/a&gt;，大家可以參考看看，話說自己把所有的服務都轉到 &lt;a href="http://aws.amazon.com/ec2/" target="_blank"&gt;AWS EC2&lt;/a&gt; 上面了，因為在 PHPFog 遇到 Session 一直消失的 Issue，也沒辦法解決，如果有在用 PHPFog 服務，請儘快轉移。&lt;/p&gt;</description></item><item><title>Nginx 判斷檔案是否存在</title><link>https://blog.wu-boy.com/2012/11/nginx-check-if-file-exists/</link><pubDate>Thu, 29 Nov 2012 13:58:01 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/11/nginx-check-if-file-exists/</guid><description>&lt;p&gt;如果你有在使用 &lt;a href="http://www.codeigniter.org.tw/" target="_blank"&gt;CodeIgniter&lt;/a&gt; + &lt;a href="http://nginx.org/" target="_blank"&gt;Nginx&lt;/a&gt; + &lt;a href="http://php-fpm.org/" target="_blank"&gt;PHP-FPM&lt;/a&gt; 使用者，務必看到這篇 &lt;a href="https://github.com/EllisLab/CodeIgniter/issues/2038" target="_blank"&gt;CLI problem nginx php-fpm&lt;/a&gt;，在使用 CLI 時候會有些問題，解決方式也非常簡單，只要在 index.php 裡面加上&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;$_SERVER['PATH_INFO'] = NULL;&lt;/pre&gt; 當然這篇最主要不是講這個，而是最後我有提到一篇解法，在 
&lt;p&gt;&lt;a href="http://www.farinspace.com/codeigniter-nginx-rewrite-rules/" target="_blank"&gt;Nginx 裡面如何設定 rewrite 功能&lt;/a&gt;，比較不同的是，現在不用在設定這麼複雜了，要判斷檔案是否存在，不要在使用下面方式&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;server {
 root /var/www/domain.com;
 location / {
 if (!-f $request_filename) {
 break;
 }
 }
}&lt;/pre&gt; 而必須改成 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;location / {
 try_files $uri $uri/ /index.php;
}&lt;/pre&gt; 請看 
&lt;p&gt;&lt;a href="http://wiki.nginx.org/Pitfalls#Check_IF_File_Exists" target="_blank"&gt;Check IF File Exists&lt;/a&gt;，看完之後可以拿掉很多設定，讓 Nginx 設定檔看起來更簡單容易。 參考: &lt;a href="http://wiki.nginx.org/NginxHttpCoreModule#try_files" target="_blank"&gt;try_files&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Backbone.js Model and Collection Tregger Event</title><link>https://blog.wu-boy.com/2012/11/backbone-js-model-and-collection-tregger-event/</link><pubDate>Thu, 22 Nov 2012 05:10:05 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/11/backbone-js-model-and-collection-tregger-event/</guid><description>&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;a title="backbone by appleboy46, on Flickr" href="https://www.flickr.com/photos/appleboy/7059615321/"&gt;&lt;img src="https://i1.wp.com/farm6.staticflickr.com/5338/7059615321_097833dea8.jpg?resize=451%2C80&amp;#038;ssl=1" alt="backbone" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 之前寫過一篇 
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/2012/04/introduction-to-backbone-js-event/" target="_blank"&gt;Backbone.js Event 的介紹&lt;/a&gt;，最近開發專案遇到一個奇怪問題，就是只要我重複呼叫 backbone.model.fetch()，如果資料相同的話，就不會重新 trigger render() 畫面，但是專案架構是以 &lt;a href="http://backbonejs.org" target="_blank"&gt;Backbone.js&lt;/a&gt; MVC 下去開發，這樣畫面就會卡在 init 狀態，無法將畫面顯示出來。先來探討 Backbone.js Model 跟 Collection 預設的事件。&lt;/p&gt;</description></item><item><title>MySQL 預設儲存引擎: InnoDB 介紹</title><link>https://blog.wu-boy.com/2012/11/innodb-as-the-default-mysql-storage-engine/</link><pubDate>Sat, 10 Nov 2012 09:00:02 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/11/innodb-as-the-default-mysql-storage-engine/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8171305355/" title="mysql_logo by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm9.staticflickr.com/8488/8171305355_7fb578fdc9.jpg?resize=489%2C253&amp;#038;ssl=1" alt="mysql_logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://www.mysql.com" target="_blank"&gt;MySQL&lt;/a&gt; 是一套眾所皆知的 Database System，今天來簡介 &lt;a href="http://dev.mysql.com/doc/refman/5.5/en/myisam-storage-engine.html" target="_blank"&gt;InnoDB&lt;/a&gt; 儲存引擎，在 MySQL 5.5.5 之前預設的儲存引擎是 &lt;a href="https://dev.mysql.com/doc/refman/5.5/en/myisam-storage-engine.html" target="_blank"&gt;MyISAM&lt;/a&gt;，但是為什麼在 5.5 之後官方要將預設儲存引擎換成 InnoDB 呢？大家都知道 InnoDB 用來交易管理非常方便，因為 InnoDB 透過 row lock，相對於 &lt;a href="http://dev.mysql.com/doc/refman/5.5/en/myisam-storage-engine.html" target="_blank"&gt;MyISAM&lt;/a&gt; 透過 table lock 來的有效率，也避免大量寫入的時候，造成無法讀取資料，這就是 row lock 的優勢，當然用 InnoDB 最主要的原因還有 Full-text search indexes 功能，但是別擔心 MySQL 5.6.4 之後(含此版本) InnoDB 開始支援 Full-text search 功能，另外在使用 MyISAM 時候，如果資料突然出問題，還必須使用 &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/binary-log.html" target="_blank"&gt;MySQL Binary Log&lt;/a&gt; 來恢復資料，如果用 InnoDB 這就沒關係了。大家還在用 MyISAM 嘛？開始升級伺服器，一起體驗 InnoDB 的功能，如果已經上線很久的網站，作者不建議轉換，因為可能會遇到很多雷。&lt;/p&gt;</description></item><item><title>2012 PHPConf RESTful API Design &amp; Implementation with CodeIgniter PHP Framework</title><link>https://blog.wu-boy.com/2012/11/2012-phpconf-restful-api-design-implementation-with-codeigniter-php-framework/</link><pubDate>Sat, 03 Nov 2012 06:21:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/11/2012-phpconf-restful-api-design-implementation-with-codeigniter-php-framework/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/8149789818/" title="phpconf by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm9.staticflickr.com/8474/8149789818_40bb35a5c0.jpg?resize=500%2C375&amp;#038;ssl=1" alt="phpconf" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;去年 &lt;a href="http://phpconf.tw/" target="_blank"&gt;PHPConf&lt;/a&gt; 介紹了 &lt;a href="http://www.codeigniter.org.tw/" target="_blank"&gt;CodeIgniter PHP Framework&lt;/a&gt;，這次講如何在 CodeIgniter 底下設計 RESTFul API，其實主要介紹兩個 CodeIgniter 套件，第一個是 &lt;a href="https://github.com/philsturgeon/codeigniter-restserver" target="_blank"&gt;RESTFul Server&lt;/a&gt; 前面是 &lt;a href="https://github.com/philsturgeon/codeigniter-restclient" target="_blank"&gt;RESTFul Client&lt;/a&gt;，一個伺服器端，後面用來測試 (Unit Test)，底下是今年的 Slide，歡迎大家下載&lt;/p&gt;
&lt;div style="margin-bottom:5px"&gt;
 &lt;strong&gt; &lt;a href="http://www.slideshare.net/appleboy/restful-api-design-implementation-with-codeigniter-php-framework" title="RESTful API Design &amp; Implementation with CodeIgniter PHP Framework" target="_blank"&gt;RESTful API Design &amp; Implementation with CodeIgniter PHP Framework&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href="http://www.slideshare.net/appleboy" target="_blank"&gt;Bo-Yi Wu&lt;/a&gt;&lt;/strong&gt;
&lt;/div&gt;</description></item><item><title>PHP 免費雲端主機 PHPFog vs Pagoda vs AppFog</title><link>https://blog.wu-boy.com/2012/10/php-cloud-hosting-phpfog-pagoda-appfog/</link><pubDate>Sat, 20 Oct 2012 02:35:52 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/10/php-cloud-hosting-phpfog-pagoda-appfog/</guid><description>&lt;div style="margin: 0 auto;text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6034284842/" title="php-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm7.static.flickr.com/6186/6034284842_351ff33711_m.jpg?resize=240%2C127&amp;#038;ssl=1" alt="php-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 今天筆者來介紹幾套目前免費的雲端虛擬主機服務，自從 
&lt;p&gt;&lt;a href="http://git-scm.com/" target="_blank"&gt;Git&lt;/a&gt; 版本控制的出現後，大家可以發現，以往免費的虛擬主機搭配後台 Panel，這種模式已經不再看到，取代而之的就是用 Git 來管理程式碼，而不是用 FTP 上下傳方式了。筆者認為學會 Git，是一件非常重要的事情，這樣可以嘗試不同雲端服務，，像是 &lt;a href="https://phpfog.com/" target="_blank"&gt;PHPFog&lt;/a&gt;，&lt;a href="https://pagodabox.com/" target="_blank"&gt;Pagoda Box&lt;/a&gt;，&lt;a href="http://www.appfog.com/" target="_blank"&gt;AppFog&lt;/a&gt; &amp;hellip;等。這次介紹的雲端主機服務不同於 &lt;a href="http://www.linode.com/" target="_blank"&gt;Linode VPS&lt;/a&gt;，Linode 是可以拿到完整的虛擬主機權限，可以進行主機的效能優化，以及安裝合適的套件。&lt;/p&gt;</description></item><item><title>PHP MVC Framework 搭配 Nginx + PHP-FPM 設定檔</title><link>https://blog.wu-boy.com/2012/10/php-mvc-framework-nginx-php-fpm/</link><pubDate>Mon, 08 Oct 2012 12:03:03 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/10/php-mvc-framework-nginx-php-fpm/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6248708214/" title="Laravel PHP Framework by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm7.static.flickr.com/6038/6248708214_ef1133d0e9_o.png?resize=283%2C101&amp;#038;ssl=1" alt="Laravel PHP Framework" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 相信大家都知道 
&lt;p&gt;&lt;a href="http://nginx.com/" target="_blank"&gt;Nginx&lt;/a&gt; 搭配 &lt;a href="http://php-fpm.org/" target="_blank"&gt;PHP-FPM&lt;/a&gt; 用起來效能還不錯，這次來筆記如何設定 Nginx 去除 PHP MVC Framework 討厭的 index.php 字串，不管是 &lt;a href="http://laravel.com/" target="_blank"&gt;Laravel&lt;/a&gt; 或 &lt;a href="http://codeigniter.org.tw" target="_blank"&gt;CodeIgniter&lt;/a&gt; 教學文件都是在 &lt;a href="http://www.apache.org/" target="_blank"&gt;Apache&lt;/a&gt; 設定 &lt;a href="http://en.wikipedia.org/wiki/Htaccess" target="_blank"&gt;.htaccess&lt;/a&gt; 來達成 Cleaner URL，Apache 最大好處支援 .htaccess，但是 Nginx 也有強大的效能，此篇紀錄如何設定 Nginx 達成 &lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html" target="_blank"&gt;mod_rewrite&lt;/a&gt; 效果。&lt;/p&gt;</description></item><item><title>Windows 下安裝 sshfs</title><link>https://blog.wu-boy.com/2012/09/sshfs-filesystem-for-windows/</link><pubDate>Wed, 26 Sep 2012 08:57:10 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/09/sshfs-filesystem-for-windows/</guid><description>&lt;p&gt;遠端寫程式最方便的就是架個 FTP，並且用支援 FTP 模式的編輯器開始編輯，個人推薦 Windows 底下用 &lt;a href="http://www.pspad.com/" target="_blank"&gt;PSPad&lt;/a&gt; 或 &lt;a href="http://www.sublimetext.com/" target="_blank"&gt;Sublime&lt;/a&gt;，另外一種方式就是透過 &lt;a href="http://fuse.sourceforge.net/sshfs.html" target="_blank"&gt;sshfs&lt;/a&gt; 將 Linux 的硬碟 mount 到自己的系統，如果是 &lt;a href="http://www.ubuntu.com/" target="_blank"&gt;Ubuntu&lt;/a&gt; 就很簡單，可以參考我以前寫的&lt;a href="http://blog.wu-boy.com/2011/07/linux-geany-fuse/" target="_blank"&gt;教學&lt;/a&gt;，那 Windows 呢，可以透過 &lt;a href="http://code.google.com/p/win-sshfs/" target="_blank"&gt;Google win-sshfs project&lt;/a&gt;，把 &lt;a href="http://dokan-dev.net/wp-content/uploads/DokanInstall_0.6.0.exe" target="_blank"&gt;Dokan Library 0.6.0&lt;/a&gt; 跟&lt;a href="http://win-sshfs.googlecode.com/files/win-sshfs-0.0.1.5-setup.exe" target="_blank"&gt;主程式 win-sshfs&lt;/a&gt; 安裝好就可以用了。比較需要注意的是，如果 Server 是 &lt;a href="http://www.freebsd.org" target="_blank"&gt;FreeBSD&lt;/a&gt;，那需要而外設定 &lt;strong&gt;&lt;span style="color:green"&gt;/etc/ssh/sshd_config&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;PasswordAuthentication yes&lt;/pre&gt;</description></item><item><title>[PHP] preg_replace 效能測試 (將兩個空白字元以上取代成一個)</title><link>https://blog.wu-boy.com/2012/09/php-preg_replace-performance/</link><pubDate>Fri, 21 Sep 2012 12:28:29 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/09/php-preg_replace-performance/</guid><description>&lt;div style="margin: 0 auto;text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6034284842/" title="php-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm7.static.flickr.com/6186/6034284842_351ff33711_m.jpg?resize=240%2C127&amp;#038;ssl=1" alt="php-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://php.net/manual/en/function.preg-replace.php" target="_blank"&gt;preg_replace&lt;/a&gt; 可以使用正規語法來取代字串任何字元，，今天探討取代空白字元的效能，雖然這是個不起眼的效能評估，一般人不太會這樣去改，不過這是國外 PHP Framework 有人提出來修正的，經過許多人的測試一致同意。功能就是一篇文章內如果有多餘的空白能空取代成一個，一般人都會用 &lt;strong&gt;&lt;span style="color:green"&gt;\s+&lt;/span&gt;&lt;/strong&gt; 正規語法，畢竟大家都知道 \s 代表單一空白或 \r 等符號，但是國外有人提出用 &lt;strong&gt;&lt;span style="color:green"&gt;{2,}&lt;/span&gt;&lt;/strong&gt; 方式來取代空白。程式碼如下，大家可以測試看看。&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;&lt;?php
$nb = 10000;
$str = str_repeat('Hi, I am appleboy ' . "\n", 10);
$t1 = microtime(true);
for ($i = $nb; $i--; ) {
 preg_replace('/\s+/', ' ', $str);
}
$t2 = microtime(true);
for ($i = $nb; $i--; ) {
 preg_replace('/ {2,}/', ' ', str_replace(array("\r", "\n", "\t", "\x0B", "\x0C"), ' ', $str));
}
$t3 = microtime(true);

echo $t2 - $t1;
echo "\n";
echo $t3 - $t2;[/code]

測試結果(1萬次)




PHP 5.3.3
old: 0.13053798675537
new: 0.058536052703857

PHP 5.3.15
old: 0.11732506752014
new: 0.071418046951294

PHP 5.3.17
old: 0.11612010002136
new: 0.07065486907959

PHP 5.4.5
old: 0.1185781955719
new: 0.066012859344482

PHP 5.4.7
old: 0.11343121528625
new: 0.066931962966919
&lt;/pre&gt; 結論至少快蠻多的，如果整體資料量再大一點，我想差別會更大，那至於要不要用呢，就看個人了 XD。</description></item><item><title>簡易 PHP Excel Generator Library</title><link>https://blog.wu-boy.com/2012/09/a-simple-php-to-excel-conversion-library/</link><pubDate>Fri, 14 Sep 2012 12:47:15 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/09/a-simple-php-to-excel-conversion-library/</guid><description>&lt;div style="margin: 0 auto;text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6034284842/" title="php-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm7.static.flickr.com/6186/6034284842_351ff33711_m.jpg?resize=240%2C127&amp;#038;ssl=1" alt="php-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 因為專案需求，必須將資料庫資料輸出成簡易 Excel 檔案，如果要用 PHP 取裡 Excel 文件，我想大家首推一定是 
&lt;p&gt;&lt;a href="http://phpexcel.codeplex.com/" target="_blank"&gt;PHPExcel&lt;/a&gt;，不管你要對 Excel 做任何處理都一定辦的到，但是專案只需要 generate excel 簡易表格出來，有需要這麼強大的 PHPExcel，網路上找到一個非常簡易的 Library 那就是 &lt;a href="http://code.google.com/p/php-excel/" target="_blank"&gt;php-excel&lt;/a&gt; 作者似乎現在沒再更新了，不過已經夠專案使用了，PHP 程式碼也非常簡單。&lt;/p&gt;
&lt;h3 id="how-to-use-程式碼很簡易"&gt;How to use 程式碼很簡易&lt;/h3&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;$header = array('編號', '姓名', '電話'); 
$body = array('1', '小惡魔', '0934353289'); 
$xls = new Excel_XML;
$xls-&gt;addRow($header);
$xls-&gt;addRow($body);
$xls-&gt;generateXML("test");&lt;/pre&gt; 或是將資料寫成多為陣列 
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;$body = array(array('編號', '姓名', '電話'), array('1', '小惡魔', '0934353289')); 
$xls = new Excel_XML;
$xls-&gt;addArray($body);
$xls-&gt;generateXML("test");&lt;/pre&gt; 結論就是殺雞焉用牛刀，就這個簡易 Library 就對了。</description></item><item><title>CSS layout 好幫手 Compass scss version of normalize.css</title><link>https://blog.wu-boy.com/2012/09/compass-scss-version-of-normalize-css/</link><pubDate>Thu, 13 Sep 2012 01:53:03 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/09/compass-scss-version-of-normalize-css/</guid><description>&lt;p&gt;我相信網頁程式設計師都知道，網站一開始必須先使用 &lt;a href="http://html5doctor.com/html-5-reset-stylesheet/" target="_blank"&gt;CSS Rest&lt;/a&gt; 將所有的 browser layout 初始化，這樣可以讓以後 CSS debug 速度增加，也解決了很多跨瀏覽器的問題，昨天使用 &lt;a href="https://github.com/sporkd/compass-h5bp" target="_blank"&gt;Compass-h5bp&lt;/a&gt; 來自動產生 html5 template，但是發現版本並非是 &lt;a href="http://html5boilerplate.com/" target="_blank"&gt;html5 boilerplate&lt;/a&gt; 所提供的 V4.0.0 版本，專案裡面的 &lt;a href="http://necolas.github.com/normalize.css/" target="_blank"&gt;Normalize.css&lt;/a&gt; 也是舊版的，雖然有其他開發者提交 &lt;a href="https://github.com/sporkd/compass-h5bp/pull/8" target="_blank"&gt;pull request&lt;/a&gt;，但是作者似乎還沒 merge 到主分支，只是我好奇這個 tool 除了幫忙產生 html5 boilerplate，另外多了 &lt;a href="http://compass-style.org/" target="_blank"&gt;Compass&lt;/a&gt; 檔案，讓寫 Compass 前端工程師更加方便，由於 Normalize.css 還沒更新，所以我 fork 了 &lt;a href="https://github.com/necolas/normalize.css" target="_blank"&gt;normalize.css 專案&lt;/a&gt;，並且將 v2.0.1(IE 8+, Firefox 4+, Safari 5+, Opera, Chrome) 跟 v1.0.1 (Includes legacy browser support) 整合在同一支 scss 檔案，歡迎大家取用。 如果要支援 IE6/7 的話，請將 &lt;strong&gt;&lt;span style="color:green"&gt;$legacy_browser_support&lt;/span&gt;&lt;/strong&gt; 設定為 true 即可。檔案可以由底下專案取得 &lt;a href="https://github.com/appleboy/normalize.scss/blob/master/normalize.scss"&gt;SCSS version of normalize.css&lt;/a&gt;&lt;/p&gt;</description></item><item><title>CodeIgniter 3.0.x 支援 Native Session Driver</title><link>https://blog.wu-boy.com/2012/08/codeigniter-3-0-x-support-native-session-driver/</link><pubDate>Thu, 30 Aug 2012 12:54:11 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/08/codeigniter-3-0-x-support-native-session-driver/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 看來 
&lt;p&gt;&lt;a href="http://www.codeigniter.org.tw/" target="_blank"&gt;CodeIgniter&lt;/a&gt; 團隊看到大家的心聲了，在 2.0.x 版本的時候就已經有人開始發 patch 讓 CI 可以支援 Native Session，也就是透過 session_start 來存取 session，而不是本來的 cookie session，很高興 &lt;a href="http://philsturgeon.co.uk/" target="_blank"&gt;philsturgeon&lt;/a&gt; (&lt;a href="http://fuelphp.com/" target="_blank"&gt;Fuel Framework&lt;/a&gt; 作者) 今天將此功能 merge 進來 3.0.x 分支，另外 Session 也同時抽出來變成 &lt;a href="http://www.codeigniter.org.tw/user_guide/general/drivers.html" target="_blank"&gt;Driver&lt;/a&gt; 而不是單一個 &lt;a href="http://www.codeigniter.org.tw/user_guide/general/libraries.html" target="_blank"&gt;Library&lt;/a&gt; 了，詳細可以看&lt;a href="https://github.com/EllisLab/CodeIgniter/commit/1e40c21" target="_blank"&gt;此 Patch 連結&lt;/a&gt;，也因為這樣所以之前自己寫的 &lt;a href="https://github.com/appleboy/CodeIgniter-Native-Session" target="_blank"&gt;CodeIgniter-Native-Session&lt;/a&gt; 可以功成身退了。目前官方同時維護兩個分支，2.1.x 另外是 3.0.x，後者是專門開發新功能，有機會在慢慢介紹。&lt;/p&gt;</description></item><item><title>快速修正專案 PHP Coding Standards</title><link>https://blog.wu-boy.com/2012/08/php-coding-standards-fixer/</link><pubDate>Mon, 20 Aug 2012 03:52:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/08/php-coding-standards-fixer/</guid><description>&lt;p&gt;底下是之前的投影片教導創業團隊制定 PHP 程式碼規範，讓工程師可以遵循此規則達到團隊合作&lt;/p&gt;
&lt;script async class="speakerdeck-embed" data-id="500f7e81ac941a0002026499" data-ratio="1.33507170795306" src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;
&lt;p&gt;投影片內容都是&lt;a href="http://blog.wu-boy.com/2012/07/about-php-fig-group-coding-style-guide/" target="_blank"&gt;現有 PHP FIG Group 所制定的 PSR-0, PSR-1, PSR-2 規則&lt;/a&gt;，那如何將既有專案的 Coding Style 轉換成上述標準呢，可以透過 &lt;a href="http://cs.sensiolabs.org/" target="_blank"&gt;PHP Coding Standards Fixer tool&lt;/a&gt; 來快速完成，此工具是由 &lt;a href="http://www.symfony-project.org/" target="_blank"&gt;Symfony Framework&lt;/a&gt; 完成。透過此工具可以快速且無痛轉換程式碼風格，舉個簡單例子:&lt;/p&gt;</description></item><item><title>輕量級 jQuery Slideshow Plugin</title><link>https://blog.wu-boy.com/2012/08/a-lightweight-jquery-slideshow-plugin/</link><pubDate>Sun, 12 Aug 2012 06:08:42 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/08/a-lightweight-jquery-slideshow-plugin/</guid><description>&lt;p&gt;相信在網路上可以找到一堆 jQuery Slideshow Plugin，例如 &lt;a href="http://www.themeflash.com/30-powerful-jquery-slideshow-sliders-plugins-and-tutorials/" target="_blank"&gt;33 POWERFUL JQUERY SLIDESHOW (SLIDERS) PLUGINS AND TUTORIALS&lt;/a&gt; 介紹了 33 種不同的 Slideshow Plugin，有些用起來很複雜，有些則是過於簡易，本來是想自己寫一套出來，但是想想是否可以找一套已經有輪子的架構，再拿來修改成專案所需要的套件，於是參考了&lt;a href="https://github.com/Ephigenia/jquery.slideShow" target="_blank"&gt;這套&lt;/a&gt;原始碼，發現此專案只有提供 fade 和 slide 兩種效果，沒有像是投影片可以任意滑動的功能，所以自己把此功能 patch 上去，可以參考我放到 &lt;a href="https://github.com/appleboy/jquery.slideShow" target="_blank"&gt;Github 的專案&lt;/a&gt;，寫法很容易，可以直接看&lt;a href="http://appleboy.github.com/jquery/example_2/" target="_blank"&gt;線上 Example&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id="載入-jquery-和-plugin"&gt;載入 jQuery 和 plugin&lt;/h3&gt;
&lt;pre class="brush: xml; title: ; notranslate" title=""&gt;&lt;/pre&gt;</description></item><item><title>Ubuntu 停止使用 GUI 介面 12.04 LTS</title><link>https://blog.wu-boy.com/2012/08/how-to-disabled-gui-on-ubuntu-12-04-lts/</link><pubDate>Mon, 06 Aug 2012 06:28:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/08/how-to-disabled-gui-on-ubuntu-12-04-lts/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6760100409/" title="logo-Ubuntu by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm8.staticflickr.com/7153/6760100409_b23d1ce67b_m.jpg?resize=240%2C165&amp;#038;ssl=1" alt="logo-Ubuntu" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;今天又拿到同事一台電腦來搞 Web Server，原先安裝 Ubuntu Desktop 要把它關閉，避免佔用太多資源，12.04 採用 &lt;a href="http://en.wikipedia.org/wiki/LightDM" target="_blank"&gt;LightDM&lt;/a&gt; 來管理 X Display，輕量級及高效能管理工具，直接停止 LightDM 可以直接用底下 command line。&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ service lightdm stop&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;如果開機直接不執行 X Display，可以透過底下步驟，&lt;/p&gt;
&lt;h3 id="編輯-etcdefaultgrub"&gt;編輯 /etc/default/grub&lt;/h3&gt;
&lt;p&gt;用您個人喜歡的編輯器打開 &lt;code&gt;/etc/default/grub&lt;/code&gt; 並且找到底下字串&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;GRUB_CMDLINE_LINUX_DEFAULT="&lt;no matter what's you find here&gt;"&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;改成&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;GRUB_CMDLINE_LINUX_DEFAULT="text"&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id="重新產生-grub"&gt;重新產生 Grub&lt;/h3&gt;
&lt;p&gt;只要有修改 &lt;code&gt;/etc/default/grub&lt;/code&gt;，請務必重執行&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ sudo update-grub&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;接著重新開機即可。&lt;/p&gt;
&lt;p&gt;參考資料:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://askubuntu.com/questions/74645/possible-to-install-ubuntu-desktop-and-then-boot-to-no-gui" target="_blank"&gt;Possible to install ubuntu-desktop and then boot to no GUI&lt;/a&gt; &lt;a href="http://superuser.com/questions/310978/starting-ubuntu-without-the-gui" target="_blank"&gt;Starting Ubuntu without the GUI&lt;/a&gt;&lt;/p&gt;</description></item><item><title>解決 Ubuntu MP3 亂碼</title><link>https://blog.wu-boy.com/2012/07/how-to-transform-ubuntu-mp3-tag/</link><pubDate>Sun, 29 Jul 2012 03:34:56 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/07/how-to-transform-ubuntu-mp3-tag/</guid><description>&lt;p&gt;在 Ubuntu 底下使用 &lt;a href="http://projects.gnome.org/rhythmbox/" target="_blank"&gt;Rhythmbox Music Player&lt;/a&gt; 來聽音樂，但是 import 整個 MP3 目錄之後，會看到全部都是亂碼的列表，解決方式就是用 &lt;a href="http://easytag.sourceforge.net/" target="_blank"&gt;EasyTag&lt;/a&gt; 軟體先將 MP3 標題轉碼，方式也很簡單，底下跟著操作就可以了。&lt;/p&gt;
&lt;h3 id="安裝-easytag-透過-apt-get-方式安裝"&gt;安裝 EasyTag 透過 apt-get 方式安裝&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ sudo aptitude -y install easytag&lt;/pre&gt;
&lt;h3 id="轉馬步驟-打開偏好設定altp"&gt;轉馬步驟 打開偏好設定(Alt+P)&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/7666075554/" title="Screenshot from 2012-07-29 11:27:37 by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm8.staticflickr.com/7252/7666075554_32b16bd1ff.jpg?resize=500%2C350&amp;#038;ssl=1" alt="Screenshot from 2012-07-29 11:27:37" data-recalc-dims="1" /&gt;&lt;/a&gt; 看到左下角(Character Set for reading ID3 Tag3)，先選擇您的語言，看是中文歌單，還是日文，選完之後先將程式關閉，關閉之前如果系統通知說要轉換，請務必先取消，之後再打開此軟體，直到看到歌單 Tags 可以正確顯示，才進行轉換。 參考網站: &lt;a href="http://victe.blogspot.tw/2008/04/ubuntump3-tag.html" target="_blank"&gt;[Ubuntu]MP3 tag亂碼解決—不用任何指令&lt;/a&gt;&lt;/p&gt;</description></item><item><title>關於 PHP FIG Group 所制定的 PSR-0, PSR-1, PSR-2</title><link>https://blog.wu-boy.com/2012/07/about-php-fig-group-coding-style-guide/</link><pubDate>Mon, 23 Jul 2012 06:06:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/07/about-php-fig-group-coding-style-guide/</guid><description>&lt;p&gt;上禮拜寫了一篇 &lt;a href="http://blog.wu-boy.com/2012/07/how-to-write-maintainable-php-source-code/" target="_blank"&gt;寫出好維護的 PHP 程式碼&lt;/a&gt;，看到 &lt;a href="http://blog.gslin.org/" target="_blank"&gt;gslin 大神&lt;/a&gt;回應了一篇 &lt;a href="http://blog.gslin.org/archives/2012/07/23/2928/%E9%97%9C%E6%96%BC%E5%8F%AF%E7%B6%AD%E8%AD%B7%E7%9A%84-php-%E5%B0%88%E6%A1%88%EF%BC%9Aphp-fig-%E7%9A%84-psr-0%E3%80%81psr-1%E3%80%81psr-2/" target="_blank"&gt;關於可維護的 PHP 專案：PHP-FIG 的 PSR-0、PSR-1、PSR-2&lt;/a&gt;，其實我已經關注 &lt;a href="http://www.php-fig.org/" target="_blank"&gt;PHP FIG&lt;/a&gt; 有一陣子了，FIG 所定義的三份文件 PSR-0 (&lt;a href="https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md" target="_blank"&gt;Auto loading Standard&lt;/a&gt;), PSR-1 (&lt;a href="https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md" target="_blank"&gt;Basic Coding Standard&lt;/a&gt;), PSR-2 &lt;a href="https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md" target="_blank"&gt;(Coding Style Standard&lt;/a&gt;) 寫的非常清楚，目的就是讓 PHP Open Source 專案有共同的 Coding Standard，方便大家共同開發。所以上禮拜提到的投影片內容有大部份參考了這份文件，裏面的內容比較不同的地方就差於 Control Structures 部份，舉個簡單例子： 寫 if 條件式，網路上只有兩種寫法 &amp;lt;?php
if ($a == $b) {
&amp;hellip;&amp;hellip;
}[/code]&lt;/p&gt;
&lt;p&gt;另外一種寫法&lt;/p&gt;
&lt;p&gt;[code lang=&amp;ldquo;php&amp;rdquo;]&amp;lt;?php
if ($a == $b)
{
&amp;hellip;&amp;hellip;
}[/code]&lt;/p&gt;</description></item><item><title>寫出好維護的 PHP 程式碼</title><link>https://blog.wu-boy.com/2012/07/how-to-write-maintainable-php-source-code/</link><pubDate>Sat, 21 Jul 2012 08:30:53 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/07/how-to-write-maintainable-php-source-code/</guid><description>&lt;p&gt;今天有機會到台中幫創業團隊制定 PHP Coding Style，相信程式設計師每天花最多時間的就是 maintain code 了，如何寫出大家都易於維護的程式碼，必須先制定團隊的 coding style 為首要目標，底下分享個人推薦的寫法給大家參考，希望對於未來維護，轉移程式碼或教育訓練剛起步的團隊有些幫助。&lt;/p&gt;
&lt;script async class="speakerdeck-embed" data-id="500f7e81ac941a0002026499" data-ratio="1.33333333333" src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;</description></item><item><title>開發 iPhone Mobile Web App 一些小技巧</title><link>https://blog.wu-boy.com/2012/07/develop-iphone-moblie-web-app-tip/</link><pubDate>Tue, 17 Jul 2012 05:49:30 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/07/develop-iphone-moblie-web-app-tip/</guid><description>&lt;p&gt;開發 Mobile Web App 有好一陣子，底下來紀錄過去開發的一些經驗以及 iPhone 上面一些 meta 的設定小技巧，適用於 Mobile Web 開發，如果有任何錯誤，請大家可以留言給我，也或者有不錯的建議都可以一起討論。不過此篇文章會比較偏向 iOS iPhone Device 上面的開發技巧。那廢話不多說了，來看看設計 Mobile 需要注意哪些事項。&lt;/p&gt;
&lt;h3 id="良好的設計模式-底下是-web-程式設計師應該注意的事項"&gt;良好的設計模式 底下是 Web 程式設計師應該注意的事項&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;html 檔案必須宣告 DOCTYPE 型態&lt;br&gt;
以目前 HTML5 就必須寫成 &lt;!DOCTYPE html&gt;&lt;/li&gt;
&lt;li&gt;完全區隔 HTML, CSS, 和 JavaScript 檔案，以便將來好維護或擴充&lt;/li&gt;
&lt;li&gt;完整的 html 架構，不要少個單引號或雙引號，或是少寫 close tag&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>CSS Layout 好幫手 Twitter bootstrap CDN</title><link>https://blog.wu-boy.com/2012/07/css-layout-twitter-bootstrap-cdn/</link><pubDate>Sat, 07 Jul 2012 05:52:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/07/css-layout-twitter-bootstrap-cdn/</guid><description>&lt;p&gt;我相信大家對於 &lt;a href="http://twitter.github.com/bootstrap/" target="_blank"&gt;Twitter Bootstrap&lt;/a&gt; 並不陌生，它解決了程式設計師 Layout CSS 版面很多問題，並且提供多種 js plugin 及 CSS 樣式讓整個網站看起來更專業了。這次發現 &lt;a href="http://www.netdna.com/" target="_blank"&gt;NetDNA&lt;/a&gt; 這間 CDN 公司推出了 &lt;a href="http://www.bootstrapcdn.com/" target="_blank"&gt;Twitter Bootstrap CDN 服務&lt;/a&gt;，不管 twitter bootstrap 提供了哪些 CSS 和 javascript，CDN 都已經有檔案可以使用。 如果要載入整個 CSS 和 Javascript 可以直接 include底下兩個檔案&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# CSS
//current.bootstrapcdn.com/bootstrap-v204/css/bootstrap-combined.min.css
# JS
//current.bootstrapcdn.com/bootstrap-v204/js/bootstrap.min.js&lt;/pre&gt;</description></item><item><title>[筆記] 解決 apache mod_fcgid: HTTP request length 136000 (so far) exceeds MaxRequestLen (131072)</title><link>https://blog.wu-boy.com/2012/06/fix-apache-mod_fcgid-http-request-length-136000-so-far-exceeds-maxrequestlen/</link><pubDate>Sat, 30 Jun 2012 00:41:29 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/06/fix-apache-mod_fcgid-http-request-length-136000-so-far-exceeds-maxrequestlen/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6760100409/" title="logo-Ubuntu by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm8.staticflickr.com/7153/6760100409_b23d1ce67b_m.jpg?resize=240%2C165&amp;#038;ssl=1" alt="logo-Ubuntu" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 上次寫了一篇 
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/2012/05/php-fastcgi-with-nginx-on-ubuntu-10-10-maverick/" target="_blank"&gt;Ubuntu 10.10 (Maverick) 架設 Nginx + PHP FastCGI&lt;/a&gt;，不過在 PHP 上傳檔案部份發現了問題，打開 &lt;span style="color:green"&gt;/var/log/apache2/error.log&lt;/span&gt; 發現底下錯誤訊息:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;mod_fcgid: HTTP request length 136000 (so far) exceeds MaxRequestLen (131072) 上網找了一下是 fcgid.conf 設定錯誤，解決方式非常簡單，只要打開 &lt;span style="color:green"&gt;&lt;strong&gt;/etc/apache2/mods-available/fcgid.conf&lt;/strong&gt;&lt;/span&gt;，將底下內容&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>PHP 程式設計師必備 Xdebug extension 安裝 on Ubuntu</title><link>https://blog.wu-boy.com/2012/06/how-to-install-xdebub-extension-on-ubuntu/</link><pubDate>Sun, 17 Jun 2012 06:18:38 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/06/how-to-install-xdebub-extension-on-ubuntu/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/5806873037/" title="xdebug-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm6.static.flickr.com/5108/5806873037_823aef3cd1_o.png?resize=200%2C116&amp;#038;ssl=1" alt="xdebug-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 之前寫了一篇
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/2011/06/%E5%A5%BD%E7%94%A8-php-debug-extension-xdebug-on-freebsd-%E5%AE%89%E8%A3%9D/" target="_blank"&gt;在 FreeBSD 的安裝方式&lt;/a&gt;，這次來紀錄如何在 Ubuntu 系統上安裝 &lt;a href="http://xdebug.org/" target="_blank"&gt;Xdebug PHP extension&lt;/a&gt;，開發網頁有太多的 debug 工具，其實最重要只要找到合適的開發環境，縮短專案開發程式時間，那底下就是介紹如何安裝在 Ubuntu 12.04 系統上。&lt;/p&gt;
&lt;h3 id="系統安裝-透過-ubuntu-內建程式-apt-安裝即可"&gt;系統安裝 透過 Ubuntu 內建程式 apt 安裝即可&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# php xdebug
aptitude -y install php5-dev
aptitude -y install php-pear
pecl install xdebug&lt;/pre&gt;</description></item><item><title>程式設計師需要注意的 PHP 5.4 變化</title><link>https://blog.wu-boy.com/2012/06/what-has-changed-in-php-5-4-x/</link><pubDate>Tue, 12 Jun 2012 05:48:51 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/06/what-has-changed-in-php-5-4-x/</guid><description>&lt;div style="margin: 0 auto;text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6034284842/" title="php-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm7.static.flickr.com/6186/6034284842_351ff33711_m.jpg?resize=240%2C127&amp;#038;ssl=1" alt="php-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://www.php.net" target="_blank"&gt;PHP&lt;/a&gt; 5.4.0 在美國時間2012年3月1號釋出，到現在已經發展到 &lt;a href="http://www.php.net/archive/2012.php#id2012-05-08-1" target="_blank"&gt;5.4.3&lt;/a&gt;，之前寫過一篇 &lt;a href="http://blog.wu-boy.com/2012/03/php-5-4-0-released/" target="_blank"&gt;PHP 5.4.0 released!! 新功能&lt;/a&gt;，這次我們來探討看看 PHP 5.4.x 對於程式設計師在轉換平台或者是開發新功能所需要注意的地方。&lt;/p&gt;</description></item><item><title>在 Fedora 或 Amazon Linux AMI 架設 Nginx + PHP FastCGI</title><link>https://blog.wu-boy.com/2012/05/install-nginx-php-fastcgi-on-amazon-linux/</link><pubDate>Mon, 28 May 2012 11:34:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/05/install-nginx-php-fastcgi-on-amazon-linux/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/7285947094/" title="799px-Amazon.com-Logo.svg by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm8.staticflickr.com/7221/7285947094_9e34eeb903.jpg?resize=500%2C101&amp;#038;ssl=1" alt="799px-Amazon.com-Logo.svg" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 上一篇介紹
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/2012/05/php-fastcgi-with-nginx-on-ubuntu-10-10-maverick/" target="_blank"&gt;如何在 Ubuntu 底下安裝 Nginx + PHP FastCGI&lt;/a&gt;，這次來紀錄如何安裝在 Fedora 系統，目前環境是使用 &lt;a href="http://aws.amazon.com/amazon-linux-ami/" target="_blank"&gt;Amazon Linux AMI&lt;/a&gt;，如果有在玩 &lt;a href="http://aws.amazon.com/ec2/" target="_blank"&gt;AWS EC2&lt;/a&gt; 或是 &lt;a href="http://fedoraproject.org/" target="_blank"&gt;Fedora Linux&lt;/a&gt; 的話，對這 OS 就不會很陌生了。&lt;/p&gt;</description></item><item><title>在 Ubuntu 10.10 (Maverick) 架設 Nginx + PHP FastCGI</title><link>https://blog.wu-boy.com/2012/05/php-fastcgi-with-nginx-on-ubuntu-10-10-maverick/</link><pubDate>Fri, 25 May 2012 13:41:19 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/05/php-fastcgi-with-nginx-on-ubuntu-10-10-maverick/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6760100409/" title="logo-Ubuntu by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm8.staticflickr.com/7153/6760100409_b23d1ce67b_m.jpg?resize=240%2C165&amp;#038;ssl=1" alt="logo-Ubuntu" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 今天來筆記如何在 
&lt;p&gt;&lt;a href="http://www.ubuntu-tw.org/" target="_blank"&gt;Ubuntu&lt;/a&gt; 底下完整安裝 &lt;a href="http://nginx.org/" target="_blank"&gt;Nginx&lt;/a&gt; + &lt;a href="http://www.fastcgi.com/drupal/" target="_blank"&gt;PHP FastCGI&lt;/a&gt;，以及了解 Nginx 基本設定。我想大家都知道 &lt;a href="http://www.apache.org/" target="_blank"&gt;Apache&lt;/a&gt; 是一個很好的 Web Server 伺服器，也常常用在個人網站，或者一般小型專案，網路上也有一堆懶人包，如 &lt;a href="http://www.appservnetwork.com/" target="_blank"&gt;Appserv&lt;/a&gt;, &lt;a href="http://www.apachefriends.org/zh_tw/xampp.html" target="_blank"&gt;Xampp&lt;/a&gt;，對於新手入門來說 Apache 是一個很好的選擇，但是您會發現用了 Apache 後，系統記憶體常常飆高 XD，載入太多額外不必要的模組，所以非常肥大，那這次就來嘗試另外一套 Web 伺服器 Nginx 吧。&lt;/p&gt;</description></item><item><title>台灣第一屆 JavaScript Conference Developer 會議</title><link>https://blog.wu-boy.com/2012/05/the-first-javascript-developer-conference-in-taiwan/</link><pubDate>Mon, 21 May 2012 06:39:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/05/the-first-javascript-developer-conference-in-taiwan/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm6.staticflickr.com/5454/7238452668_82262e37dc_o.png?w=840&amp;#038;ssl=1" alt="JSDC 2012" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;p&gt;自從去年辦了台灣第一屆 &lt;a href="http://phpconf.tw/2011"&gt;2011 PHP Conference&lt;/a&gt;，2012年開始又來新的第一屆 &lt;a href="http://jsdc.tw/2012/"&gt;Javascript Conference&lt;/a&gt;，在去年的 PHP 會議由於第一次開始舉辦 PHP Conference，所以比較少人投稿，導致議程裡面出現&lt;del&gt;很多&lt;/del&gt; Javascript 議題，這也是很多朋友的疑問 XD。底下來回顧 JSDC 5/19 (六) 個人參加的議程。由於早上差不多10點半才到，所以前兩場議程(Key Note - Ericsk, &lt;a href="http://jsdc.tw/2012/sliders/NodeJSOnWindowsAzure.pptx"&gt;Node.JS on Windows Azure&lt;/a&gt;)就沒有聽到了，比較可惜。如果沒去聽現場的，可以到&lt;a href="http://jsdc.tw/2012/Sessions"&gt;官方網站下載投影片&lt;/a&gt;參考。&lt;/p&gt;</description></item><item><title>[筆記] Ubuntu apt-get update 出現 NO_PUBKEY / GPG error</title><link>https://blog.wu-boy.com/2012/05/how-to-resolve-apt-get-no_pubkey-gpg-error/</link><pubDate>Thu, 10 May 2012 06:07:52 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/05/how-to-resolve-apt-get-no_pubkey-gpg-error/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6760100409/" title="logo-Ubuntu by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm8.staticflickr.com/7153/6760100409_b23d1ce67b_m.jpg?resize=240%2C165&amp;#038;ssl=1" alt="logo-Ubuntu" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 當我們更新 Ubuntu/Debian 伺服器套件時，apt-get update 出現底下錯誤訊息 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;W: GPG error: http://ppa.launchpad.net maverick Release: 
The following signatures couldn't be verified because the public key is not available: 
NO_PUBKEY 1C1E55A728CBC482&lt;/pre&gt;</description></item><item><title>如何使用 Apache Module mod_mime</title><link>https://blog.wu-boy.com/2012/05/how-to-use-apache-module-mod_mime/</link><pubDate>Thu, 10 May 2012 04:25:16 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/05/how-to-use-apache-module-mod_mime/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/7168729996/" title="apache_software_foundation_logo_3074 by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm9.staticflickr.com/8151/7168729996_452646f0f2_n.jpg?resize=320%2C169&amp;#038;ssl=1" alt="apache_software_foundation_logo_3074" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://httpd.apache.org/" target="_blank"&gt;Apache&lt;/a&gt; 可以透過 &lt;a href="http://httpd.apache.org/docs/current/mod/mod_mime.html" target="_blank"&gt;mod_mime&lt;/a&gt; 模組且根據使用者定義的副檔名來 response data 給 Client 端，此功能可以應用在前台搭配 Template Library，例如 &lt;a href="http://mustache.github.com/" target="_blank"&gt;Mustache Logic-less templates&lt;/a&gt;，透過此 Apache 模組 可以在 html 檔案將定義好全部 Template，一次讀取進來，底下舉個例子:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;&lt;/pre&gt; 我們希望 apache 能夠讀取 assets/templates/test1.mustache，並且將檔案內容放到 script 裡面，這時候就必須在 apache httpd.conf 定義 
&lt;p&gt;&lt;strong&gt;&lt;span style="color:green"&gt;text/x-mustache-template&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;&lt;IfModule mime_module&gt;
 AddType text/x-mustache-template .mustache
 AddOutputFilter INCLUDES .mustache
&lt;/IfModule&gt;
&lt;/pre&gt;</description></item><item><title>CodeIgniter TextMagic API Library Release (簡訊功能)</title><link>https://blog.wu-boy.com/2012/05/codeigniter-textmagic-api-library-release/</link><pubDate>Tue, 01 May 2012 08:16:05 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/05/codeigniter-textmagic-api-library-release/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 之前寫了 
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/2011/11/codeigniter-nexmo-message-api-library-release/" target="_blank"&gt;Nexmo 簡訊 API Library for CodeIgniter Framework&lt;/a&gt;，現在又發現國外新的一家簡訊系統，叫做 &lt;a href="http://www.textmagic.com" target="_blank"&gt;TextMagic&lt;/a&gt;，看了一下&lt;a href="http://www.textmagic.com/app/pages/en/pricing-coverage" target="_blank"&gt;簡訊價格&lt;/a&gt;，27 美金可以傳送 285 通簡訊，似乎比 &lt;a href="http://nexmo.com/" target="_blank"&gt;Nexmo&lt;/a&gt; 還貴了一些，不過沒關係，TextMagic 還支援了後台系統或者是 Email 來傳送簡訊，這點倒是不錯，相較於 Nexmo，TextMagic 後台多了太多功能了，不多說了，直接來使用 &lt;a href="http://www.codeigniter.org.tw/" target="_blank"&gt;CodeIgniter&lt;/a&gt; TextMagic Libray。&lt;/p&gt;</description></item><item><title>Windows 下安裝 Web Developer tool LiveReload</title><link>https://blog.wu-boy.com/2012/04/how-to-install-livereload-on-windows/</link><pubDate>Mon, 16 Apr 2012 03:08:05 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/04/how-to-install-livereload-on-windows/</guid><description>&lt;p&gt;去年寫了一篇: &lt;a href="http://blog.wu-boy.com/2011/10/how-to-install-livereload/" target="_blank"&gt;LiveReload 網頁程式設計師必備工具&lt;/a&gt;，介紹如何在 FreeBSD 及 Linux 底下安裝 &lt;a href="http://livereload.com/" target="_blank"&gt;Livereload&lt;/a&gt;，相信過程也都不難，只是筆者目前有在 Windows 底下開發 Web，原本是透過 Linux 來使用 Livereload，但是我發現只有在 Chrome 才可以 Work，但是 FireFox 提供的 &lt;a href="https://addons.mozilla.org/zh-tw/firefox/addon/livereload/" target="_blank"&gt;LiveReload :: Firefox 附加元件&lt;/a&gt;，安裝之後，發現瀏覽器根本沒有出現按鈕讓使用者連接伺服器，所以這方法作罷，查了官網資料才知道已經有提供 Windows 安裝檔架設 Server，及 Browser extension 來連接伺服器。&lt;/p&gt;</description></item><item><title>Backbone.js Event 事件介紹</title><link>https://blog.wu-boy.com/2012/04/introduction-to-backbone-js-event/</link><pubDate>Thu, 12 Apr 2012 13:06:28 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/04/introduction-to-backbone-js-event/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/7059615321/" title="backbone by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm6.staticflickr.com/5338/7059615321_097833dea8.jpg?resize=451%2C80&amp;#038;ssl=1" alt="backbone" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 今天我們可以來介紹 
&lt;p&gt;&lt;a href="http://documentcloud.github.com/backbone/#Events" target="_blank"&gt;Backbone.js Event&lt;/a&gt; 事件，介紹 Event 之前，大家可以先看看 &lt;a href="http://blog.wu-boy.com/2012/04/backbonejs-framework-tutorial-example-1/" target="_blank"&gt;Backbone.js 的初學介紹&lt;/a&gt;，該教學文件可以學習如何載入 Backbone.js library，利用此套件如何去制定各種事件。Backbone.js 提供了3個 method 去控制事件產生、移除、執行，分別是 &lt;a href="http://documentcloud.github.com/backbone/#Events-on" target="_blank"&gt;on(bind)&lt;/a&gt;、&lt;a href="http://documentcloud.github.com/backbone/#Events-off" target="_blank"&gt;off(unbind)&lt;/a&gt;、&lt;a href="http://documentcloud.github.com/backbone/#Events-trigger" target="_blank"&gt;trigger&lt;/a&gt;。文字上寫得很清楚 on 就等於 bind，off 就是 unbind，最後就是如何去 trigger 事件。底下就來簡單舉例:&lt;/p&gt;</description></item><item><title>jQuery 1.7 透過 on 來綁定事件</title><link>https://blog.wu-boy.com/2012/04/use-on-api-to-attach-event-handlers-on-jquery/</link><pubDate>Wed, 11 Apr 2012 12:49:27 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/04/use-on-api-to-attach-event-handlers-on-jquery/</guid><description>&lt;p&gt;既上一篇作者寫了 &lt;a href="http://blog.wu-boy.com/2012/04/backbonejs-framework-tutorial-example-1/" target="_blank"&gt;Javascript 前端工具 Backbone.js Framework 初學介紹&lt;/a&gt;，這次來將程式改寫成 jQuery 寫法，藉這個機會來介紹 jQuery 新功能 &lt;a href="http://api.jquery.com/on/" target="_blank"&gt;on API&lt;/a&gt;，底下來看看 jQuery event handle 的演進&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;//在 jQuery 1.3 以上版本
$(selector).live(events, data, handler);
//在 jQuery 1.4.3 以上版本 
$(document).delegate(selector, events, data, handler);
//在 jQuery 1.7 以上版本
$(document).on(events, selector, data, handler);&lt;/pre&gt; 上面三種寫法都可以綁定網頁上全部元件，如果只是單純只是用 click bind event 的話，那只要新增的元件就無法作用，講得有點抽象，底下直接看個例子:</description></item><item><title>Javascript 前端工具 Backbone.js Framework 初學介紹</title><link>https://blog.wu-boy.com/2012/04/backbonejs-framework-tutorial-example-1/</link><pubDate>Mon, 09 Apr 2012 12:01:27 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/04/backbonejs-framework-tutorial-example-1/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/7059615321/" title="backbone by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm6.staticflickr.com/5338/7059615321_097833dea8.jpg?resize=451%2C80&amp;#038;ssl=1" alt="backbone" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 我相信大家對於後端程式 
&lt;p&gt;&lt;a href="http://www.php.net" target="_blank"&gt;PHP&lt;/a&gt;, &lt;a href="http://www.ruby-lang.org/zh_TW/" target="_blank"&gt;Ruby&lt;/a&gt;, &lt;a href="http://www.python.org/" target="_blank"&gt;Python&lt;/a&gt; .. 等語言都已經相當熟悉，進階開發者也都接觸了好用的後端 Framework 如 &lt;a href="http://www.codeigniter.org.tw/" target="_blank"&gt;CodeIgniter&lt;/a&gt;, &lt;a href="http://cakephp.org/" target="_blank"&gt;CakePHP&lt;/a&gt;, &lt;a href="https://www.djangoproject.com/" target="_blank"&gt;Django&lt;/a&gt;, &lt;a href="http://rubyonrails.org/" target="_blank"&gt;Ruby on Rail&lt;/a&gt;, &lt;a href="http://www.yiiframework.com/" target="_blank"&gt;Yii&lt;/a&gt;, &lt;a href="http://www.symfony-project.org/" target="_blank"&gt;Symfony&lt;/a&gt; .. 等，用 Framework 最大的好處並不是在 Framework 提供了大量工具，而是制定了 MVC 架構，讓專案多位開發者可以遵循，上了講了這麼多後端 MVC Framework，那麼前端呢？接下來介紹前端強大工具: &lt;a href="http://documentcloud.github.com/backbone/" target="_blank"&gt;Backbone.js&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="什麼是-backbonejs-簡單來說-backbonejs-就是一套前端-javascript-framework它提供-mvc-架構相信大家都玩過後端-mvc那至於前端呢好像比較少人提到這就是介紹-backbonejs-最主要的目的backbonejs-包含了-model-view-controller-來讓使者操作model-提供了key-value-結構以及可以-binding-大量-event開發者可以透過-restful-json-interface-來跟-backbonejs-的-model-及-collection-搭配如果想瞭解-backbonejs-線上文件可以參考"&gt;什麼是 Backbone.js 簡單來說 Backbone.js 就是一套前端 Javascript Framework，它提供 MVC 架構，相信大家都玩過後端 MVC，那至於前端呢，好像比較少人提到，這就是介紹 Backbone.js 最主要的目的。Backbone.js 包含了 Model View Controller 來讓使者操作，Model 提供了key-value 結構，以及可以 binding 大量 event，開發者可以透過 RESTful JSON interface 來跟 Backbone.js 的 Model 及 Collection 搭配。如果想瞭解 Backbone.js 線上文件可以參考&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://github.com/documentcloud/backbone/" target="_blank"&gt;GitHub 網站&lt;/a&gt;，如果想瞭解程式碼可以參考 &lt;a href="http://documentcloud.github.com/backbone/docs/backbone.html" target="_blank"&gt;source code 註解&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>jQuery stopPropagation 和 stopImmediatePropagation 比較</title><link>https://blog.wu-boy.com/2012/03/jquery-different-form-stoppropagation-with-stopimmediatepropagation/</link><pubDate>Wed, 28 Mar 2012 09:14:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/03/jquery-different-form-stoppropagation-with-stopimmediatepropagation/</guid><description>&lt;p&gt;近期在幫公司導入 &lt;a href="http://documentcloud.github.com/backbone/" target="_blank"&gt;Backbone.js&lt;/a&gt; 技術，把後台全面改寫成 Javascript MVC 架構，技術包含 &lt;a href="http://jQuery.com" target="_blank"&gt;jQuery&lt;/a&gt; + Backbone.js + &lt;a href="http://documentcloud.github.com/underscore/" target="_blank"&gt;Underscore.js&lt;/a&gt; + &lt;a href="http://mustache.github.com/" target="_blank"&gt;Mustache Template&lt;/a&gt;，這些技術我想可以寫另外一篇 Backbone.js 初體驗，這邊就先不多說了，在 Backbone.js 的 View 架構裡，可以任意 bind events，程式碼如下:&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;RT.View = Backbone.View.extend({
&lt;pre&gt;&lt;code&gt;initialize: function() { 
 if (this.model) {
 this.model.bind(&amp;quot;change&amp;quot;, this.render, this);
 }
 if (this.collection) {
 this.collection.bind(&amp;quot;all&amp;quot;, this.render, this);
 }
},

events: { 
 'click .add': 'add',
 'click .edit': 'edit',
 'click .delete': 'delete_item',
 'click .delete_all': 'delete_all'
},
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;add: function(e) {&lt;/p&gt;
&lt;p&gt;},
)};&lt;/pre&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;上面程式碼可以看到，將 click 事件綁在不同 Class 上，但是問題來了，如果同時 new 兩個 RT.View 物件，當我觸發 click 事件時，就會發生兩次一樣的效果，該如何解決這問題呢，可以透過 jQuery 的 &lt;a href="http://api.jquery.com/event.stopPropagation/" target="_blank"&gt;stopPropagation&lt;/a&gt; 或 &lt;a href="http://api.jquery.com/event.stopImmediatePropagation/" target="_blank"&gt;stopImmediatePropagation&lt;/a&gt;，這兩個其實很好區分，&lt;span style="color:green"&gt;&lt;strong&gt;前者只會防止目前 Dom Tree 的上一層事件，後者則是會防止全部 Dom Tree 事件&lt;/strong&gt;&lt;/span&gt;。&lt;/p&gt;</description></item><item><title>Google App Engine 收費機制 Frontend Instance Hours</title><link>https://blog.wu-boy.com/2012/03/google-app-engine-frontend-instance-hours/</link><pubDate>Wed, 21 Mar 2012 06:51:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/03/google-app-engine-frontend-instance-hours/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i0.wp.com/farm7.staticflickr.com/6046/7002236833_acf8926eae_o.png?w=840&amp;#038;ssl=1" data-recalc-dims="1" /&gt;
&lt;/div&gt; 最近把一個簡易的 Web 丟到 
&lt;p&gt;&lt;a href="http://code.google.com/intl/zh-TW/appengine/" target="_blank"&gt;Google App Engine&lt;/a&gt; 測試，但是發現每天都會因為 Frontend Instance Hours 不夠用，而造成網站被關閉 (Quota 爆漿)，上網找一下解決方法，發現了這篇: &lt;a href="http://groups.google.com/group/taipei-gtug/browse_thread/thread/8d00a11c0b2f4fe?pli=1" target="_blank"&gt;Frontend Instance Hours 的問題&lt;/a&gt;，只要透過底下方式就可以暫時解決這問題，如果是網站流量很大的話，那可能要考慮開啟付費機制。&lt;/p&gt;
&lt;h3 id="解決方式-先進入"&gt;解決方式 先進入&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://appengine.google.com/" target="_blank"&gt;App engine 後台&lt;/a&gt;，點選您的 Application 之後可以看到左邊選單 &lt;strong&gt;&lt;span style="color:green"&gt;Application Settings&lt;/span&gt;&lt;/strong&gt;，進入後找到 &lt;strong&gt;&lt;span style="color:green"&gt;Max Idle Instances&lt;/span&gt;&lt;/strong&gt; 還有 &lt;strong&gt;&lt;span style="color:green"&gt;Min Pending Latency&lt;/span&gt;&lt;/strong&gt; 這兩項設定，我們必須將 Max Idle Instances 設定為**&lt;span style="color:red"&gt;1&lt;/span&gt;**，以及 Min Pending Latency 設定為 &lt;strong&gt;&lt;span style="color:red"&gt;15s&lt;/span&gt;&lt;/strong&gt;，但是 Max Idle Instances 預設是不給修改，而是跑 default value &amp;ldquo;Automatic&amp;rdquo;，這時候，我們必須把 &lt;strong&gt;&lt;span style="color:red"&gt;inbound_services&lt;/span&gt;&lt;/strong&gt; 設定為 warmup 才可以動態調整 &lt;strong&gt;&lt;span style="color:green"&gt;Max Idle Instances&lt;/span&gt;&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="設定-inbound_services-請打開網站根目錄底下的"&gt;設定 inbound_services 請打開網站根目錄底下的&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://code.google.com/intl/zh-TW/appengine/docs/python/config/appconfig.html" target="_blank"&gt;app.yaml&lt;/a&gt;，在上面加入&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;inbound_services:
- warmup&lt;/pre&gt; 之後將設定上傳後，回到剛剛 
&lt;p&gt;&lt;strong&gt;&lt;span style="color:green"&gt;Application Settings&lt;/span&gt;&lt;/strong&gt; 將兩個數值調整為上面描述的設定，這樣就可以不用被 &lt;a href="http://www.google.com" target="_blank"&gt;Google&lt;/a&gt; 收費了，想省錢的朋友們，可以儘快設定。&lt;/p&gt;</description></item><item><title>phpfog 免費提供升級 Silver 一個月</title><link>https://blog.wu-boy.com/2012/03/phpfog-get-29-account-credit-by-just-deploying-a-new-app/</link><pubDate>Sat, 10 Mar 2012 02:01:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/03/phpfog-get-29-account-credit-by-just-deploying-a-new-app/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i0.wp.com/phpfog.com/images/logo.png?w=840&amp;#038;ssl=1" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://phpfog.com" target="_blank"&gt;phpFog&lt;/a&gt; 最近放出一個消息 &lt;a href="http://blog.phpfog.com/2012/03/06/get-29-account-credit-by-just-deploying-a-new-app/" target="_blank"&gt;Get $29 account credit by just deploying a new App!&lt;/a&gt;，內文大意就是說，只要您註冊網站成功，並且新開 application，系統就會在帳戶增加 $29 美元，您隨時可以升級到 &lt;a href="https://phpfog.com/pricing" target="_blank"&gt;Silver Cloud&lt;/a&gt;，重點是免費的啦，如果大家想玩看看，就趕快去註冊吧，開放時間是 &lt;span style="color:red"&gt;&lt;strong&gt;8 AM PST on 6 March 2012 and runs until 8 AM PST on 9 March 2012.&lt;/strong&gt;&lt;/span&gt;，不確定時間是不是過了 XD，如果已經有帳號的，可以直接到 Live Chat 直接請他們把 Credit 加上去就好。 phpfog 搭配當紅 git 來當作下載及上傳程式碼，跟過去都是用 FTP 方式來運作有很大的不同，所以用此平台之前，請先學會基本 &lt;a href="http://blog.wu-boy.com/2012/02/how-to-use-git-version-control-for-new-beginner/" target="_blank"&gt;git version control&lt;/a&gt;，網站提供了很多 PHP Framework 或 Application，例如 &lt;a href="http://www.codeigniter.org.tw/" target="_blank"&gt;CodeIgniter&lt;/a&gt;、&lt;a href="http://cakephp.org/" target="_blank"&gt;CakePHP&lt;/a&gt;、&lt;a href="http://fuelphp.com/" target="_blank"&gt;FuelPHP&lt;/a&gt;、&lt;a href="http://laravel.com/" target="_blank"&gt;Laravel&lt;/a&gt;…等，不管選擇哪一個 Framework，都可以隨時修改，系統只是預設把 Source Code 抓下來放到 Application 裡面，所以可以任意刪除。&lt;/p&gt;</description></item><item><title>PHP 5.4.0 released!! 新功能</title><link>https://blog.wu-boy.com/2012/03/php-5-4-0-released/</link><pubDate>Sat, 03 Mar 2012 07:37:28 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/03/php-5-4-0-released/</guid><description>&lt;div style="margin: 0 auto;text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6034284842/" title="php-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm7.static.flickr.com/6186/6034284842_351ff33711_m.jpg?resize=240%2C127&amp;#038;ssl=1" alt="php-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://www.php.net" target="_blank"&gt;PHP 官方&lt;/a&gt;在台灣時間3月2號終於釋出 5.4 版本，我們可以參考官網的 &lt;a href="http://php.net/releases/5_4_0.php" target="_blank"&gt;release announcement&lt;/a&gt;，想要抓原始碼下來編譯可以參考此&lt;a href="http://php.net/downloads.php#v5.4.0" target="_blank"&gt;下載連結&lt;/a&gt;，這次 5.4 改版，有幾個最主要的新功能可以介紹給大家知道: &lt;a href="http://tw.php.net/language.oop5.traits.php" target="_blank"&gt;traits&lt;/a&gt;、&lt;a href="http://docs.php.net/manual/en/language.types.array.php" target="_blank"&gt;a shortened array syntax&lt;/a&gt;、&lt;a href="http://php.net/manual/en/features.commandline.webserver.php" target="_blank"&gt;a built-in webserver for testing purposes&lt;/a&gt;，底下來一一介紹。&lt;/p&gt;</description></item><item><title>如何善用 CodeIgniter Library 及擴充核心 extend core class</title><link>https://blog.wu-boy.com/2012/02/how-to-make-best-use-of-codeigniter-library-and-extend-core-class/</link><pubDate>Tue, 21 Feb 2012 05:00:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/02/how-to-make-best-use-of-codeigniter-library-and-extend-core-class/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 上禮拜介紹了 
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/2012/02/intrduction-to-codeigniter-model-view-controller/" target="_blank"&gt;CodeIgniter MVC 基礎介紹&lt;/a&gt;，這次來分享如何善用 &lt;a href="http://CodeIgniter.org.tw" target="_blank"&gt;CodeIgniter&lt;/a&gt; 內建的 Library，以及該如何擴充核心功能，投影片內容會比上禮拜深入些，不過不會很難，只要對於物件導向有一定的基礎，我相信都可以把整個 CodeIgniter 架構瞭解的很清楚。&lt;/p&gt;
&lt;div style="width:510px" id="__ss_11682413"&gt;
 &lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/appleboy/advanced-codeigniter" title="advanced introduction to codeigniter" target="_blank"&gt;advanced introduction to codeigniter&lt;/a&gt;&lt;/strong&gt;
&lt;/div&gt; 此投影片會介紹4個部份 
&lt;ul&gt;
&lt;li&gt;如何善用使用 CodeIgniter 內建函式庫&lt;/li&gt;
&lt;li&gt;移植及撰寫個人 Library&lt;/li&gt;
&lt;li&gt;擴充核心程式碼&lt;/li&gt;
&lt;li&gt;&lt;a href="http://getsparks.org/" target="_blank"&gt;GetSparks&lt;/a&gt; 簡介&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>CodeIgniter MVC 基礎介紹</title><link>https://blog.wu-boy.com/2012/02/intrduction-to-codeigniter-model-view-controller/</link><pubDate>Thu, 16 Feb 2012 04:10:46 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/02/intrduction-to-codeigniter-model-view-controller/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 
&lt;p&gt;上禮拜六講了一場 &lt;a href="http://www.codeigniter.org.tw" target="_blank"&gt;CodeIgniter&lt;/a&gt; 簡介，裡面很清楚交代一般新手入門所需要的基礎，以及什麼是 MVC(Model,View,Controller)，如何將原本的網站轉移到 CodeIgniter Framework。不多說了，大家可以參考投影片資料。投影片看完，也把作業寫好，恭喜你已經學會了CodeIgniter PHP Framework。&lt;/p&gt;
&lt;script async class="speakerdeck-embed" data-id="4f46fa342b2746001f00a52d" data-ratio="1.33507170795306" src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;
&lt;p&gt;閱讀時可以搭配 &lt;a href="http://codeigniter.org.tw/user_guide/" target="_blank"&gt;CodeIgniter 使用手冊版本 2.1.0&lt;/a&gt;&lt;/p&gt;</description></item><item><title>新人 Git 版本控制教學</title><link>https://blog.wu-boy.com/2012/02/how-to-use-git-version-control-for-new-beginner/</link><pubDate>Mon, 06 Feb 2012 03:34:52 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/02/how-to-use-git-version-control-for-new-beginner/</guid><description>&lt;p&gt;昨日去台北簡報如何快速學習 &lt;a href="http://git-scm.com/" target="_blank"&gt;git&lt;/a&gt;，投影片主要是給新手 git 基礎介紹，如何使用 branch model，git submodule 及 tag。內容不會很難，適合之前就玩過任何一套 version control 的使用者來閱讀，如果有 svn 基礎，學習會比較輕鬆。簡報搭配 &lt;a href="http://github.com" target="_blank"&gt;github&lt;/a&gt; 內容來教學。&lt;/p&gt;
&lt;p&gt;投影片內容參考 &lt;a href="http://progit.org/book/" target="_blank"&gt;Git Pro book&lt;/a&gt; 這網站教學，大家可以直接看原文說明，會更清楚 Git 使用。&lt;/p&gt;</description></item><item><title>Web Developer Tools in FireFox 10</title><link>https://blog.wu-boy.com/2012/02/web-developer-tools-in-firefox-10/</link><pubDate>Thu, 02 Feb 2012 03:44:26 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/02/web-developer-tools-in-firefox-10/</guid><description>&lt;p&gt;在美國時間 2012/01/31 &lt;a href="http://www.mozilla.org/" target="_blank"&gt;FireFox&lt;/a&gt; 發佈 10.0 版本，大家可以參考 &lt;a href="http://www.mozilla.org/en-US/firefox/10.0/releasenotes/" target="_blank"&gt;Release Note&lt;/a&gt;，其實對於網頁程式設計師最大的福音就是 Firefox 內建 Web Develop Tool，以後不必在安裝 &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/firebug/" target="_blank"&gt;FireBug Addon&lt;/a&gt;，就可以任意查詢網頁 Element 功能，大家可以參考底下 Mozilla 所製作的影片以及快速瀏覽 &lt;a href="https://developer.mozilla.org/en/Tools/Page_Inspector/Style_panel" target="_blank"&gt;CSS properties&lt;/a&gt;。 不多說了看完影片直接打開 FireFox，按下快捷鍵 &lt;strong&gt;&lt;span style="color:green"&gt;Ctrl+Shift+I&lt;/span&gt;&lt;/strong&gt; 就可以開始嘗試 Firfox 內建 Web Develop Tool。 Ref: &lt;a href="http://www.techrepublic.com/blog/australia/firefox-10-tooling-closes-in-on-firebug/642" target="_blank"&gt;Firefox 10 tooling closes in on Firebug&lt;/a&gt; &lt;a href="http://blog.mozilla.com/blog/2012/01/31/firefox-adds-powerful-new-developer-tools/" target="_blank"&gt;Firefox Adds Powerful New Developer Tools&lt;/a&gt;&lt;/p&gt;</description></item><item><title>用 Ubuntu 10.10 Live CD 重新安裝 GRUB 2 到 Bootloader</title><link>https://blog.wu-boy.com/2012/01/how-to-install-grub2-from-live-cd/</link><pubDate>Fri, 27 Jan 2012 07:41:37 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/01/how-to-install-grub2-from-live-cd/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6760100409/" title="logo-Ubuntu by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm8.staticflickr.com/7153/6760100409_b23d1ce67b_m.jpg?resize=240%2C165&amp;#038;ssl=1" alt="logo-Ubuntu" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;今天起床打開電腦，&lt;a href="http://www.ubuntu.com" target="_blank"&gt;Ubuntu&lt;/a&gt; 跳出 Warning 訊息，boot 磁區剩下 84MB，所以我手殘進去 /boot/ 目錄，把舊的 Kernel 清除，不小心砍掉 initrd.img-2.6.35-32-generic Linux Image 開機所需要的檔案，結果之後開機出現&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You need to load the kernel first
大家好像都是升級 Kernel 之後才會出現上述狀況，網路上找到的解答都不符合我的需求，所以我又往 &lt;a href="https://help.ubuntu.com/community/Grub2" target="_blank"&gt;GRUB2&lt;/a&gt; 開機 Boot 去瞭解，新的 GRUB 2 跟原先的 GRUB 的解法已經完全不同了，沒有 &lt;span style="color:red"&gt;&lt;strong&gt;/boot/grub/menu.list&lt;/strong&gt;&lt;/span&gt;，而被 &lt;span style="color:green"&gt;&lt;strong&gt;/boot/grub/grub.cfg&lt;/strong&gt;&lt;/span&gt; 取代，所以不應該在手動編輯此檔案。grub.cfg 會在有更新 Kernel 版本時，手動執行 update-grub 的時候被修改覆寫。這次發生的原因是在我把舊版 Kernel 刪除，而忘記執行 update-grub，這時候的最佳解法就是透過 Live CD 來救援。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[筆記] 在 Ubuntu mount DVD ISO 檔案</title><link>https://blog.wu-boy.com/2012/01/ubuntu-mount-dvd-iso-on-ubuntu/</link><pubDate>Wed, 25 Jan 2012 13:42:39 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/01/ubuntu-mount-dvd-iso-on-ubuntu/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6760100409/" title="logo-Ubuntu by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm8.staticflickr.com/7153/6760100409_b23d1ce67b_m.jpg?resize=240%2C165&amp;#038;ssl=1" alt="logo-Ubuntu" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 在網路上常常下載 
&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/ISO_image" target="_blank"&gt;ISO 檔案&lt;/a&gt;，&lt;a href="http://zh.wikipedia.org/zh-tw/Microsoft_Windows" target="_blank"&gt;Windows&lt;/a&gt; 底下可以透過虛擬光碟看到檔案內容，可是到了 &lt;a href="http://www.ubuntu.com/" target="_blank"&gt;Ubuntu&lt;/a&gt; 系統該如何知道 ISO 裡面放了哪些檔案呢？其實很簡單，可以透過 mount 指令就可以做到了喔，參考 Ubuntu 台灣論壇: &lt;a href="http://www.ubuntu-tw.org/modules/newbb/viewtopic.php?post_id=8406" target="_blank"&gt;如何mount iso檔? [論壇 - Ubuntu基本設定]&lt;/a&gt;&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ mount /iso/ubuntu.iso /home/appleboy/ISO/ -t iso9660 -o loop&lt;/pre&gt; 執行完上述指令，可以發現桌面會多出 DVD 光碟圖示，直接點選就可以了</description></item><item><title>Windows Titanium Mobile 入門安裝紀錄</title><link>https://blog.wu-boy.com/2012/01/windows-titanium-mobile-install-note/</link><pubDate>Fri, 06 Jan 2012 02:52:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2012/01/windows-titanium-mobile-install-note/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6644783075/" title="PROD_tit_mobile by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm8.staticflickr.com/7007/6644783075_453701f61a_m.jpg?resize=240%2C163&amp;#038;ssl=1" alt="PROD_tit_mobile" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 最近安裝 Windows 版本 
&lt;p&gt;&lt;a href="http://www.appcelerator.com/products/titanium-mobile-application-development/" target="_blank"&gt;Titanium Mobile SDK&lt;/a&gt; 遇到蠻多地雷，也不確定官方什麼時候會把這 Bug 解掉，安裝過程可以參考閃光大部落格 &lt;a href="http://tc.hinablue.me/945" target="_blank"&gt;[Titanium note.] Titanium Mobile, Windows + Android 入門安裝&lt;/a&gt;，其實最主要就是三個套件必須安裝:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" target="_blank"&gt;Java SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/sdk/index.html" target="_blank"&gt;Android SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.appcelerator.com/products/download/" target="_blank"&gt;Titanium Studio&lt;/a&gt; 請先註冊帳號 請務必註冊 Titanium Studio 新帳號，不然沒辦法下載安裝檔案以及登入使用 Titanium Studio，下載好三個檔案後，請務必注意底下事項，免的安裝好之後沒辦法在 Titanium Studio 測試模擬器。Java SDK 就直接下載安裝，這邊比較沒有問題。 1. Android SDK 請務必安裝在 C:/ 底下即可，不要安裝在 &amp;ldquo;C:/Program File&amp;rdquo; 2. 安裝完成務必增加 Path 路徑，ANDROID_SDK 跟 JAVA_HOME&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;ANDROID_SDK: C:\android-sdk
JAVA_HOME: C:\Program Files\Java\jdk1.6.0_30&lt;/pre&gt; 最後注意 Titanium Studio 的 mobilesdk 編譯模擬器的程式，因為執行編譯指令沒有加上 quote 符號，所以造成 SD Card 錯誤，所以請找檔案 
&lt;p&gt;&lt;span style="color:green"&gt;&lt;strong&gt;mobilesdk/win32/1.7.5/android/builder.py&lt;/strong&gt;&lt;/span&gt;，將 405 行處的程式碼換掉，原本是&lt;/p&gt;</description></item><item><title>Geany 編輯器搭配 sshfs 參數注意事項</title><link>https://blog.wu-boy.com/2011/12/linux-geany-sshfs-flag/</link><pubDate>Sat, 24 Dec 2011 08:17:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/12/linux-geany-sshfs-flag/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6562683991/" title="geany_vectorized_free by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm8.staticflickr.com/7155/6562683991_065975d0dd_m.jpg?resize=240%2C191&amp;#038;ssl=1" alt="geany_vectorized_free" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://www.geany.org/" target="_blank"&gt;Geany&lt;/a&gt; 是一套我覺得在 Linux 作業系統底下蠻簡易及輕量的程式編輯器，之前撰寫一篇 &lt;a href="http://blog.wu-boy.com/2011/07/linux-geany-fuse/" target="_blank"&gt;Linux 程式開發編輯器 Geany + Fuse 遠端掛載&lt;/a&gt; 簡易介紹如何使用 &lt;a href="http://fuse.sourceforge.net/" target="_blank"&gt;Fuse&lt;/a&gt;，這次發現一個小問題，就是掛載要儲存檔案時候出現底下錯誤訊息&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Error renaming temporary file: Operation not permitted. The file on disk may now be truncated! 此錯誤訊息發生在用 Fuse 掛載遠端系統所造成，原先掛載指令如下&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;sshfs appleboy@xxxx.com.tw:/home/appleboy /home/git/CN 
-p 22 -o reconnect,sshfs_sync -o uid=1000,gid=1000&lt;/pre&gt; 我們只需要另外加上 
&lt;p&gt;&lt;span style="color:green"&gt;&lt;strong&gt;workaround=rename&lt;/strong&gt;&lt;/span&gt; flag 及可以解決此問題&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;sshfs appleboy@www.cn.ee.ccu.edu.tw:/home/appleboy /home/git/CN 
-p 22 -o reconnect,sshfs_sync -o uid=1000,gid=1000 
-o workaround=rename&lt;/pre&gt; 測試環境為 Ubuntu 10.10.</description></item><item><title>PHP 多國語系製作 i18n library 筆記 (二)</title><link>https://blog.wu-boy.com/2011/12/php-i18n-library-2/</link><pubDate>Sat, 17 Dec 2011 12:53:11 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/12/php-i18n-library-2/</guid><description>&lt;div style="margin: 0 auto;text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6034284842/" title="php-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm7.static.flickr.com/6186/6034284842_351ff33711_m.jpg?resize=240%2C127&amp;#038;ssl=1" alt="php-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 繼續上篇講到 
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/2011/12/php-i18n-library/" target="_blank"&gt;PHP 多國語系製作 i18n library 筆記 (一)&lt;/a&gt;，相信大家使用上沒有任何問題， 但是一定會有共同疑問，那就是可不可以做到根據偵測瀏覽器來決定預設載入語系，也就是說 load method 只需要帶入第一個參數即可。&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;$lang = new Language();
$lang-&gt;load("about");
echo $lang-&gt;line("index") . "\n";&lt;/pre&gt;</description></item><item><title>PHP 多國語系製作 i18n library 筆記 (一)</title><link>https://blog.wu-boy.com/2011/12/php-i18n-library/</link><pubDate>Fri, 16 Dec 2011 15:00:27 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/12/php-i18n-library/</guid><description>&lt;div style="margin: 0 auto;text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6034284842/" title="php-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm7.static.flickr.com/6186/6034284842_351ff33711_m.jpg?resize=240%2C127&amp;#038;ssl=1" alt="php-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 多國語系是目前網站必有的模組，至少都會支援繁體中文及英文，那大家都怎麼設計多國語系的架構呢，底下來一步一步來介紹。 
&lt;h3 id="多國語系目錄架構"&gt;多國語系目錄架構&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;language/
---&gt; englisg/
---------&gt; about.php
---&gt; zh-tw/
---------&gt; about.php
---&gt; zh-cn/
---------&gt; about.php
&lt;/pre&gt; 這是大部分的專案設計模式，也最容易清楚了解，接著我們就寫一個簡單的 Language Class 來動態讀取各國語系。</description></item><item><title>PHPConf Taiwan 2011 快速上手 CodeIgniter Framework</title><link>https://blog.wu-boy.com/2011/12/phpconf-taiwan-2011-codeigniter-framework/</link><pubDate>Mon, 05 Dec 2011 04:16:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/12/phpconf-taiwan-2011-codeigniter-framework/</guid><description>&lt;p&gt;&lt;a href="http://phpconf.tw/2011" target="_blank"&gt;2011 年 PHP Conference&lt;/a&gt; 所講的快速上手 CodeIgniter Framework 影片檔出來了，大致上講了 38 分鐘，時間上面控制的不是很好，請大家見諒了。底下是這次的影片:&lt;/p&gt;
&lt;h2 id="投影片"&gt;投影片&lt;/h2&gt;
&lt;script async class="speakerdeck-embed" data-id="4ebfba4ddfe0d500510048dc" data-ratio="1.33333333333333" src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;</description></item><item><title>Node.js Version Management 多版本管理</title><link>https://blog.wu-boy.com/2011/11/node-version-management/</link><pubDate>Tue, 29 Nov 2011 05:37:19 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/11/node-version-management/</guid><description>&lt;div style="margin: 0 auto;text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6033708087/" title="nodejs-light by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm7.static.flickr.com/6199/6033708087_ff1a02a337_o.jpg?resize=260%2C71&amp;#038;ssl=1" alt="nodejs-light" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 相信大家對於 
&lt;p&gt;&lt;a href="http://nodejs.org" target="_blank"&gt;Node.js&lt;/a&gt; 版本 Release 太快而感到困擾，每次新版出來，就要開始升級原本的版本，加上測試及修改，一定會浪費不少時間在上面，不管是任何語言我都希望能有一套 Version Management 來管理各版本之間的差異，以及讓使用者可以隨時切換版本來使用測試。那今天來介紹一套 &lt;a href="https://github.com/visionmedia/n" target="_blank"&gt;Node.js Version Management&lt;/a&gt;，這隻程式是用 shell script 下去撰寫，可以安裝多版本在 Linux 本機上面，隨時都可以切換不同版本測試。此作者也是 &lt;a href="http://expressjs" target="_blank"&gt;expressjs Framework&lt;/a&gt; 發起者。&lt;/p&gt;</description></item><item><title>為什麼要選擇 CodeIgniter PHP Framework？</title><link>https://blog.wu-boy.com/2011/11/why-choose-codeigniter-php-framework/</link><pubDate>Mon, 21 Nov 2011 07:38:50 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/11/why-choose-codeigniter-php-framework/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 大家一定會有疑問，在眾多 PHP Framework 選擇下，我為什麼要推廣 
&lt;p&gt;&lt;a href="http://codeigniter.org.tw" target="_blank"&gt;CodeIgniter&lt;/a&gt; 這套呢？寫這篇的原因就是我在&lt;a href="http://phpwrite.blogspot.com/" target="_blank"&gt;腦殘 PHP 部落格&lt;/a&gt;看到了這篇：&lt;a href="http://phpwrite.blogspot.com/2011/11/codeigniter.html"&gt;Codeigniter是萬靈丹？&lt;/a&gt;，底下針對此作者寫的內容做一些回應&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在最近幾次去面試的過程 或是和朋友聊天聊到framework 都發現了一個問題 許多完完全全不懂framework的人一直在談論它的好 也發現了有很多基本PHP程式設計基礎都不好的人都在用它 連台灣在推廣它的人都把它尊奉為神&amp;hellip;. 看完上面的內容，我實在很想知道，有哪些推廣 CI 的人，把 CI 尊奉為神？如果有的話，可以介紹認識認識。不知道此部落格作者有沒有深入想過，為什麼這些人會覺得 CI 非常好用和 CI 的好處在哪裡？至少在我聽到的大部都是覺得 &lt;strong&gt;&lt;span style="color:green"&gt;容易上手及架構清楚&lt;/span&gt;&lt;/strong&gt;，光是這樣就足以讓一些基礎的人可以快速上手這套 Framework。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>新版 CodeIgniter Nexmo Message API Library Release</title><link>https://blog.wu-boy.com/2011/11/codeigniter-nexmo-message-api-library-release/</link><pubDate>Sat, 19 Nov 2011 07:42:53 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/11/codeigniter-nexmo-message-api-library-release/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 繼上次釋出第1版 
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/2011/11/codeigniter-nexmo-mobile-messaging/" target="_blank"&gt;CodeIgniter 透過 Nexmo 傳送簡訊 Mobile Messaging&lt;/a&gt; 之後，該版本只有支援簡訊傳送功能，如果大家想測試，可以上 &lt;a href="http://nexmo.com/" target="_blank"&gt;Nexmo&lt;/a&gt; 官網&lt;a href="http://dashboard.nexmo.com/register" target="_blank"&gt;申請帳號&lt;/a&gt;，就可以使用了，不過在官網 Documentation 裡面有新增了 Developer API 部份，這次改版就一次把全部加入到 Library 裡面。&lt;/p&gt;</description></item><item><title>CodeIgniter 2.1.0 has been released</title><link>https://blog.wu-boy.com/2011/11/codeigniter-2-1-0-has-been-released/</link><pubDate>Wed, 16 Nov 2011 03:12:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/11/codeigniter-2-1-0-has-been-released/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 2011/11/16 台灣官方公告訊息:『
&lt;p&gt;&lt;a href="http://www.codeigniter.org.tw/blog/codeigniter_2.1.0_released" target="_blank"&gt;CodeIgniter 2.1.0 Release&lt;/a&gt;』 在上禮拜參加了 &lt;a href="http://phpconf.tw/2011" target="_blank"&gt;2011 PHP Conference&lt;/a&gt;，並且介紹了 &lt;a href="http://CodeIgniter.org.tw" target="_blank"&gt;CodeIgniter&lt;/a&gt; 目前官方動態、安裝及使用方式，結果就在過沒幾天就釋出 2.1.0 版本了，在這次的版本修正了許多 Bug 以及增加了一些功能，底下就來看看 CodeIgniter 2.1.0 修正及改變了哪些。&lt;/p&gt;</description></item><item><title>2011 Taiwan php conference – CodeIgniter Framework</title><link>https://blog.wu-boy.com/2011/11/2011-taiwan-php-conference-codeigniter-framework/</link><pubDate>Sat, 12 Nov 2011 06:12:38 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/11/2011-taiwan-php-conference-codeigniter-framework/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6336662336/" title="phpconf by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm7.static.flickr.com/6034/6336662336_de8e5ef1fd_o.jpg?resize=237%2C80&amp;#038;ssl=1" alt="phpconf" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 今年第1屆舉辦 
&lt;p&gt;&lt;a href="http://phpconf.tw/2011" target="_blank"&gt;2011 PHP Conference&lt;/a&gt;，終於有機會去台北推廣 &lt;a href="http://codeigniter.org.tw/" target="_blank"&gt;CodeIgniter&lt;/a&gt;，底下是我這一次的簡報，歡迎大家參考&lt;/p&gt;
&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;div style="width:500px" id="__ss_10127437"&gt;
 &lt;strong style="display:block;margin:12px auto 4px"&gt;&lt;a href="http://www.slideshare.net/appleboy/phpconf-2011-introductiontocodeigniter" title="Phpconf 2011 introduction_to_codeigniter" target="_blank"&gt;Phpconf 2011 introduction_to_codeigniter&lt;/a&gt;&lt;/strong&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div style=&amp;quot;padding:5px 0 12px&amp;quot;&amp;gt;
 View more &amp;lt;a href=&amp;quot;http://www.slideshare.net/&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;presentations&amp;lt;/a&amp;gt; from &amp;lt;a href=&amp;quot;http://www.slideshare.net/appleboy&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;Wu Bo-Yi&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Sass language 和 Compass 教學投影片</title><link>https://blog.wu-boy.com/2011/11/the-future-of-stylesheets-sass-compass/</link><pubDate>Fri, 11 Nov 2011 03:53:29 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/11/the-future-of-stylesheets-sass-compass/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6213260474/" title="Compass Home Compass Documentation by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm7.static.flickr.com/6217/6213260474_e0e51eeefe_o.png?resize=486%2C110&amp;#038;ssl=1" alt="Compass Home Compass Documentation" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 在 
&lt;p&gt;&lt;a href="http://speakerdeck.com/" target="_blank"&gt;Speakerdeck&lt;/a&gt; 發現一篇不錯的 &lt;a href="http://sass-lang.com/" target="_blank"&gt;Sass&lt;/a&gt; 和 &lt;a href="http://compass-style.org/" target="_blank"&gt;Compass&lt;/a&gt; 投影片教學 &lt;a href="http://speakerdeck.com/u/imathis/p/sass-compass-the-future-of-stylesheets-now" target="_blank"&gt;Sass &amp;amp; Compass: The future of stylesheets now.&lt;/a&gt;，此教學把 Sass Language 以及 Compass 基礎撰寫方式及進階用法都介紹完畢了，非常實用，推薦給剛入門的網頁設計師，這樣一來可以減少開發時間，二來可以解決討厭的跨瀏覽器問題。&lt;/p&gt;</description></item><item><title>CodeIgniter 透過 Nexmo 傳送簡訊 Mobile Messaging</title><link>https://blog.wu-boy.com/2011/11/codeigniter-nexmo-mobile-messaging/</link><pubDate>Mon, 07 Nov 2011 13:17:48 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/11/codeigniter-nexmo-mobile-messaging/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 在 gslin 大神看到這篇
&lt;p&gt;&lt;a href="http://blog.gslin.org/archives/2011/11/06/2771/%E7%94%A8-nexmo-%E9%80%81%E7%B0%A1%E8%A8%8A/"&gt;用 Nexmo 送簡訊&lt;/a&gt;，自己也來測試看看，先到 &lt;a href="http://nexmo.com"&gt;Nexmo&lt;/a&gt; 註冊好會員，馬上就會有 EUR$2 可以使用，&lt;a href="http://nexmo.com/pricing/index.html"&gt;傳送一封簡訊價錢&lt;/a&gt;是 EUR$0.011，大概是台幣 0.45 元，目前支援&lt;a href="http://www.cht.com.tw/"&gt;中華電信&lt;/a&gt;、&lt;a href="http://www.taiwanmobile.com/"&gt;台灣大哥大&lt;/a&gt;、&lt;a href="http://www.fetnet.net/"&gt;遠傳&lt;/a&gt;、&lt;a href="http://www.vibo.com.tw"&gt;威寶電信&lt;/a&gt;，官方有提供一些 API Library，自己寫了一套 for &lt;a href="http://www.CodeIgniter.org.tw" target="_blank"&gt;CodeIgniter&lt;/a&gt; 支援 JSON 及 XML 兩種格式，並且在 &lt;a href="http://getsparks.org/" target="_blank"&gt;getsparks&lt;/a&gt; 放上&lt;a href="http://getsparks.org/packages/Nexmo-SMS-Message/versions/HEAD/show"&gt;一份&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id="透過-getparks-安裝-直接參考網站安裝"&gt;透過 getparks 安裝 直接參考網站安裝:&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://getsparks.org/packages/Nexmo-SMS-Message/versions/HEAD/show" target="_blank"&gt;Get the Latest&lt;/a&gt;&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;php tools/spark install -v1.0.0 Nexmo-SMS-Message&lt;/pre&gt; 讀取 spark library: 
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;// Load the spark
$this-&gt;load-&gt;spark('Nexmo-SMS-Message/1.0.0');
// Load the library
$this-&gt;load-&gt;library('nexmo');&lt;/pre&gt;
&lt;h3 id="透過-git-安裝-直接看"&gt;透過 git 安裝 直接看&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/appleboy/CodeIgniter-Nexmo-Message" target="_blank"&gt;CodeIgniter-Nexmo-Message&lt;/a&gt; README 安裝方法。&lt;/p&gt;</description></item><item><title>Front End Engineer 前端設計師必備工具 Live.js</title><link>https://blog.wu-boy.com/2011/11/front-end-engineer-love-livejs/</link><pubDate>Fri, 04 Nov 2011 03:46:41 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/11/front-end-engineer-love-livejs/</guid><description>&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;a title="Livejs by appleboy46, on Flickr" href="https://www.flickr.com/photos/appleboy/6311229214/"&gt;&lt;img src="https://i0.wp.com/farm7.static.flickr.com/6058/6311229214_14677a9114.jpg?resize=304%2C105&amp;#038;ssl=1" alt="Livejs" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 在不久之前介紹一篇: 
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/2011/10/how-to-install-livereload/" target="_blank"&gt;LiveReload 網頁程式設計師必備工具&lt;/a&gt;，該篇適合用在寫後端+前端的開發者，對於剛開始摸網頁的初學者可能不是很容易就上手，加上在 Windows 或 Linux 上面需要一點安裝步驟。不久之前在 &lt;a href="http://www.codeigniter.org.tw/irc" target="_blank"&gt;IRC 頻道 #codeigniter.tw&lt;/a&gt; 有網友熱心提供一套好用工具 &lt;a href="http://livejs.com/" target="_blank"&gt;Live.js&lt;/a&gt;，這一套幫助您開發前端設計的部份，也就是 Javascript Html 跟 CSS，一樣讓您不用在切換視窗 Alt+TAB，只要您任何時間修改了 HTML + CSS + Javascript，視窗就會自動重新 reload，底下整理該工具特性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;只有支援 Html JavaScript CSS 三種格式&lt;/li&gt;
&lt;li&gt;只有支援網站 Local 檔案，也就是必須是同網域&lt;/li&gt;
&lt;li&gt;並不支援 File:// 協定，換句話說必須有 Web Server (&lt;a href="http://www.apache.org/" target="_blank"&gt;Apache&lt;/a&gt; or &lt;a href="http://www.lighttpd.net/" target="_blank"&gt;Lighttpd&lt;/a&gt; or &lt;a href="http://wiki.nginx.org/" target="_blank"&gt;Nginx&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>HTML5 placeholder attribute 在 IE 上顯示</title><link>https://blog.wu-boy.com/2011/11/html5-placeholder-attribute-on-ie/</link><pubDate>Tue, 01 Nov 2011 07:38:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/11/html5-placeholder-attribute-on-ie/</guid><description>&lt;p&gt;程式設計師在網頁表單上通常會設計很多提示的功能，而在 &lt;a href="http://dev.w3.org/html5/spec/Overview.html" target="_blank"&gt;Html5&lt;/a&gt; 提供了 &lt;a href="http://dev.w3.org/html5/spec/Overview.html#the-placeholder-attribute" target="_blank"&gt;placeholder attribute&lt;/a&gt; 這功能，目前 &lt;a href="http://moztw.org/" target="_blank"&gt;FireFox&lt;/a&gt; &lt;a href="http://www.apple.com/tw/safari/download/" target="_blank"&gt;Safari&lt;/a&gt; &lt;a href="http://www.google.com/chrome?hl=zh-TW" target="_blank"&gt;Google Chrome&lt;/a&gt; 都沒有顯示上的問題，唯獨 IE8(含以下)都沒辦法顯示這功能，所以必須透過 javascript 來解決這部份問題了，網路上找到這篇&lt;a href="https://gist.github.com/1105055" target="_blank"&gt;解決方式&lt;/a&gt;，底下是原始碼&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;&lt;!--[if IE]&gt;

&lt;![endif]--&gt;&lt;/pre&gt; 解決原理其實很簡單，那就先將 placeholder 寫入到 input value 裡面，在 focus event 當下比對 input value 是否等於 placeholder 的值，如果是就清空，反之透過 onblur event 來寫回原先的 placeholder 值，缺點就是如果當 input type = password 的時候會很麻煩。底下提供轉成 
&lt;p&gt;&lt;a href="http://jashkenas.github.com/coffee-script/" title="CoffeeScript is a little language that compiles into JavaScript. " target="_blank"&gt;CoffeeScript&lt;/a&gt; 的程式碼：&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;add_placeholder = (id, placeholder) -&gt;
 el = document.getElementById(id)
 el.placeholder = placeholder

 el.onfocus = () -&gt;
 if(this.value == this.placeholder)
 this.value = ''
 el.style.cssText = ''

 el.onblur = () -&gt;
 if(this.value.length == 0)
 this.value = this.placeholder
 el.style.cssText = 'color:#A9A9A9;'

 el.onblur()

# Login Form
add_placeholder('myInputField', 'IE Placeholder Text')&lt;/pre&gt; 如果有用 jQuery 的話，可以把第二個參數改寫成 
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;$("#input_id").attr("placeholder")&lt;/pre&gt;</description></item><item><title>LiveReload 網頁程式設計師必備工具</title><link>https://blog.wu-boy.com/2011/10/how-to-install-livereload/</link><pubDate>Thu, 27 Oct 2011 09:55:48 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/10/how-to-install-livereload/</guid><description>&lt;p&gt;如果讀者目前從事的工作跟 Web Develop 相關，相信每天在按 Ctrl + R 的次數至少在上百次吧，也許花在這上面的時間會真的很煩，有沒有想過如果每次修改 html php css s[ca]ss js 檔案後，網頁會自動幫忙 reload 呢，這樣就可以另外買個螢幕把網頁拉過去，修改好檔案，螢幕就會幫忙重新整理，大家省下這些時間就可以專心寫 Code 了啦，解決此問題非常容易，那就是裝上 &lt;a href="https://github.com/mockko/livereload" target="_blank"&gt;livereload&lt;/a&gt; 這套 &lt;a href="http://rubygems.org/" target="_blank"&gt;rubygem&lt;/a&gt; 程式，底下先看看 livereload 影片:&lt;/p&gt;</description></item><item><title>Github 支援 SVN Client</title><link>https://blog.wu-boy.com/2011/10/github-improved-subversion-client-support/</link><pubDate>Sun, 23 Oct 2011 05:43:00 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/10/github-improved-subversion-client-support/</guid><description>&lt;p&gt;&lt;a href="https://github.com/" target="_blank"&gt;Github&lt;/a&gt; 一年前宣佈開始&lt;a href="https://github.com/blog/626-announcing-svn-support" target="_blank"&gt;支援 SVN Client&lt;/a&gt;，不過這是必須透過 &lt;span style="color: red;"&gt;&lt;a href="https://svn.github.com"&gt;https://svn.github.com&lt;/a&gt;&lt;/span&gt; 才可以取得資料，跟一般 git 的網址不一樣，然而就在最近宣佈了&lt;a href="https://github.com/blog/966-improved-subversion-client-support" target="_blank"&gt;同步支援 svn&lt;/a&gt; 也可以存取 &lt;span style="color: green;"&gt;&lt;strong&gt;&lt;a href="https://github.com/"&gt;https://github.com/&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;，並且過不久的將來會移除 &lt;del datetime="2011-10-23T05:26:31+00:00"&gt;&lt;a href="https://svn.github.com/"&gt;https://svn.github.com/&lt;/a&gt;&lt;/del&gt; 網域。&lt;/p&gt;
&lt;h3 id="url-處理-git-方式"&gt;URL 處理 git 方式:&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ git clone https://github.com/appleboy/PHP-CodeIgniter-Framework-Taiwan git-ds
Cloning into git-ds...
remote: Counting objects: 4177, done.
remote: Compressing objects: 100% (665/665), done.
remote: Total 4177 (delta 3544), reused 4140 (delta 3509)
Receiving objects: 100% (4177/4177), 2.65 MiB | 239 KiB/s, done.
Resolving deltas: 100% (3544/3544), done.&lt;/pre&gt; svn 方式: 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ svn checkout https://github.com/appleboy/PHP-CodeIgniter-Framework-Taiwan svn-ds
A svn-ds/branches
A svn-ds/branches/develop
A svn-ds/branches/develop/README
A svn-ds/branches/develop/changelog.html
A svn-ds/branches/develop/index.html
A svn-ds/branches/develop/license.html
.......&lt;/pre&gt; 官網還陸續介紹了 svn 如何在 github 上面的使用，如果對 svn 熟悉的朋友們我想也不陌生了，還沒熟悉 git 之前，我想可以先用 svn 玩 github 功能。底下是 github 打算將來支援的 svn 功能 
&lt;ul&gt;
&lt;li&gt;支援 branch merging 和 rebasing&lt;/li&gt;
&lt;li&gt;better mapping of Subversion &amp;lt;=&amp;gt; GitHub user names in commits&lt;/li&gt;
&lt;li&gt;支援 annotate/blame&lt;/li&gt;
&lt;li&gt;讓 trunk 可以對應到 git branch 除了 master 之外 參考:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://github.com/blog/966-improved-subversion-client-support" target="_blank"&gt;Improved Subversion Client Support&lt;/a&gt;&lt;/p&gt;</description></item><item><title>轉移 Github 上的 Private Repository 到 BitBucket …</title><link>https://blog.wu-boy.com/2011/10/transfer-github-private-repository-to-bitbucket/</link><pubDate>Mon, 17 Oct 2011 06:45:49 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/10/transfer-github-private-repository-to-bitbucket/</guid><description>&lt;div style="margin:auto 0; text-align: center;"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6209323485/" title="Bitbucket by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm7.static.flickr.com/6161/6209323485_9ffbcb2911_o.png?resize=256%2C256&amp;#038;ssl=1" alt="Bitbucket" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 看到 
&lt;p&gt;&lt;a href="http://blog.gslin.org/" target="_blank"&gt;gslin 大神&lt;/a&gt;寫了一篇 &lt;a href="http://blog.gslin.org/archives/2011/10/10/2750/%e6%8a%8a-github-%e4%b8%8a%e7%9a%84-private-repository-%e6%90%ac%e5%88%b0-bitbucket-%e4%b8%8a/" target="_blank"&gt;把 GitHub 上的 private repository 搬到 BitBucket 上…&lt;/a&gt;，最近自己也把一些不能公開的專案轉到 &lt;a href="https://bitbucket.org/" target="_blank"&gt;BitBucket&lt;/a&gt; 上面，由於在 BitBucket 上面可以無限開 private repository，所以我想也沒有必要付費給 &lt;a href="https://github.com/" target="_blank"&gt;Github&lt;/a&gt;，雖然論 Web 功能上而言，Github 還是略勝一籌，個人還是比較習慣 github 有 Network 的圖形可以看，不過平常還是都是在打指令，所以也沒差了，在 push 速度上面，感覺 BitBucket 也沒有輸 github 許多，所以決定就轉過去了，人總是為了錢所考量，當然 BitBucket 還是有些缺點的，可以參考之前寫的 &lt;a href="http://blog.wu-boy.com/2011/10/bitbucket-support-git-repository-now/" target="_blank"&gt;Bitbucket 開始支援 Git Repository&lt;/a&gt;&lt;/p&gt;</description></item><item><title>輕量級 A Clean &amp; Classy PHP Framework Laravel 簡介安裝</title><link>https://blog.wu-boy.com/2011/10/install-a-clean-classy-php-framework-laravel/</link><pubDate>Sun, 16 Oct 2011 04:40:28 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/10/install-a-clean-classy-php-framework-laravel/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6248708214/" title="Laravel PHP Framework by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm7.static.flickr.com/6038/6248708214_ef1133d0e9_o.png?resize=283%2C101&amp;#038;ssl=1" alt="Laravel PHP Framework" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 今日作者來介紹一套輕量級 PHP Framework: 
&lt;p&gt;&lt;a href="http://laravel.com/" target="_blank"&gt;Laravel&lt;/a&gt;，目前還尚未發現台灣有任何人使用這套，然而 PHP Framework 實在太多種了，要把每一套都弄熟實在很不容易，如果作者有玩過一定會上來寫些教學文件，Laravel 是基於 &lt;strong&gt;&lt;span style="color:green"&gt;PHP 5.3&lt;/span&gt;&lt;/strong&gt; 環境的 PHP Framwork，裡面已經都是用物件及 5.3 的 &lt;a href="http://php.net/manual/en/language.namespaces.php" target="_blank"&gt;Namespace&lt;/a&gt; 下去開發，如果您想研究 Laravel PHP Framework 可以 &lt;a href="http://twitter.com/laravelphp" target="_blank"&gt;Follow Laravel Twitter&lt;/a&gt;，更重要的是追蹤 &lt;a href="http://github.com/laravel" target="_blank"&gt;Github Source Code&lt;/a&gt;。也許可以看一下 &lt;a href="http://laravel.com/roadmap" target="_blank"&gt;2.0 的 Roadmap&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>在 CentOS 上面安裝 Ruby 環境</title><link>https://blog.wu-boy.com/2011/10/install-ruby-rubygems-compass-on-centos/</link><pubDate>Thu, 13 Oct 2011 08:20:11 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/10/install-ruby-rubygems-compass-on-centos/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6239698353/" title="centos by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm7.static.flickr.com/6176/6239698353_3e6c99f692_o.png?resize=293%2C79&amp;#038;ssl=1" alt="centos" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 目前開發網站都傾向於用 
&lt;p&gt;&lt;a href="http://compass-style.org" target="_blank"&gt;Compass&lt;/a&gt; 這套 CSS Framework 來 develop，開發之前必須把環境先弄好，就是要有 &lt;a href="http://www.ruby-lang.org/" target="_blank"&gt;Ruby&lt;/a&gt; 套件才可以安裝 Compass，網路上的教學幾乎都在是 Ubuntu 底下用 apt-get 方式來安裝，其實相當方便，但是 &lt;a href="http://fedoraproject.org/" target="_blank"&gt;Fedora&lt;/a&gt; 或 &lt;a href="http://www.centos.org/" target="_blank"&gt;CentOS&lt;/a&gt; 就是要用 yum 方式來安裝，這次碰到 CentOS 竟然 yum search git 出來的結果是空的，所以決定全部都透過 tar 的方式來安裝全部套件了。由於 Fedora 幾乎都可以找到套件，但是碰到 &lt;a href="http://rubygems.org/" target="_blank"&gt;rubygems&lt;/a&gt; 需要用到 ruby 1.8.7 以上版本，所以還是乖乖的用 tar 方式吧。 大家可以試試看透過底下 yum 方式安裝:&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;yum install -y ruby ruby-devel rubygems&lt;/pre&gt; 雖然 Fedora 透過上面可以安裝成功，可是 ruby 跟 rubygems 的版本根本是...太舊了吧 ...</description></item><item><title>AWS 機器上 duplicated RPM 問題</title><link>https://blog.wu-boy.com/2011/10/how-to-remove-duplicated-rpm-package/</link><pubDate>Fri, 07 Oct 2011 05:28:45 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/10/how-to-remove-duplicated-rpm-package/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6219253012/" title="AWS-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm7.static.flickr.com/6174/6219253012_f5f9a7ed0c.jpg?resize=270%2C110&amp;#038;ssl=1" alt="AWS-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 昨天幫忙升級全部 
&lt;p&gt;&lt;a href="http://aws.amazon.com/" target="_blank"&gt;AWS&lt;/a&gt; RPM 套件，升級過程本來很順利，不過不知道哪一個 RPM 造成 SSH 全面斷線，接著我直接到 &lt;a href="http://aws.amazon.com/console/" target="_blank"&gt;AWS Management Console&lt;/a&gt; 把機器 restart，登入系統之後下 yum update，直接給我噴出底下錯誤訊息&lt;/p&gt;
&lt;pre class="brush: plain; title: ; notranslate" title=""&gt;---&gt; Package zlib.i686 0:1.2.3-24.7.amzn1 will be updated
---&gt; Package zlib.i686 0:1.2.3-25.8.amzn1 will be an update
--&gt; Finished Dependency Resolution
 You could try using --skip-broken to work around the problem
** Found 155 pre-existing rpmdb problem(s), 'yum check' output follows:
audit-libs-2.1-5.15.amzn1.x86_64 is a duplicate with audit-libs-2.0.4-1.14.amzn1.x86_64
authconfig-6.1.12-5.14.amzn1.x86_64 is a duplicate with authconfig-6.1.4-6.13.amzn1.x86_64
basesystem-10.0-4.9.amzn1.noarch is a duplicate with basesystem-10.0-4.8.amzn1.noarch
bash-4.1.2-8.14.amzn1.x86_64 is a duplicate with bash-4.1.2-3.13.amzn1.x86_64
binutils-2.20.51.0.2-5.20.17.amzn1.x86_64 is a duplicate with binutils-2.20.51.0.2-5.12.15.amzn1.x86_64
cloud-init-0.5.15-16.amzn1.noarch is a duplicate with cloud-init-0.5.15-8.amzn1.noarch
coreutils-8.4-13.13.amzn1.x86_64 is a duplicate with coreutils-8.4-9.12.amzn1.x86_64
coreutils-libs-8.4-13.13.amzn1.x86_64 is a duplicate with coreutils-libs-8.4-9.12.amzn1.x86_64
cpp-4.4.5-6.35.amzn1.x86_64 is a duplicate with cpp-4.4.4-13.33.amzn1.x86_64
&lt;/pre&gt;</description></item><item><title>在 Windows 底下安裝 Compass CSS Authoring Framework</title><link>https://blog.wu-boy.com/2011/10/install-compass-css-authoring-framework-on-windows/</link><pubDate>Wed, 05 Oct 2011 04:10:14 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/10/install-compass-css-authoring-framework-on-windows/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6213260474/" title="Compass Home Compass Documentation by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm7.static.flickr.com/6217/6213260474_e0e51eeefe_o.png?resize=486%2C110&amp;#038;ssl=1" alt="Compass Home Compass Documentation" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://compass-style.org/" target="_blank"&gt;Compass&lt;/a&gt; 是一套 base on &lt;a href="http://sass-lang.com/" target="_blank"&gt;Sass Language&lt;/a&gt; 的一套 CSS Framework，它提供了豐富的 CSS3 原件，讓您可以加速開發 CSS，也繼承 Sass Language 的開發方式，支援 variables, mixins, selector inheritance…等，今天就來介紹如何在 Windows 底下快速安裝開發環境。如果想更瞭解 Sass 可以參考之前的文章: &lt;a href="http://blog.wu-boy.com/2011/05/%E5%8A%A0%E9%80%9F%E9%96%8B%E7%99%BC-css-%E5%B7%A5%E5%85%B7-sass/"&gt;加速開發 CSS 工具: Sass&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id="安裝步驟-install-compass-在安裝-compass-之前您必須要先安裝"&gt;安裝步驟 (Install Compass) 在安裝 Compass 之前，您必須要先安裝&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.ruby-lang.org/zh_TW/"&gt;Ruby&lt;/a&gt; 開發環境，在 Ubuntu 或 Debian 底下可以透過 apt 的方式安裝:&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ sudo apt-get install ruby1.9.1-full&lt;/pre&gt; 如果你想裝 ruby 1.8 可以透過底下: 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ sudo apt-get install ruby-full&lt;/pre&gt;</description></item><item><title>Bitbucket 開始支援 Git Repository</title><link>https://blog.wu-boy.com/2011/10/bitbucket-support-git-repository-now/</link><pubDate>Tue, 04 Oct 2011 02:30:16 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/10/bitbucket-support-git-repository-now/</guid><description>&lt;div style="margin:auto 0; text-align: center;"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6209323485/" title="Bitbucket by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm7.static.flickr.com/6161/6209323485_9ffbcb2911_o.png?resize=256%2C256&amp;#038;ssl=1" alt="Bitbucket" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 很高興剛剛收到 
&lt;p&gt;&lt;a href="https://bitbucket.org/" target="_blank"&gt;Bitbucket&lt;/a&gt; 寄來一封&lt;a href="http://blog.bitbucket.org/2011/10/03/bitbucket-now-rocks-git/" target="_blank"&gt;會員信&lt;/a&gt;，標題非常吸引大家的注意，那就是 &lt;strong&gt;&lt;span style="color:green"&gt;Bitbucket now rocks Git.&lt;/span&gt;&lt;/strong&gt;，是的，你沒看錯，Bitbucket 現在開始支援 Git repository，不再只有 Mercurial 可以使用，這還不算什麼，Bitbucket 更是推出**&lt;span style="color:red"&gt;無限制免費 private repos for free &lt;/span&gt;**，這樣的推出，不知道會有多少 &lt;a href="https://github.com/" target="_blank"&gt;Github&lt;/a&gt; 用戶轉移到 Bitbucket 上面，還有另一項主因就是 &lt;strong&gt;&lt;span style="color:red"&gt;Unlimited disk space 無限制硬碟容量&lt;/span&gt;&lt;/strong&gt;，不過也許不用高興的太早，Bitbucket 在使用者人數上面有些限制，可以參考 &lt;a href="https://bitbucket.org/plans" target="_blank"&gt;Plans &amp;amp; Pricing&lt;/a&gt;，免費方案每個 Repository 只能有5個 User，反觀 Github 並沒有這限制，不過我想這也不是問題，大家可以 Fork 到自己的專案，在 Pull Request 即可。 補充官方網站提供了&lt;a href="https://bitbucket.org/repo/import" target="_blank"&gt;轉換各大 Source Hosting 工具&lt;/a&gt;，目前支援 &lt;a href="https://github.com/" target="_blank"&gt;Github&lt;/a&gt;、&lt;a href="http://sourceforge.net/" target="_blank"&gt;SourceForge&lt;/a&gt;、&lt;a href="http://code.google.com/intl/zh-TW/" target="_blank"&gt;Google Code&lt;/a&gt;、&lt;a href="http://subversion.tigris.org/" target="_blank"&gt;Subversion&lt;/a&gt;、&lt;a href="http://mercurial.selenic.com/" target="_blank"&gt;Mercurial&lt;/a&gt;…等。&lt;/p&gt;</description></item><item><title>版本控制 svn move 移動或更名</title><link>https://blog.wu-boy.com/2011/09/svn-mv-vs-git-mv/</link><pubDate>Tue, 27 Sep 2011 06:06:25 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/09/svn-mv-vs-git-mv/</guid><description>&lt;p&gt;公司採用 svn 當作版本控制，而我最近在整理 svn 上面全部的 source code。基本上我都會將 git 跟 svn 也一起搭配著用，因為個人比較熟悉 git 的操作方式，然而跟同事討論了專案目錄的架構，進而要把一些目錄轉換大小寫，本來的 App 就改成 app，這個在 git 底下(OS: Linux)操作非常容易，直接 git mv App app，之後看 git status 可以發現底下輸出：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# On branch develop
# Changes to be committed:
# (use "git reset HEAD &lt;file&gt;..." to unstage)
#
# renamed: nav/hacks.txt -&gt; Nav/hacks.txt
# renamed: nav/moo.fx.js -&gt; Nav/moo.fx.js
# renamed: nav/moo.fx.pack.js -&gt; Nav/moo.fx.pack.js
# renamed: nav/nav.js -&gt; Nav/nav.js
# renamed: nav/prototype.lite.js -&gt; Nav/prototype.lite.js
# renamed: nav/user_guide_menu.js -&gt; Nav/user_guide_menu.js
#&lt;/pre&gt; 可是在 svn 的流程不是這樣喔，首先 svn 會將原本的目錄先刪除，再來新增一個新目錄。這樣就算了，在 Windows 底下還不讓你這樣操作，請先裝 
&lt;p&gt;&lt;a href="http://www.sliksvn.com/en/download" target="_blank"&gt;Subversion Client&lt;/a&gt;，然後請在&amp;quot;開始&amp;quot;-&amp;gt;&amp;ldquo;執行&amp;rdquo; 打入 cmd，可以透過 svn mv 方式來操作&lt;/p&gt;</description></item><item><title>Git Submodule 介紹與使用</title><link>https://blog.wu-boy.com/2011/09/introduction-to-git-submodule/</link><pubDate>Thu, 22 Sep 2011 12:30:44 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/09/introduction-to-git-submodule/</guid><description>&lt;p&gt;自己用 &lt;a href="http://git-scm.com/" target="_blank"&gt;Git&lt;/a&gt; 已經很長一段時間了，沒用過 git submodule 的話真的是對不起自己，今天來筆記 &lt;a href="http://book.git-scm.com/5_submodules.html" target="_blank"&gt;Git Submodule&lt;/a&gt; 一些操作步驟及說明。&lt;/p&gt;
&lt;h2 id="git-submodule-使用時機"&gt;git Submodule 使用時機&lt;/h2&gt;
&lt;p&gt;大家在開發新專案的時候，不知道有沒有用到其他專案的程式碼，像是 Web 專案，也許會用到 &lt;a href="http://www.blueprintcss.org/" target="_blank"&gt;Blueprintcss CSS Framwork&lt;/a&gt; 或者是 &lt;a href="http://sass-lang.com/" target="_blank"&gt;Sass&lt;/a&gt;，這些專案目前都放在 &lt;a href="http://github.com" target="_blank"&gt;Github&lt;/a&gt; 上面進行維護，以前的作法就是先 git clone 下來，把要的檔案分別複製到自己專案，可是問題來了，如果官方更新了程式碼，那自己的專案如何更新呢？難道是重複步驟把檔案複製到原來地方嗎？這樣會不會太麻煩，這時候就是需要 &lt;span style="color:green"&gt;&lt;strong&gt;git submodule&lt;/strong&gt;&lt;/span&gt; 來幫助大家進行程式碼的更新，這樣隨時隨地都可以取得最新的程式碼。補充說明一點，git 目前無法針對單一專案底下的單一檔案或目錄進行 clone，而必須 clone 整個目錄，這點跟 &lt;a href="http://subversion.tigris.org/" target="_blank"&gt;svn&lt;/a&gt; 有很大的不同，所以 git 可以建立各個不同的 submodule 來整合成一個大型 Project。換句話說就是: 在您的專案底下，&lt;strong&gt;&lt;span style="color:red"&gt;你可以任意將其他人的專案掛載在自己任何目錄底下&lt;/span&gt;&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>安裝 XCache 加速 PHP 執行速度</title><link>https://blog.wu-boy.com/2011/09/how-to-install-xcache-on-freebsd/</link><pubDate>Tue, 20 Sep 2011 09:56:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/09/how-to-install-xcache-on-freebsd/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/6034284842/" title="php-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm7.static.flickr.com/6186/6034284842_351ff33711_m.jpg?resize=240%2C127&amp;#038;ssl=1" alt="php-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;最近 &lt;a href="http://www.freebsd.org" target="_blank"&gt;FreeBSD&lt;/a&gt; 系統常常會當機，加上 &lt;a href="https://www.varnish-cache.org/" target="_blank"&gt;Varnish cache&lt;/a&gt; + &lt;a href="http://pecl.php.net/package/APC" target="_blank"&gt;APC&lt;/a&gt; 一直給我出包，所以這次就換了一套加速 PHP 執行的套件 &lt;a href="http://xcache.lighttpd.net/" target="_blank"&gt;XCache&lt;/a&gt;，這是一套由華人所開發的加速器，可以參考篇&lt;a href="http://twpug.net/" target="_blank"&gt;台灣PHP聯盟論壇&lt;/a&gt;所發表 &lt;a href="http://twpug.net/modules/newbb/viewtopic.php?topic_id=1571&amp;forum=14&amp;post_id=8054" target="_blank"&gt;PHP 加速器 - xcache&lt;/a&gt;，裡面可以看到&lt;a href="http://forum.lighttpd.net/topic/880" target="_blank"&gt;這篇&lt;/a&gt;裡面就有中文的對話，非常好玩，這次也順便把 PHP 升級到 5.3.8 版本，還有 Varnish 一次升級到 3.0.1 版本。&lt;/p&gt;
&lt;h2 id="各家-php-加速器"&gt;各家 PHP 加速器&lt;/h2&gt;
&lt;p&gt;大家都知道目前網路上知名的 PHP 加速器 &lt;a href="http://pecl.php.net/apc" target="_blank"&gt;apc&lt;/a&gt;, &lt;a href="http://eaccelerator.sf.net/" target="_blank"&gt;eaccelerator&lt;/a&gt;, &lt;a href="http://www.php-accelerator.co.uk/" target="_blank"&gt;phpa&lt;/a&gt;, &lt;a href="http://turck-mmcache.sourceforge.net/index_old.html" target="_blank"&gt;truck-mmcache&lt;/a&gt;，這幾套網路上資料很多，大家都可以試著玩看看，尤其是前面兩套 APC 及 eaccelerator，phpa 目前已經不再維護了，truck-mmcache 版本好像也沒啥在更新，距離上次更新是 2009-07-17，Xcache 作者研究 truck-mmcache 跟 APC 已經很長的時間，他發現 APC 的程式碼比起 truck-mmcache 還要簡單更容易瞭解，所以大家也可以研究 APC 相關程式碼。&lt;/p&gt;</description></item><item><title>Linode VPS Inbound 流量將不再收費</title><link>https://blog.wu-boy.com/2011/09/linode-vps-inbound-%E6%B5%81%E9%87%8F%E5%B0%87%E4%B8%8D%E5%86%8D%E6%94%B6%E8%B2%BB/</link><pubDate>Sun, 11 Sep 2011 17:06:38 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/09/linode-vps-inbound-%E6%B5%81%E9%87%8F%E5%B0%87%E4%B8%8D%E5%86%8D%E6%94%B6%E8%B2%BB/</guid><description>&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;img src="https://i1.wp.com/www.linode.com/images/linode_logo_gray.png?w=840" alt="Linode VPS" data-recalc-dims="1" /&gt;
&lt;/div&gt; 如果有在玩虛擬主機的朋友們，這是一項非常大的消息(
&lt;p&gt;&lt;a href="http://blog.linode.com/2011/09/01/linode-reduces-transfer-pricing/" target="_blank"&gt;Linode Reduces Transfer Pricing&lt;/a&gt;)，那就是從**&lt;span style="color:red"&gt;2011年9月1日&lt;/span&gt;&lt;strong&gt;開始，只要是流入 &lt;a href="http://www.linode.com/" target="_blank"&gt;Linode VPS&lt;/a&gt; 或者是 &lt;a href="http://blog.linode.com/2011/07/13/introducing-nodebalancer/" target="_blank"&gt;NodeBalancer&lt;/a&gt; 伺服器的流量都是&lt;/strong&gt;&lt;span style="color:red"&gt;免費&lt;/span&gt;**，至於流出流量呢？只要是超過限制的 transfer pool 都是以 $0.10/GB 來計費，這相當便宜阿，Linode 看的出來蠻用心的，可以租一台當作 backup server 也不賴，價格來說也不會很貴啦，最小 VPS 每個月流量給大 200G/month，其實也用不太完，但是網路的速度，可能就要評估看看，不要依賴 Ping 的 ttl 值，以直接下載檔案速度來觀看也許會比較適合喔。&lt;/p&gt;</description></item><item><title>CodeIgniter@TW 成立 IRC 頻道 #codeigniter.tw</title><link>https://blog.wu-boy.com/2011/09/codeignitertw-%E6%88%90%E7%AB%8B-irc-%E9%A0%BB%E9%81%93-codeigniter-tw/</link><pubDate>Fri, 02 Sep 2011 02:18:56 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/09/codeignitertw-%E6%88%90%E7%AB%8B-irc-%E9%A0%BB%E9%81%93-codeigniter-tw/</guid><description>&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 為了方便大家可以線上討論 
&lt;p&gt;&lt;a href="http://codeigniter.org.tw" target="_blank"&gt;CodeIgniter&lt;/a&gt; 技術，我在 &lt;a href="http://freenode.net/" target="_blank"&gt;Freenode&lt;/a&gt; 開了一個 &lt;a href="http://zh.wikipedia.org/zh-hant/IRC"&gt;IRC&lt;/a&gt; 聊天室，頻道是 #codeigniter.tw，歡迎大家可以上來聊聊天，當然在台灣官方首頁也加入了 Web 版的 IRC 聊天室，可以透過這&lt;a href="http://www.codeigniter.org.tw/irc" target="_blank"&gt;網址&lt;/a&gt;進入，如果您是在 Windows 環境可以下載 &lt;a href="http://xchat.org/" target="_blank"&gt;XChat&lt;/a&gt; 軟體來上聊天室，Linux 底下可以透過 screen + irc 指令掛網。 另外講一下 CodeIgniter 最近的消息，那就是很高興官方成功轉換到 &lt;a href="https://github.com/EllisLab/CodeIgniter" target="_blank"&gt;Github 上面進行版本控制&lt;/a&gt;，目前在 PHP Language 也爬升到&lt;a href="http://codeigniter.com/news/amazing_progress_report_addition_of_irc_to_codeigniter.com/" target="_blank"&gt;第10名&lt;/a&gt;，第一名還是 &lt;a href="http://www.symfony-project.org/" target="_blank"&gt;Symfony&lt;/a&gt;，CodeIgniter 其中一位作者 &lt;a href="http://twitter.com/philsturgeon"&gt;Phil Sturgeon&lt;/a&gt; 與&lt;a href="http://fuelphp.com/roadmap" target="_blank"&gt;其他作者&lt;/a&gt;推出一套 &lt;a href="http://fuelphp.com/" target="_blank"&gt;Fuel PHP Framework&lt;/a&gt; 也是大受歡迎，排在 CodeIgniter 後面，真是讚。 不多說了，大家快來聊天吧 &lt;span style="color: #008000;"&gt;&lt;strong&gt;/join #codeigniter.tw&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;</description></item><item><title>git cherry-pick 處理專案 pull request</title><link>https://blog.wu-boy.com/2011/08/git-cherry-pick-%E8%99%95%E7%90%86%E5%B0%88%E6%A1%88-pull-request/</link><pubDate>Sat, 27 Aug 2011 04:11:09 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/08/git-cherry-pick-%E8%99%95%E7%90%86%E5%B0%88%E6%A1%88-pull-request/</guid><description>&lt;p&gt;很高興最近有些網路上朋友想要加入&lt;a href="https://github.com/appleboy/PHP-CodeIgniter-Framework-Taiwan" target="_blank"&gt;翻譯 CodeIgniter 的計畫&lt;/a&gt;，本人在 2009 年開啟這計畫時，就打算用當時蠻熱門的 &lt;a href="http://git-scm.com/" target="_blank"&gt;git&lt;/a&gt; 來控管翻譯的進度，然而也選用了 &lt;a href="https://github.com/" target="_blank"&gt;github&lt;/a&gt; 來當作 Web 平台，可是大家對於入門 git 有很大的挫折，其實學習 git 沒有想像中這麼難，想要貢獻自己的程式碼都可以在 github 找到教學步驟，2009 年那時候 github 文件還尚未像現在這麼完整，入門之前可以先閱讀 &lt;a href="http://help.github.com/" target="_blank"&gt;git help 教學&lt;/a&gt;，貢獻程式碼之前可以先 &lt;a href="http://help.github.com/fork-a-repo/" target="_blank"&gt;Fork 專案&lt;/a&gt;，接著進行 &lt;a href="http://help.github.com/send-pull-requests/" target="_blank"&gt;Pull request&lt;/a&gt;，這些都是透過 Web 介面就可以做到了，但是大家在 pull request 之前記得先將專案程式碼更新，以及 pull request 時選取需要的 commit 阿，先看一個範例，有朋友發了一個 &lt;a href="http://codeigniter.org.tw/user_guide/libraries/xmlrpc.html" target="_blank"&gt;XML-RPC Class&lt;/a&gt; 翻譯的 &lt;a href="https://github.com/appleboy/PHP-CodeIgniter-Framework-Taiwan/pull/3" target="_blank"&gt;Chinese Pull request&lt;/a&gt; 來，但是大家有沒有看到內容，裡面還包含了先前 &lt;a href="https://github.com/appleboy/PHP-CodeIgniter-Framework-Taiwan/pull/2" target="_blank"&gt;Html Table 翻譯&lt;/a&gt;，所以這時候我就必須用 &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-cherry-pick.html" target="_blank"&gt;git cherry-pick&lt;/a&gt; 來挑選需要的 commit。&lt;/p&gt;
&lt;h3 id="git-cherry-pick-使用方法"&gt;git cherry-pick 使用方法&lt;/h3&gt;
&lt;p&gt;我們如何 Merge 別人的 pull request，首先新增 remote add branch:&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# gname 可以自己自訂
git remote add gname https://github.com/gname/PHP-CodeIgniter-Framework-Taiwan.git
# fetch 程式碼下來
git fetch gname
# 選取您要合併的 commit
# -n 代表多個 commit
git cherry-pick -n bf0246c8 ab3f4943
# 可以修改 commit log 內容
git commit -c bf0246c8&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;這樣就可以不用 merge 全部的內容，也相當方便 ^^&lt;/p&gt;</description></item><item><title>CodeIgniter 轉移版本控制到 Github 順便 Release 2.0.3</title><link>https://blog.wu-boy.com/2011/08/codeigniter-%E8%BD%89%E7%A7%BB%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6%E5%88%B0-github-%E9%A0%86%E4%BE%BF-release-2-0-3/</link><pubDate>Mon, 22 Aug 2011 07:33:36 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/08/codeigniter-%E8%BD%89%E7%A7%BB%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6%E5%88%B0-github-%E9%A0%86%E4%BE%BF-release-2-0-3/</guid><description>&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 在我上禮拜 8/20,8/21 參加 
&lt;p&gt;&lt;a href="http://coscup.org/2011/" target="_blank"&gt;COSCUP 2011&lt;/a&gt; 會議的時候，&lt;a href="http://www.codeigniter.org.tw/" target="_blank"&gt;CodeIgniter&lt;/a&gt; 偷偷 Release 了 2.0.3 版本，也不算偷偷 Release，因為剛好8月20,21號也是 &lt;a href="http://cicon2011.com/" target="_blank"&gt;CICON 2011&lt;/a&gt; 會議，CodeIgniter 想給來聽演講的學員們一個驚喜吧，也因為這個 CodeIgniter Con 2011 會議，官方也宣佈將轉換版本控制，原本放在 &lt;a href="https://bitbucket.org/ellislab/codeigniter-reactor" target="_blank"&gt;bitbucket&lt;/a&gt; 的程式碼也都轉換到 &lt;a href="https://github.com/EllisLab/CodeIgniter" target="_blank"&gt;Github&lt;/a&gt; 上面了，另外順便把 CodeIgniter Reactor 取消後面 Reactor 字串，改成 CodeIgniter 了，那 Reactor 呢，就變成 Develop 分支，這個消息真的是太棒了，轉換到大家所熟悉的 Git 版本控制，有些常常在貢獻程式碼的開發者，都是在使用 Github。不管是不是 CodeIgniter，其他許多 opensource 包含 &lt;a href="http://jQuery.com" target="_blank"&gt;jQuery&lt;/a&gt;, &lt;a href="http://www.phpBB.com" target="_blank"&gt;phpBB&lt;/a&gt;…等都是在使用 github。 [&lt;/p&gt;
&lt;h3 id="直接下載-203-玩看看吧1-參考"&gt;直接下載 2.0.3 玩看看吧]&lt;a href="http://www.codeigniter.org.tw/downloads/file/CodeIgniter_2.0.3"&gt;1&lt;/a&gt; 參考:&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.codeigniter.org.tw/blog/github_reactor_and_codeigniter_2.0.3_released" target="_blank"&gt;繁體中文 CodeIgniter 官方公告&lt;/a&gt;&lt;/p&gt;</description></item><item><title>JavaScript Reference Select and Option objects 用法介紹</title><link>https://blog.wu-boy.com/2011/08/javascript-reference-select-and-option-objects-%E7%94%A8%E6%B3%95%E4%BB%8B%E7%B4%B9/</link><pubDate>Fri, 19 Aug 2011 08:18:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/08/javascript-reference-select-and-option-objects-%E7%94%A8%E6%B3%95%E4%BB%8B%E7%B4%B9/</guid><description>&lt;p&gt;在網頁裡面用 &lt;a href="http://www.w3schools.com/jsref/dom_obj_select.asp" target="_blank"&gt;Select&lt;/a&gt; 是很常遇到的，之前也寫了一篇&lt;a href="http://blog.wu-boy.com/2009/03/jquery-%E5%A6%82%E4%BD%95%E5%8F%96%E5%BE%97-select-liset-index-%E5%92%8C-value-%E5%80%BC/" target="_blank"&gt;如何利用 jQuery 動態增加 option 或取值&lt;/a&gt;，&lt;a href="http://jQuery.com" target="_blank"&gt;jQuery&lt;/a&gt; 部份就不介紹了，那是需要搭配 &lt;a href="http://www.texotela.co.uk/code/jquery/select/" target="_blank"&gt;jQuery Plugin: Select box manipulation&lt;/a&gt;，今天要介紹的是如何用 javascript 動態取值或者是增加 option 選項。因為我發現有使用者直接利用 &lt;a href="http://www.tizag.com/javascriptT/javascript-innerHTML.php" target="_blank"&gt;innerHtml&lt;/a&gt; 的方式來把資料塞入到 Select 裡面，雖然 &lt;a href="http://moztw.org/" target="_blank"&gt;FireFox&lt;/a&gt; 或 &lt;a href="http://www.google.com/chrome?hl=zh-TW" target="_blank"&gt;Chrome&lt;/a&gt; 都可以正常運作，但是遇到 IE 還是沒辦法動。&lt;/p&gt;
&lt;h3 id="如何取得-select-element-底下很多方法可以取得-select-element-1-透過-form-name--element-name"&gt;如何取得 select element 底下很多方法可以取得 select element: 1. 透過 form name + element name&lt;/h3&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;document.myform.selectname&lt;/pre&gt; 2. 透過 form name + element 陣列(注意看 select 是位在 form element index 值多少) 
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;document.myform.elements&lt;em&gt;&lt;/em&gt;&lt;/pre&gt; 3. 透過獨一無二的 ID 
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;document.getElementById("selectid")&lt;/pre&gt;</description></item><item><title>推薦一本書籍 Master Mobile Web Apps with jQuery Mobile</title><link>https://blog.wu-boy.com/2011/08/%E6%8E%A8%E8%96%A6%E4%B8%80%E6%9C%AC%E6%9B%B8%E7%B1%8D-master-mobile-web-apps-with-jquery-mobile/</link><pubDate>Fri, 12 Aug 2011 07:25:52 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/08/%E6%8E%A8%E8%96%A6%E4%B8%80%E6%9C%AC%E6%9B%B8%E7%B1%8D-master-mobile-web-apps-with-jquery-mobile/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/6034783546/" title="master-mobile-web-apps-with-jqm by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm7.static.flickr.com/6210/6034783546_64ef53c090.jpg?resize=375%2C483&amp;#038;ssl=1" alt="master-mobile-web-apps-with-jqm" data-recalc-dims="1" /&gt;&lt;/a&gt; 在這裡跟大家推薦一本國外的書籍，也就是 &lt;a href="http://www.elated.com/" target="_blank"&gt;Elated.com&lt;/a&gt; 網站作者 Matt Doyle 推出的一本新書 &lt;a href="http://store.elated.com/" target="_blank"&gt;Master Mobile Web Apps with jQuery Mobile&lt;/a&gt;，此作者也有推出 &lt;a href="http://www.amazon.com/Beginning-PHP-5-3-Matt-Doyle/dp/0470413964" target="_blank"&gt;PHP&lt;/a&gt; 及 &lt;a href="http://www.amazon.com/Photoshop-Layers-Bible-Matt-Doyle/dp/0470082119/" target="_blank"&gt;Photoshop&lt;/a&gt; 的書籍，本人相當佩服有美工天份又會寫程式人才。然而現在當紅的 Mobile Device，大家相繼為了 iOS, Android 或其他手持式裝置撰寫 Web 介面，目前網路上大家推的其中一套就是 &lt;a href="http://jquerymobile.com/" target="_blank"&gt;jQuery Mobile&lt;/a&gt;，而我呢，正在摸索另一套強大的 Web App Framework: &lt;a href="http://www.sencha.com/products/touch/" target="_blank"&gt;Sencha Touch&lt;/a&gt;，功能來比的話，個人覺得 Sencha Touch 優勢比較多，之後有機會再來寫一系列的 Sencha Touch 文章。此書有提供&lt;a href="http://store.elated.com/products/jquery-mobile-book/Sample%20of%20Master%20Mobile%20Web%20Apps%20with%20jQuery%20Mobile.pdf" target="_blank"&gt;目錄&lt;/a&gt;可以參考，該作者會教大家如何搭配 PHP 跟 MySQL 結合 jQuery Mobile API 來撰寫程式，書籍應該是蠻完整的，目前售價美金19元，如果有興趣的人可以上網下單。&lt;/p&gt;</description></item><item><title>無痛安裝 NodeJS 和 Node Framework Express</title><link>https://blog.wu-boy.com/2011/08/%E7%84%A1%E7%97%9B%E5%AE%89%E8%A3%9D-nodejs-%E5%92%8C-node-framework-express/</link><pubDate>Thu, 11 Aug 2011 07:25:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/08/%E7%84%A1%E7%97%9B%E5%AE%89%E8%A3%9D-nodejs-%E5%92%8C-node-framework-express/</guid><description>&lt;div style="margin: 0 auto;text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6033708087/" title="nodejs-light by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm7.static.flickr.com/6199/6033708087_ff1a02a337_o.jpg?resize=260%2C71&amp;#038;ssl=1" alt="nodejs-light" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://nodejs.org/" target="_blank"&gt;NodeJS&lt;/a&gt; 是目前當紅的 Web 2.0 技術，去年 &lt;a href="http://coscup.org/2010/zh-tw/program/" target="_blank"&gt;COSCUP 2010&lt;/a&gt; 就有 &lt;a href="http://www.KKBOX.com.tw" target="_blank"&gt;KKBOX&lt;/a&gt; 資深工程師 ericpi 來探討這個議題，NodeJS 背後使用了 V8 引擎為基礎，沒看過用純 JS 來當 Server-Side 吧，台灣很紅的 Plurk 也是大量使用 NodeJS，然而每開發一種語言，就會想開始找搭配的 Framework，那就首推 &lt;a href="http://expressjs.com/" target="_blank"&gt;Node Framework Express&lt;/a&gt; 來撰寫程式，本篇是要介紹如何在 Ubuntu 10.10 無痛安裝 nodejs + express。&lt;/p&gt;
&lt;h3 id="下載-nodejs-原始碼-直接到"&gt;下載 Nodejs 原始碼 直接到&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://nodejs.org/#download" target="_blank"&gt;官網下載 Stable 的版本&lt;/a&gt;吧，目前是 node-v0.4.10.tar.gz，也可以先看看 &lt;a href="http://nodejs.org/docs/v0.4.10/api/index.html" target="_blank"&gt;API Document&lt;/a&gt;&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# wget http://nodejs.org/dist/node-v0.4.10.tar.gz&lt;/pre&gt;</description></item><item><title>PHP function 參數 default value</title><link>https://blog.wu-boy.com/2011/08/php-function-%E5%8F%83%E6%95%B8-default-value/</link><pubDate>Sat, 06 Aug 2011 12:58:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/08/php-function-%E5%8F%83%E6%95%B8-default-value/</guid><description>&lt;div style="margin: 0 auto;text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6034284842/" title="php-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm7.static.flickr.com/6186/6034284842_351ff33711_m.jpg?resize=240%2C127&amp;#038;ssl=1" alt="php-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;2011.08.06 Update: 感謝 jaceju 指正筆誤&lt;/strong&gt; 自己定義 &lt;a href="http://www.php.net" target="_blank"&gt;PHP&lt;/a&gt; Function 的時候，假設該函式有1個參數，您可以傳入該參數或者是不傳，但是函式裡面如何判斷是否有傳入該參數呢？先看看底下例子:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;function test($arg_1 = NULL)
{
 // 判斷 $arg_1 參數是否傳入
 $arg_1 = $arg_1 || 'test';
 echo $arg_1; 
}&lt;/pre&gt; 你會發現上面結果會是 
&lt;p&gt;&lt;span style="color:red"&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/span&gt;，而不是 test，大家會懷疑為什麼這樣寫不行呢，那是因為 || 是 &lt;span style="color:green"&gt;&lt;strong&gt;boolean operators&lt;/strong&gt;&lt;/span&gt;，他只會 return true 或是 false，而不是回傳 string，如果想這這樣寫，大概可以用 javascript 或 perl 語言來寫，javascript 可以參考之前的文章 &lt;a href="http://blog.wu-boy.com/2009/11/javascript-%E5%9C%A8%E5%87%BD%E6%95%B8%E8%A3%A1%E8%A8%AD%E5%AE%9A%E5%8F%83%E6%95%B8%E9%A0%90%E8%A8%AD%E5%80%BC/" target="_blank"&gt;[Javascript] 在函數裡設定參數預設值&lt;/a&gt;，然而 PHP 的正確寫法要用 ?: 來取代&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;function test($arg_1 = NULL)
{
 // 判斷 $arg_1 參數是否傳入
 $arg_1 = (isset($arg_1)) ? $arg_1 : 'test';
 // 或者是
 $arg_1 = $arg_1 ? $arg_1 : 'test';
 echo $arg_1; 
}&lt;/pre&gt; 請參考 
&lt;p&gt;&lt;a href="http://php.net/manual/en/language.operators.logical.php" target="_blank"&gt;Logical Operators&lt;/a&gt;&lt;/p&gt;</description></item><item><title>深入探討 CodeIgniter Input Class 核心程式流程</title><link>https://blog.wu-boy.com/2011/08/%E6%B7%B1%E5%85%A5%E6%8E%A2%E8%A8%8E-codeigniter-input-class-%E6%A0%B8%E5%BF%83%E7%A8%8B%E5%BC%8F%E6%B5%81%E7%A8%8B/</link><pubDate>Wed, 03 Aug 2011 12:55:58 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/08/%E6%B7%B1%E5%85%A5%E6%8E%A2%E8%A8%8E-codeigniter-input-class-%E6%A0%B8%E5%BF%83%E7%A8%8B%E5%BC%8F%E6%B5%81%E7%A8%8B/</guid><description>&lt;div style="margin: 0 auto; width:100%;text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/4928689646/" title="codeigniter_2 by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?resize=137%2C189&amp;#038;ssl=1" alt="codeigniter_2" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 為什麼會寫到這篇呢？當然是有網友希望可以幫他解決困難，由於問題的解答需要比較長的文章解釋，就寫出這一篇啦。在我 2009 年開始推廣到現在，相信在台灣已經有不少人開始使用 
&lt;p&gt;&lt;a href="http://codeigniter.org.tw/" target="_blank"&gt;CodeIgniter&lt;/a&gt;，自己覺得非常感動 XD，也非常欣慰，希望把好東西推廣給大家知道。廢話不多說，先來說說問題點，先前發表的一篇 &lt;a href="http://blog.wu-boy.com/2010/08/codeigniter-利用-jquery-簡易驗證使用者帳號email/" target="_blank"&gt;[CodeIgniter] 利用 jQuery 簡易驗證使用者帳號/Email&lt;/a&gt; 最後有人&lt;a href="http://blog.wu-boy.com/2010/08/codeigniter-%E5%88%A9%E7%94%A8-jquery-%E7%B0%A1%E6%98%93%E9%A9%97%E8%AD%89%E4%BD%BF%E7%94%A8%E8%80%85%E5%B8%B3%E8%99%9Femail/#comment-275946631" target="_blank"&gt;留言&lt;/a&gt;針對 input-&amp;gt;post() 在中文官網上面的 &lt;a href="http://codeigniter.org.tw/user_guide/libraries/input.html" target="_blank"&gt;Input Class 教學&lt;/a&gt;有些疑慮，底下我先來說明網友的問題點。&lt;/p&gt;
&lt;h3 id="input-post-如果為空則塞進去資料庫竟然是-0-該網友引用了-input-class-中文文件的內容"&gt;input-&amp;gt;post 如果為空，則塞進去資料庫竟然是 0 該網友引用了 Input Class 中文文件的內容&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;使用 POST, COOKIE, 或 SERVER 資料CodeIgniter 提供三個讓你取出 POST, COOKIE 或 SERVER 中項目的補助函數。使用這些函數的主要便利性在於, 它們會確認並檢視是否這些項目已被設定並且在未設定時回傳 false (boolean) , 而不是直接取出 ($_POST[&amp;lsquo;something&amp;rsquo;])，官方範例↓這讓你可以方便地使用資料而不必預先測試它們是否存在。不然, 通常你可能會像這樣做：if ( ! isset($_POST[&amp;lsquo;something&amp;rsquo;])) { $something = FALSE; } else { $something = $_POST[&amp;lsquo;something&amp;rsquo;]; } 網友敘述:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;但是為什麼還是為設定為0呢??這應該是檢查資料有沒有被設定而已，那我如果沒有輸入，又怎麼會出現 0 呢?? 網友希望 $username = &lt;span style="color:green"&gt;$this-&amp;gt;input-post&lt;/span&gt;(&amp;ldquo;username&amp;rdquo;); 能幫他判斷如果 username 沒有資料，就直接回傳 NULL，Insert 到資料庫時，應該是 NULL 而不是 0。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="程式範例-網友其實沒有錯根據文件上顯示如果-something-"&gt;程式範例 網友其實沒有錯，根據文件上顯示，如果 $something =&lt;/h3&gt;
&lt;p&gt;&lt;span style="color:green"&gt;$this-&amp;gt;input-&amp;gt;post&lt;/span&gt;(&amp;ldquo;something&amp;rdquo;); 取值過後，如果系統沒有 &lt;span style="color:green"&gt;$_POST[&amp;lsquo;something&amp;rsquo;]&lt;/span&gt;，則會回傳 &lt;span style="color:red"&gt;FALSE&lt;/span&gt;，我猜網友在跟 model 作搭配的時候使用了底下的寫法來塞值進入資料庫:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;$data = array(
 "username" =&gt; $this-&gt;input-&gt;post('username'),
 "passwd" =&gt; $this-&gt;input-&gt;post('passwd'), 
 "email" =&gt; $this-&gt;input-&gt;post('email'),
);
$this-&gt;load-&gt;model('members'); 
$this-&gt;members-&gt;register($data); 
&lt;/pre&gt; 假設如果沒有 $_POST['email'] 的話，該欄位就會被設定為 0，原因很簡單，就是出在要塞值進入資料庫的時候，程式針對資料的型態判斷啦，底下從最開始取得 
&lt;p&gt;&lt;span style="color:green"&gt;$_POST&lt;/span&gt; 資料開始說起。&lt;/p&gt;</description></item><item><title>Linux 程式開發編輯器 Geany + Fuse 遠端掛載</title><link>https://blog.wu-boy.com/2011/07/linux-geany-fuse/</link><pubDate>Thu, 21 Jul 2011 09:45:38 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/07/linux-geany-fuse/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/5960473038/" title="Geny by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm7.static.flickr.com/6139/5960473038_a673f811c5.jpg?resize=500%2C297&amp;#038;ssl=1" alt="Geny" data-recalc-dims="1" /&gt;&lt;/a&gt; 自己買的筆電灌上了 Ubuntu 作業系統，Linux 系統好處多多，指令自己也熟悉，想架什麼站都可以，但是最主要還是要找一套程式開發編輯器，網路上看了大部份文章，我決定用 &lt;a href="http://www.geany.org/" target="_blank"&gt;Geany&lt;/a&gt; 這套免費的編輯器，在 Windows XP 底下我則是使用 &lt;a href="http://www.pspad.com/" target="_blank"&gt;PSPad&lt;/a&gt; 搭配內建的 FTP 功能遠端編輯寫程式，但是 Geany 並沒有支援 FTP 功能，可以詳細看到&lt;a href="http://www.geany.org/Documentation/FAQ#QQuestions10" target="_blank"&gt;官方網站 Q&amp;amp;A&lt;/a&gt;，官方建議搭配 &lt;a href="http://fuse.sourceforge.net/" target="_blank"&gt;Fuse&lt;/a&gt; 或 &lt;a href="http://sourceforge.net/projects/lufs/" target="_blank"&gt;LUFS&lt;/a&gt;，這樣並不只是 Geany 可以使用，其他 Application 也可以任意使用了。 在介紹 Fuse 之前可以先參考過去寫的一篇教學: &lt;a href="http://blog.wu-boy.com/2008/04/linux-freebsd-%E5%A5%BD%E7%94%A8%E7%9A%84-ssh-filesystem-fusefs-sshfs-in-freebsd-or-linux/" target="_blank"&gt;[SSHFS] 好用的 SSH Filesystem fusefs-sshfs in FreeBSD or Linux&lt;/a&gt;，裡面分享了 &lt;a href="http://www.FreeBSD.org" target="_blank"&gt;FreeBSD&lt;/a&gt; 跟 Linux 底下的 tarball 安裝方式，當然現階段 Ubuntu 安裝就很容易了，透過 Apt 管理的方式安裝:&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ apt-cache search sshfs
sshfs - filesystem client based on SSH File Transfer Protocol
sshfs-dbg - filesystem client based on SSH File Transfer Protocol (with debbuging symbols)
sbackup-plugins-fuse - Simple Backup Suite FUSE plugins
$ apt-get install sshfs&lt;/pre&gt; 安裝完成，透過底下指令把遠端資料夾 mount 過來吧。 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ mkdir /home/appleboy/tmp
$ sshfs -p 22 appleboy@XXX.XXX.XXX.XXX:/home/appleboy /home/appleboy/tmp&lt;/pre&gt; Geany 真的蠻好用的喔，推薦給大家，還有其他 screenshot 可以參考
&lt;p&gt;&lt;a href="http://www.geany.org/Documentation/Screenshots" target="_blank"&gt;這裡&lt;/a&gt;&lt;/p&gt;</description></item><item><title>PHP 將長期宣導程式設計師將 ext/mysql 改用 pdo_mysql 和 mysqli</title><link>https://blog.wu-boy.com/2011/07/php-%E5%B0%87%E9%95%B7%E6%9C%9F%E5%AE%A3%E5%B0%8E%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88%E5%B8%AB%E5%B0%87-extmysql-%E6%94%B9%E7%94%A8-pdo_mysql-%E5%92%8C-mysqli/</link><pubDate>Mon, 18 Jul 2011 02:50:36 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/07/php-%E5%B0%87%E9%95%B7%E6%9C%9F%E5%AE%A3%E5%B0%8E%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88%E5%B8%AB%E5%B0%87-extmysql-%E6%94%B9%E7%94%A8-pdo_mysql-%E5%92%8C-mysqli/</guid><description>&lt;div style="margin: 0 auto;text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/6034284842/" title="php-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm7.static.flickr.com/6186/6034284842_351ff33711_m.jpg?resize=240%2C127&amp;#038;ssl=1" alt="php-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 今天看到一篇 PHP-Dev 公佈一篇 
&lt;p&gt;&lt;a href="http://marc.info/?l=php-internals&amp;m=131031747409271&amp;w=2" target="_blank"&gt;[PHP-DEV] deprecating ext/mysql&lt;/a&gt;，大意就是 PHP 官方未來將打算移除 ext/mysql 的所有相關文件及功能，作者相信很多程式開發者都是用 mysql 套件下去開發，聽到這消息會非常錯愕吧。 官方 documentation team 討論移除的原因在於安全性的考量，在 &lt;a href="http://blog.gslin.org/archives/2011/07/17/2711/php-%E9%95%B7%E6%9C%9F%E8%A8%88%E7%95%AB%EF%BC%9A%E5%BB%A2%E9%99%A4-extmysql%EF%BC%8C%E6%94%B9%E7%94%A8-pdo_mysql-%E6%88%96-mysqli/" target="_blank"&gt;DK 大神&lt;/a&gt;那邊看到是使用 ext/mysql 必須自己處理 mysql_real_escape_string 和 mysql_escape_string，所以官方希望教育使用者不要再使用 ext/mysql 了，底下是官方會做的事情&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;增加說明指出 ext/mysql 已過時&lt;/li&gt;
&lt;li&gt;建議和取代方案&lt;/li&gt;
&lt;li&gt;包含取代方案的範例 官方提供了兩個解決方案&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://php.net/manual/en/ref.pdo-mysql.php" target="_blank"&gt;pdo_mysql&lt;/a&gt; 和 &lt;a href="http://php.net/manual/en/book.mysqli.php" target="_blank"&gt;mysqli&lt;/a&gt;，官方列了幾點說明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;從現在開始教育使用者及增加說明文件&lt;/li&gt;
&lt;li&gt;在 5.4 版本增加 E_DEPRECATED 訊息，甚至 5.5 6.0 都可以&lt;/li&gt;
&lt;li&gt;提供 pdo_mysql 轉換的說明文件&lt;/li&gt;
&lt;li&gt;專注於整理 pdo_mysql 跟 mysqli 的線上文件&lt;/li&gt;
&lt;li&gt;增加 &amp;ldquo;The MySQL situation&amp;rdquo; 的文件說明現況 看完這篇，大家現在趕快轉換到 mysqli 或者是使用 PDO 來開發程式吧&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>簡易 CodeIgniter Layout Library for Template</title><link>https://blog.wu-boy.com/2011/07/%E7%B0%A1%E6%98%93-codeigniter-layout-library-for-template/</link><pubDate>Sun, 10 Jul 2011 09:49:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/07/%E7%B0%A1%E6%98%93-codeigniter-layout-library-for-template/</guid><description>&lt;p&gt;在 Web 開發網站，最重要的就是切割版面 CSS 化，制定共同部份 header 跟 footer…等，如果是用在 &lt;a href="http://codeigniter.org.tw" target="_blank"&gt;CodeIgniter&lt;/a&gt; Controller 裡面，呼叫 Views 的時候，如底下程式碼:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;$data = array(
 "title" =&gt; "Welcome to Test"
);
$this-&gt;load-&gt;view("header");
$this-&gt;load-&gt;view("welcome", $data);
$this-&gt;load-&gt;view("footer");&lt;/pre&gt; 大家可以發現只要任何一個 Controller 的函式都必須寫上面的程式碼，這樣是不是重複率太高了呢？在 
&lt;p&gt;&lt;a href="http://codeigniter.com/wiki/" target="_blank"&gt;CodeIgniter Wiki&lt;/a&gt; 裡面發現一個不錯用的簡易 &lt;a href="http://codeigniter.com/wiki/layout_library/" target="_blank"&gt;layout library&lt;/a&gt;，他的作法就是利用 $this-&amp;gt;load-&amp;gt;view 裡面的第三個參數來達成，可以參&lt;a href="http://www.codeigniter.org.tw/user_guide/general/views.html" target="_blank"&gt;考線上文件 - Views&lt;/a&gt; 最後一個段落 &lt;strong&gt;Returning views as data&lt;/strong&gt;，我們參考看看底下官網提供的程式碼:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;&lt;?php 
if (!defined('BASEPATH')) exit('No direct script access allowed');

class Layout
{
 
 var $obj;
 var $layout;
 
 function Layout($layout = "layout_main")
 {
 $this-&gt;obj =&amp; get_instance();
 $this-&gt;layout = $layout;
 }

 function setLayout($layout)
 {
 $this-&gt;layout = $layout;
 }
 
 function view($view, $data=null, $return=false)
 {
 $loadedData = array();
 $loadedData['content_for_layout'] = $this-&gt;obj-&gt;load-&gt;view($view,$data,true);
 
 if($return)
 {
 $output = $this-&gt;obj-&gt;load-&gt;view($this-&gt;layout, $loadedData, true);
 return $output;
 }
 else
 {
 $this-&gt;obj-&gt;load-&gt;view($this-&gt;layout, $loadedData, false);
 }
 }
}
?&gt; &lt;/pre&gt; 注意裡面制定了 layout_main.php 這個 Template PHP 檔案，所以大家需要在 
&lt;p&gt;&lt;span style="color:green"&gt;&lt;strong&gt;application/views&lt;/strong&gt;&lt;/span&gt; 資料夾產生此檔案，或者是可以透過程式 &lt;span style="color:green"&gt;&lt;strong&gt;setLayout&lt;/strong&gt;&lt;/span&gt; 函式去修改，至於我們怎麼傳變數到 Template 裡面呢，作者的作法是建立一個 config 檔案，裡面把不會變動的變數都寫在裡面，比如說是網站 site_name site_description site_keywords 等資料寫到 &lt;span style="color:green"&gt;&lt;strong&gt;application/config/site_settings.php&lt;/strong&gt;&lt;/span&gt;，接下來修改 layout library 裡面的 view function:&lt;/p&gt;</description></item><item><title>用 git 指令產生 Change log 格式</title><link>https://blog.wu-boy.com/2011/06/%E7%94%A8-git-%E6%8C%87%E4%BB%A4%E7%94%A2%E7%94%9F-change-log-%E6%A0%BC%E5%BC%8F/</link><pubDate>Mon, 27 Jun 2011 16:04:37 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/06/%E7%94%A8-git-%E6%8C%87%E4%BB%A4%E7%94%A2%E7%94%9F-change-log-%E6%A0%BC%E5%BC%8F/</guid><description>&lt;p&gt;Git 真的是一套非常好用的版本控制工具，在網路上看到一篇 &lt;a href="http://blog.rybas.org/2011/01/15/making-a-changelog-from-git-commit-messages"&gt;Making a Changelog from Git commit messages&lt;/a&gt; 裡面提到一篇新手必看的 &lt;a href="http://nvie.com/posts/a-successful-git-branching-model/"&gt;git branch model&lt;/a&gt;，剛好這篇我也寫了中文解說的部份『&lt;a href="http://blog.wu-boy.com/2011/03/git-%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6-branch-model-%E5%88%86%E6%94%AF%E6%A8%A1%E7%B5%84%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%B4%B9/"&gt;Git 版本控制 branch model 分支模組基本介紹&lt;/a&gt;』，回歸正題，此篇是介紹如何用 git 指令產生 Change log 檔案，平常 Change log 都會寫成類似底下的 format:&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;- Add Chinese Traditional language file
 - Changed to use count_all_results.
 - Added permissions checking to activation in example controller. 
 - Fixed an example in the userguide
 - changed phrases to more typical ones&lt;/pre&gt; 在 git log 裡面寫了很多 commit message 該如何 format 成上面的格式呢，其實很簡單，只要打入下面指令 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
#--no-merges: 不要秀出 merge message
#--pretty=format:' - %s' : 關鍵 format
git log --no-merges --pretty=format:' - %s'
&lt;/pre&gt; 另外我們還可以透過 --graph 顯示圖形式的 log 顯示，指令如下: 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;git log --graph --pretty=format:'%s - %Cred%h%Creset %Cgreen(%cr)%Creset %an' --abbrev-commit --date=relative
&lt;/pre&gt; 顯示結果如下 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;* Add Chinese Traditional language file - 1767c60 (4 months ago) Bo-Yi Wu
* Changed to use count_all_results. - 906d101 (4 months ago) Ben Edmunds
* Merge branch 'master' of https://github.com/Kohtason/CodeIgniter-Ion-Auth into Kohtason-master - 599188d (4 months ago) B
en Edmunds
|\
| * Fixed an example in the userguide - 65b0e05 (4 months ago) Sven Lueckenbach
| * changed phrases to more typical ones - 1941831 (4 months ago) Sven Lueckenbach
| * added ability to get usercount - b404fc3 (4 months ago) Kohtason
| * added ability to get usercount - b51e801 (4 months ago) Kohtason
| * added ability to get user-count - 11a85da (4 months ago) Kohtason
* | Added permissions checking to activation in example controller. Fixed bug in activation method in model. (via Phil Gyford) - c9ff
467 (4 months ago) Ben Edmunds&lt;/pre&gt; 不多說，補一張圖，讓大家看看 
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/5877607646/" title="git_log by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm6.static.flickr.com/5267/5877607646_a512efa889.jpg?resize=500%2C283&amp;#038;ssl=1" alt="git_log" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>How to write Platform Devices and Drivers with FPGA via GPMC</title><link>https://blog.wu-boy.com/2011/06/how-to-write-platform-devices-and-drivers-with-fpga-via-gpmc/</link><pubDate>Sun, 26 Jun 2011 15:00:19 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/06/how-to-write-platform-devices-and-drivers-with-fpga-via-gpmc/</guid><description>&lt;iframe src="//www.slideshare.net/slideshow/embed_code/key/is2GiucZdkWtbu" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen&gt; &lt;/iframe&gt; &lt;div style="margin-bottom:5px"&gt; &lt;strong&gt; &lt;a href="//www.slideshare.net/appleboy/how-to-write-platform-devices-and-drivers" title="How to write Platform Devices and Drivers with FPGA via GPMC" target="_blank"&gt;How to write Platform Devices and Drivers with FPGA via GPMC&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href="https://www.slideshare.net/appleboy" target="_blank"&gt;Bo-Yi Wu&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;
&lt;p&gt;這投影片是我在接手公司其中一個專案，所做的 Slide，當然最主要是深入了解 GPMC (General Purpose Memory Control)，GPMC 本來是ARM 用來跟 Memory 溝通的 interface，現在用來跟 FPGA 溝通，目前我只有看到&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ti.com/"&gt;TI&lt;/a&gt; 的線上文件有看到相關說明，以及解釋 GPMC 的 Program Model，在寫 GPMC 之前請先注意 Platform Device 跟 Platform Driver 的關係，之後才會開始設定 GPMC Config(1~7) 的設定檔，這樣拿示波器就可以看到 GPMC Chip Select 訊號，每個 ARM 只能接 8 個 Chip Select，這點大家必須注意，Flash 會用掉一個，在這專案學到蠻多東西，畢竟 Driver 這塊非常大，之前寫 &lt;a href="http://www.slideshare.net/appleboy/introduction-to-gsensor-i2c-driver"&gt;G-Sensor 的 i2c Driver&lt;/a&gt; 也是如此。此 Slide 只是初步介紹，更詳細的就要實際撰寫程式碼了。&lt;/p&gt;</description></item><item><title>好用 PHP debug extension Xdebug on FreeBSD 安裝</title><link>https://blog.wu-boy.com/2011/06/%E5%A5%BD%E7%94%A8-php-debug-extension-xdebug-on-freebsd-%E5%AE%89%E8%A3%9D/</link><pubDate>Tue, 07 Jun 2011 05:42:18 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/06/%E5%A5%BD%E7%94%A8-php-debug-extension-xdebug-on-freebsd-%E5%AE%89%E8%A3%9D/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/5806873037/" title="xdebug-logo by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm6.static.flickr.com/5108/5806873037_823aef3cd1_o.png?resize=200%2C116&amp;#038;ssl=1" alt="xdebug-logo" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 之前介紹 
&lt;p&gt;&lt;a href="http://www.firephp.org/"&gt;FirePHP&lt;/a&gt; 這套好用的 PHP Debug 工具，也寫了一篇針對 &lt;a href="http://codeigniter.org.tw/"&gt;CodeIgniter&lt;/a&gt; 的安裝方式，請參考: &lt;a href="http://blog.wu-boy.com/2010/06/php-%E5%A5%BD%E7%94%A8-debug-php-%E5%B7%A5%E5%85%B7-firephp-for-firefox-on-codeigniter/"&gt;[PHP] 好用 Debug PHP 工具 FirePHP for FireFox on CodeIgniter&lt;/a&gt;，今天要介紹一套好用的 PHP debug Extension: &lt;a href="http://xdebug.org/index.php"&gt;Xdebug&lt;/a&gt; 的安裝方式，作者環境是在 FreeBSD 上，Windows 安裝方式就到官方網站下載對應的 PHP Windows binaries，目前在 FreeBSD ports 上面的版本是 2.1.0，但是 Xdebug 作者已經更新到 2.1.1，自己就順手發了一個 &lt;a href="http://www.freebsd.org/cgi/query-pr.cgi?pr=157677"&gt;patch 157677&lt;/a&gt; 給 FreeBSD 官方 ports 去 update。&lt;/p&gt;
&lt;h3 id="freebsd-安裝步驟"&gt;FreeBSD 安裝步驟&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# cd /usr/ports/devel/php-xdebug
# make install clean&lt;/pre&gt; 設定 
&lt;p&gt;&lt;strong&gt;&lt;span style="color:green"&gt;/usr/local/etc/php/extensions.ini&lt;/span&gt;&lt;/strong&gt; 檔案後面加入&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;extension=xdebug.so&lt;/pre&gt; 設定 
&lt;p&gt;&lt;strong&gt;&lt;span style="color:green"&gt;/usr/local/etc/php/php.ini&lt;/span&gt;&lt;/strong&gt; 檔案後面加入&lt;/p&gt;</description></item><item><title>busybox iptunnel 噴出錯誤訊息</title><link>https://blog.wu-boy.com/2011/05/busybox-iptunnel-%E5%99%B4%E5%87%BA%E9%8C%AF%E8%AA%A4%E8%A8%8A%E6%81%AF/</link><pubDate>Thu, 26 May 2011 06:42:49 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/05/busybox-iptunnel-%E5%99%B4%E5%87%BA%E9%8C%AF%E8%AA%A4%E8%A8%8A%E6%81%AF/</guid><description>&lt;p&gt;最近在弄新案子，用的是 &lt;a href="http://www.qca.qualcomm.com/"&gt;Atheros&lt;/a&gt; solution (被&lt;a href="http://www.qca.qualcomm.com/"&gt;高通&lt;/a&gt;買下)，發現 SDK 裡面已經有更新到 &lt;a href="http://www.busybox.net/"&gt;Busybox&lt;/a&gt; 1.15，由於在建 ipv6 tunnel 時候必須用到 ip 這指令，當然必須支援 iptunnel，當我把 busybox 選項打開就噴出底下錯誤訊息:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;busybox-1.01/networking/libiproute/libiproute.a(iptunnel.o):iptunnel.c:(.text+0x574): more undefined references to `__cpu_to_be16&amp;rsquo; follow 在 Google 大神指示下找到&lt;a href="http://groups.google.com/group/linux.debian.user.german/browse_thread/thread/76cd0c6ff94af074"&gt;一篇答案&lt;/a&gt; 修改 networking/libiproute/iptunnel.c&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#include &lt;asm/types.h&gt; 
# 後面加上 
#include &lt;asm/byteorder.h&gt;&lt;/pre&gt;</description></item><item><title>加速開發 CSS 工具: Sass</title><link>https://blog.wu-boy.com/2011/05/%E5%8A%A0%E9%80%9F%E9%96%8B%E7%99%BC-css-%E5%B7%A5%E5%85%B7-sass/</link><pubDate>Thu, 26 May 2011 04:02:24 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/05/%E5%8A%A0%E9%80%9F%E9%96%8B%E7%99%BC-css-%E5%B7%A5%E5%85%B7-sass/</guid><description>&lt;p&gt;從來沒想過在開發 Web 網站過程，CSS Style 還可以程式化，設定變數來控制 CSS，今天來介紹一套用 command line 來轉換 CSS 的 Web Framework Plugin: &lt;a href="http://sass-lang.com/"&gt;SASS&lt;/a&gt; (Sassy CSS)，可以參考 SASS 的 &lt;a href="http://sass-lang.com/docs/yardoc/file.SASS_CHANGELOG.html"&gt;Change log&lt;/a&gt; 版本差異，目前最新版本 3.0 以後開始支援 CSS3 做開發，底下先來介紹如何安裝: 作者是在 Ubuntu 10.10 的環境下安裝，利用 apt 方式先將環境需要的軟體安裝好&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# 安裝 Ruby 環境
 $ sudo apt-get install ruby
 $ sudo apt-get install rake
 $ sudo apt-get install rubygems&lt;/pre&gt; Ruby 的安裝只需要一行指令 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;gem install sass&lt;/pre&gt; 另外也可以透過 git 方式來安裝 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;git clone git://github.com/nex3/sass.git
cd sass
rake install
&lt;/pre&gt; 安裝好就會 bin 目錄多出了 sass sass-convert scss 3個指令，如何轉換呢？也相當容易 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;mv style.css style.scss 
sass --watch style.scss:style.css&lt;/pre&gt; style.scss 是您寫的 SASS CSS 檔案 style.css 是您要輸出的檔案名稱 至於如何撰寫 Sass 語法，就請大家參考
&lt;p&gt;&lt;a href="http://sass-lang.com/tutorial.html"&gt;線上手冊&lt;/a&gt;，文件非常清楚，相信很容易看的懂&lt;/p&gt;</description></item><item><title>版本控制 version control git clean 使用時機</title><link>https://blog.wu-boy.com/2011/05/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6-version-control-git-clean-%E4%BD%BF%E7%94%A8%E6%99%82%E6%A9%9F/</link><pubDate>Fri, 20 May 2011 04:55:17 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/05/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6-version-control-git-clean-%E4%BD%BF%E7%94%A8%E6%99%82%E6%A9%9F/</guid><description>&lt;p&gt;在做公司的每一個案子，我都會使用 &lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt; 來做版本控制，雖然公司只有用 svn 控管，但是只要網路掛掉，就不能做任何事情了，更不用說 svn Server 掛點，因為 git 開 branch 免錢，因此每當我拿到新案子就按照 &lt;a href="http://blog.wu-boy.com/2011/03/git-%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6-branch-model-%E5%88%86%E6%94%AF%E6%A8%A1%E7%B5%84%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%B4%B9/"&gt;Git 版本控制 branch model 分支模組基本介紹&lt;/a&gt; 開了固定幾個 branch，由於剛開始 git init 沒有把 .gitignore 寫好，所以 commit 了一堆 *.o 或者是 *.ko 類似的檔案，我用了 git rm &amp;ndash;cached 方式砍了，結果在切換 branch 的時候出現底下錯誤訊息:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;error: Untracked working tree file &amp;lsquo;XXXXXXXX&amp;rsquo; would be overwritten by merge. 這是因為當你 &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-rm.html"&gt;git rm &amp;ndash;cached&lt;/a&gt; 檔案之後，切換 branch 時候會遇到衝突，本來的 master 分支還是存在這些檔案阿，因此這時候就要靠 &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-clean.html"&gt;git clean&lt;/a&gt; 來清掉移除檔案，可以利用 git help clean 來查看使用手冊。 Ref: &lt;a href="http://stackoverflow.com/questions/1125968/force-git-to-overwrite-local-files-on-pull"&gt;Force git to overwrite local files on pull.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Plurk API 2.0 beta 出來了 (OAuth Core 1.0a)</title><link>https://blog.wu-boy.com/2011/05/plurk-api-2-0-beta-%E5%87%BA%E4%BE%86%E4%BA%86-oauth-core-1-0a/</link><pubDate>Thu, 19 May 2011 04:01:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/05/plurk-api-2-0-beta-%E5%87%BA%E4%BE%86%E4%BA%86-oauth-core-1-0a/</guid><description>&lt;p&gt;之前 &lt;a href="http://www.plurk.com"&gt;Plurk&lt;/a&gt; 剛推出 &lt;a href="http://www.plurk.com/API/"&gt;API&lt;/a&gt; 讓大家可以使用，當時蠻多使用者相繼推出各式語言的支援，像是 &lt;a href="http://code.google.com/p/php-plurk-api/"&gt;php-plurk-api&lt;/a&gt;: PHP implementation，而我也將此程式改寫到 &lt;a href="https://github.com/appleboy/CodeIgniter-Plurk-API"&gt;CodeIgniter-Plurk-API&lt;/a&gt;，然而現在官方又推出了 &lt;a href="http://www.plurk.com/API/2/"&gt;Plurk API 2.0 beta&lt;/a&gt;，不同的是 2.0 用了 &lt;a href="http://zh.wikipedia.org/wiki/OAuth"&gt;OAuth&lt;/a&gt; 保護個人隱私，它提供了標準讓開發者可以利用 OAuth 實做任何 application，噗浪官網也希望各位開發者可以儘快將 API 轉成 2.0，當然也是要額外&lt;a href="http://www.plurk.com/PlurkApp/register"&gt;註冊 Plurk App&lt;/a&gt;。 底下幾點是 API 2.0 跟原來 API 的差異處:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Plurk API 2.0 不需要登入作認證，然而原來的 API 是基於 session base 做開發&lt;/li&gt;
&lt;li&gt;網址改變，用 &lt;strong&gt;&lt;span style="color:green"&gt;&lt;a href="http://www.plurk.com/APP/"&gt;http://www.plurk.com/APP/&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt; 取代原來的 &lt;strong&gt;&lt;span style="color:green"&gt;&lt;a href="http://www.plurk.com/API/"&gt;http://www.plurk.com/API/&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;現在每個 Plurk API 2.0 請求都會按照 OAuth Core 1.0a 標準&lt;/li&gt;
&lt;li&gt;所有 input/output 參數跟原來都是一樣，只是現在不需要 api_key 在參數里面 大家註冊之後，可以拿到一組 App Key，就可以開始使用了 ^^&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>快速安裝 Amazon EC2 LAMP 環境 (EC2 Console)</title><link>https://blog.wu-boy.com/2011/05/%E5%BF%AB%E9%80%9F%E5%AE%89%E8%A3%9D-amazon-ec2-lamp-%E7%92%B0%E5%A2%83-ec2-console/</link><pubDate>Tue, 17 May 2011 11:07:05 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/05/%E5%BF%AB%E9%80%9F%E5%AE%89%E8%A3%9D-amazon-ec2-lamp-%E7%92%B0%E5%A2%83-ec2-console/</guid><description>&lt;p&gt;已經紅了一陣子的 &lt;a href="http://aws.amazon.com"&gt;Amazon 雲端服務&lt;/a&gt;，本篇來介紹如何使用 &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt; Linux 安裝 LAMP (Linux Apache MySQL PHP) 環境，衝著 Amazon 推出的新玩家註冊開始為期**&lt;span style="color:red"&gt;一年的免費&lt;/span&gt;**，當然也是有一些限制條件，可以參考 &lt;a href="http://aws.amazon.com/ec2/pricing/"&gt;EC 2 收費標準及介紹&lt;/a&gt;，底下這圖片就是一年內免費的方案，其實對於剛學習 Linux 的玩家而言相當足夠。 &lt;a href="https://www.flickr.com/photos/appleboy/5729812694/" title="AWS Free Usage Tier by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm6.static.flickr.com/5128/5729812694_77b4940d79.jpg?resize=500%2C288&amp;#038;ssl=1" alt="AWS Free Usage Tier" data-recalc-dims="1" /&gt;&lt;/a&gt; 如何設定及註冊 Amazon EC2 可以參考底下連結教學： &lt;a href="http://blog.soft.idv.tw/?p=823"&gt;什麼是雲端服務？阿正老師教你免費玩Amazon EC2雲端主機！(上篇)&lt;/a&gt; &lt;a href="http://blog.soft.idv.tw/?p=824"&gt;阿正老師教你免費玩Amazon EC2雲端主機(下篇)：主機實戰篇&lt;/a&gt; 看完這兩篇大概對於 Amazon 有一定程度的瞭解，接下來就是如何進入玩家們所安裝好的 Amazon Linux 主機，由於 EC 2 的服務主機會常常自動更新 IP，剛開始可以到 Console 看到底下 public DNS: &lt;a href="https://www.flickr.com/photos/appleboy/5729910002/" title="AWS Management Console by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm6.static.flickr.com/5190/5729910002_489d759885.jpg?resize=500%2C196&amp;#038;ssl=1" alt="AWS Management Console" data-recalc-dims="1" /&gt;&lt;/a&gt; 不過這 DNS IP 都會常常更新，所以剛開始都要常常來這邊看，玩家們可以用剛剛註冊此機器的 mykey.pem 透過 ssh 的方式登入機器，底下是在 Ubuntu 的操作&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;1. 先設定檔案權限，請將檔案權限改成 400
chmod 400 mykey.pem
2. 透過 ssh 軟體 pietty (上面阿正老師連結有教學)或 Linux ssh 指令
ssh -i mykey.pem ec2-user@ec2-XXXXXX.compute-1.amazonaws.com
&lt;/pre&gt; 進去主機之後就是一般的 Linux 操作，可以參考 
&lt;p&gt;&lt;a href="http://linux.vbird.org/"&gt;鳥哥的Linux 私房菜&lt;/a&gt;，當然我想玩家們都會發現一直透過 mykey.pem 登入會有點麻煩，而且假設 pem 檔案消失，又要去 Console 申請一次，所以底下教大家如何不必透過 mykey.pem 方式登入，其實也很容易，就是修改 &lt;span style="color:green"&gt;&lt;strong&gt;/etc/ssh/sshd_config&lt;/strong&gt;&lt;/span&gt;。&lt;/p&gt;</description></item><item><title>PHP curl error: SSL certificate problem, verify that the CA cert is OK</title><link>https://blog.wu-boy.com/2011/05/php-curl-error-ssl-certificate-problem-verify-that-the-ca-cert-is-ok/</link><pubDate>Mon, 16 May 2011 03:46:18 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/05/php-curl-error-ssl-certificate-problem-verify-that-the-ca-cert-is-ok/</guid><description>&lt;p&gt;之前在 &lt;a href="http://www.codeigniter.org.tw/"&gt;CodeIgniter&lt;/a&gt; 寫了 &lt;a href="https://github.com/appleboy/CodeIgniter-Google-URL-Shortener-API"&gt;CodeIgniter-Google-URL-Shortener-API&lt;/a&gt; 縮短網址的 &lt;a href="http://code.google.com/intl/zh-TW/apis/urlshortener/overview.html"&gt;goo.gl API Library&lt;/a&gt;，也在&lt;a href="http://codeigniter.com/forums/viewthread/181379/"&gt;國外 CodeIgniter 論壇發表了一篇&lt;/a&gt;，不過在論壇有人回覆安裝好之後不能使用，會直接噴出底下錯誤訊息:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Severity: Notice Message: Trying to get property of non-object Filename: controllers/google_url.php Line Number: 24 之後我在 Windows 利用 &lt;a href="http://www.appservnetwork.com/"&gt;Appserv&lt;/a&gt; 架設好這環境，發現是同樣問題，但是在 &lt;a href="http://www.FreeBSD.org"&gt;FreeBSD&lt;/a&gt; 跟 &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; 上面都不會出現這錯誤訊息，接著在程式馬上面看看 curl 吐出什麼資料:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Curl error: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 把這錯誤訊息拿去 Google 發現到這篇解法 &lt;a href="http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html"&gt;Curl: SSL certificate problem, verify that the CA cert is OK&lt;/a&gt;，只要跳過驗證憑證就可以了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);&lt;/pre&gt; 可以參考 
&lt;p&gt;&lt;a href="http://php.net"&gt;PHP&lt;/a&gt; 官方 &lt;a href="http://php.net/manual/en/function.curl-setopt.php"&gt;curl_setop&lt;/a&gt;t 的設定說明。&lt;/p&gt;</description></item><item><title>在 Ubuntu 底下快速安裝 CakePHP Framework 環境</title><link>https://blog.wu-boy.com/2011/05/%E5%9C%A8-ubuntu-%E5%BA%95%E4%B8%8B%E5%BF%AB%E9%80%9F%E5%AE%89%E8%A3%9D-cakephp-framework-%E7%92%B0%E5%A2%83/</link><pubDate>Wed, 11 May 2011 12:51:38 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/05/%E5%9C%A8-ubuntu-%E5%BA%95%E4%B8%8B%E5%BF%AB%E9%80%9F%E5%AE%89%E8%A3%9D-cakephp-framework-%E7%92%B0%E5%A2%83/</guid><description>&lt;p&gt;最近因為別的專案用到 &lt;a href="http://cakephp.org/"&gt;CakePHP&lt;/a&gt; 這套 PHP Framwork，剛好有這機會來學習 CakePHP，目前已經 Release 到 &lt;a href="http://bakery.cakephp.org/articles/markstory/2011/03/20/cakephp_1_3_8_and_1_2_10_released"&gt;1.3.8 &amp;amp; 1.2.10 Stable&lt;/a&gt;，本篇紀錄如何在 Ubuntu 10.10 安裝 1.3.8 版本，本人不推薦用 2.0， 因為踩到很多雷阿，大家可以到 &lt;a href="https://github.com/cakephp/cakephp/downloads"&gt;CakePHP GitHub&lt;/a&gt; 找尋自己想要的版本，安裝環境如下:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ubunut 10.10 32 Desktop 版本 Apache/2.2.16 (Ubuntu) PHP 5.3.3-1ubuntu9.5 with Suhosin-Patch (cli) MySQL 5.1.49 1. 先下載 &lt;a href="https://github.com/cakephp/cakephp/zipball/1.3.8"&gt;1.3.8&lt;/a&gt; 版本 2. 解壓縮到 &lt;strong&gt;&lt;span style="color:green"&gt;/var/www&lt;/span&gt;&lt;/strong&gt; 底下 3. 設定 apache virtual host 複製 virtual host 設定檔&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;cp /etc/apache2/sites-available/default /etc/apache2/sites-available/cakephp&lt;/pre&gt; 修改設定檔 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;ServerName cakephp.localhost
 DocumentRoot /var/www/cakephp/app/webroot
 &lt;Directory /var/www/cakephp/app/webroot&gt;
 Options All
 AllowOverride All
 Order allow,deny
 allow from all
 &lt;/Directory&gt;&lt;/pre&gt; 4. 啟動 apache virtual host 跟 mod_rewrite 模組 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;a2enmod rewrite
a2ensite cakephp
&lt;/pre&gt; ServerName 部份可以自己亂取，之後到 
&lt;p&gt;&lt;span style="color:green"&gt;&lt;strong&gt;/etc/hosts&lt;/strong&gt;&lt;/span&gt; 裡面加入 127.0.0.1 就可以了 5. 將 &lt;strong&gt;&lt;span style="color:green"&gt;app/tmp&lt;/span&gt;&lt;/strong&gt; 目錄改成 apache 使用者，這樣確定該目錄可以寫入 大致上就這樣完成了，可以參考 &lt;a href="http://book.cakephp.org/"&gt;CakePHP 線上手冊&lt;/a&gt;&lt;/p&gt;</description></item><item><title>CodeIgniter 1.7.x vs 2.0.x 的改變及新增功能</title><link>https://blog.wu-boy.com/2011/05/codeigniter-1-7-x-vs-2-0-x-%E7%9A%84%E6%94%B9%E8%AE%8A%E5%8F%8A%E6%96%B0%E5%A2%9E%E5%8A%9F%E8%83%BD/</link><pubDate>Wed, 04 May 2011 03:17:52 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/05/codeigniter-1-7-x-vs-2-0-x-%E7%9A%84%E6%94%B9%E8%AE%8A%E5%8F%8A%E6%96%B0%E5%A2%9E%E5%8A%9F%E8%83%BD/</guid><description>&lt;p&gt;&lt;a href="http://codeigniter.com/"&gt;CodeIgniter&lt;/a&gt; 2.0.x 已經 Release 一段時間了，去年的 &lt;a href="http://cicon2010.com/"&gt;2010 CodeIgniter Conference&lt;/a&gt; 會議上一些國外講者分享了 2.0 的改變及新功能，底下這投影片個人覺得還不錯，點出了升級步驟及 2.0 新功能介紹，大家可以參考看看&lt;/p&gt;
&lt;iframe src="//www.slideshare.net/slideshow/embed_code/key/4ZJiL0DctRt4F7" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen&gt; &lt;/iframe&gt;
&lt;p&gt;&lt;a href="http://cicon2011.com/"&gt;2011 CodeIgniter Conference&lt;/a&gt; 將會在紐約舉行，大家可以敬請期待。&lt;/p&gt;</description></item><item><title>svn 恢復略過衝突檔案 (conflict file)</title><link>https://blog.wu-boy.com/2011/05/svn-%E6%81%A2%E5%BE%A9%E7%95%A5%E9%81%8E%E8%A1%9D%E7%AA%81%E6%AA%94%E6%A1%88-conflict-file/</link><pubDate>Wed, 04 May 2011 02:27:58 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/05/svn-%E6%81%A2%E5%BE%A9%E7%95%A5%E9%81%8E%E8%A1%9D%E7%AA%81%E6%AA%94%E6%A1%88-conflict-file/</guid><description>&lt;p&gt;當我們利用 svn up 更新程式碼，如果遇到修改相同檔案的相同地方，就會發生衝突 (conflict) 此時就必須修改或者是略過，當選擇略過此檔案就會出現底下訊息&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Skipped &amp;rsquo;lib/logs/logDB.txt&amp;rsquo; Skipped &amp;rsquo;lib/confs/Conf.php&amp;rsquo; At revision 912. Summary of conflicts: Skipped paths: 2 之後怎麼用 svn up 更新檔案，都會因此被略過，那該怎麼恢復被略過檔案的狀態，讓它們可以繼續被更新呢？網路上找到一篇 &lt;a href="http://little418.com/2009/05/svn-local-obstruction-incoming-add-upon-merge.html"&gt;svn local obstruction, incoming add upon merge&lt;/a&gt; 解法，用 &lt;span style="color:green"&gt;&lt;strong&gt;svn resolve&lt;/strong&gt;&lt;/span&gt; 來解決問題，只要針對該檔案打入底下指令即可&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;svn resolve --accept working lib/confs/Conf.php
svn resolve --accept working lib/logs/logDB.txt&lt;/pre&gt;</description></item><item><title>在 Ubuntu 安裝或升級 Git 版本控制的3種方法</title><link>https://blog.wu-boy.com/2011/04/%E5%9C%A8-ubuntu-%E5%AE%89%E8%A3%9D%E6%88%96%E5%8D%87%E7%B4%9A-git-%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6%E7%9A%843%E7%A8%AE%E6%96%B9%E6%B3%95/</link><pubDate>Wed, 27 Apr 2011 11:41:38 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/04/%E5%9C%A8-ubuntu-%E5%AE%89%E8%A3%9D%E6%88%96%E5%8D%87%E7%B4%9A-git-%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6%E7%9A%843%E7%A8%AE%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;&lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; 是目前還蠻 popular 的一套版本控制軟體，很多公司及大小型專案都用 g是it 來控管流程，或者是搭配 &lt;a href="http://www.redmine.org/"&gt;redmine&lt;/a&gt; 專案管理，然而 git 大家都會想到 &lt;a href="https://github.com/"&gt;github&lt;/a&gt; 這個儲存空間，免費註冊就有 300MB 的空間讓大家使用，如果對於 git 的使用方式，我推薦一個非常好的網站，就 &lt;a href="http://evgeny-goldin.com/wiki/Git"&gt;git wiki&lt;/a&gt;，這網站不只是教你 git 指令應用，還收集了很多&lt;a href="http://evgeny-goldin.com/wiki/Git#Docs"&gt;不錯的網站&lt;/a&gt;，底下介紹三種 git 的安裝方式：&lt;/p&gt;
&lt;h3 id="1-ubuntu-底下就用-apt-get-指令"&gt;1. Ubuntu 底下就用 apt-get 指令&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# git core
apt-get -y install git-core git-doc git-gui gitk&lt;/pre&gt; 如果你有用 Ubuntu 介面，就可以安裝 git-gui 跟 gitk 還不錯 
&lt;h3 id="2-下載-git-source-打包檔並且編譯"&gt;2. 下載 Git Source 打包檔，並且編譯&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;apt-get install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev
wget http://kernel.org/pub/software/scm/git/git-1.7.5.tar.gz
tar -zxvf git-1.7.5.tar.gz
cd git-1.7.5
make prefix=/usr/local all
sudo make prefix=/usr/local install&lt;/pre&gt;
&lt;h3 id="3-用-git-clone-來安裝"&gt;3. 用 git clone 來安裝&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;sudo apt-get install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev
git clone git://git.kernel.org/pub/scm/git/git.git
cd git
git checkout v1.7.5
make prefix=/usr/local all
sudo make prefix=/usr/local install&lt;/pre&gt; 可以參考 
&lt;p&gt;&lt;a href="http://git.kernel.org/?p=git/git.git;a=tags"&gt;http://git.kernel.org/?p=git/git.git;a=tags&lt;/a&gt; 來選擇 checkout 編譯版本。 如果很要求版本最新的話，個人推薦方法 3 啦，另外推薦 &lt;a href="http://marklodato.github.com/visual-git-guide/index-en.html"&gt;A Visual Git Reference&lt;/a&gt; 這圖文並茂的網站，建議可以先看這裡的圖來瞭解 git 是如何運作的，這樣比較好上手喔 ^^&lt;/p&gt;</description></item><item><title>解決在 Ubuntu Terminal 底下 git diff 沒有輸出結果 10.10</title><link>https://blog.wu-boy.com/2011/04/%E8%A7%A3%E6%B1%BA%E5%9C%A8-ubuntu-terminal-%E5%BA%95%E4%B8%8B-git-diff-%E6%B2%92%E6%9C%89%E8%BC%B8%E5%87%BA%E7%B5%90%E6%9E%9C-10-10/</link><pubDate>Tue, 19 Apr 2011 12:35:52 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/04/%E8%A7%A3%E6%B1%BA%E5%9C%A8-ubuntu-terminal-%E5%BA%95%E4%B8%8B-git-diff-%E6%B2%92%E6%9C%89%E8%BC%B8%E5%87%BA%E7%B5%90%E6%9E%9C-10-10/</guid><description>&lt;p&gt;自從把筆電安裝成 &lt;a href="http://www.ubuntu-tw.org/"&gt;Ubuntu 10.10 maverick&lt;/a&gt; 後，把所有 &lt;a href="http://github.com" target="_blank"&gt;github&lt;/a&gt; 上面程式碼都用 &lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt; clone 下來，最近遇到一個非常奇怪的問題，那就是修改檔案之後，正常來講，可以用 git diff 來查看修改過的程式碼，但是非常奇怪的事情就發生了，『完全沒有輸出』，後來在網路上找到一篇解法 &lt;a href="http://git.661346.n2.nabble.com/git-diff-shows-no-output-td5444443.html"&gt;git diff shows no output&lt;/a&gt;，原來是 $LESS 這個環境變數搞的鬼，其實可以用 &lt;span style="color:green"&gt;&lt;strong&gt;git diff | cat&lt;/strong&gt;&lt;/span&gt; 方式看到 diff 結果。 我們打開 .bashrc 發現底下設定&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;export EDITOR="vim"
export GIT_PAGER="less"
export LESS="-XEfmrSw"
export PAGER="most"&lt;/pre&gt; 重點就在於 $LESS 必須加上 
&lt;p&gt;&lt;span style="color:red"&gt;&lt;strong&gt;-X&lt;/strong&gt;&lt;/span&gt;，並且請裝上 most 這指令&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;apt-get install most&lt;/pre&gt;</description></item><item><title>你不可不知的 JSON 基本介紹</title><link>https://blog.wu-boy.com/2011/04/%E4%BD%A0%E4%B8%8D%E5%8F%AF%E4%B8%8D%E7%9F%A5%E7%9A%84-json-%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%B4%B9/</link><pubDate>Sun, 17 Apr 2011 06:56:53 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/04/%E4%BD%A0%E4%B8%8D%E5%8F%AF%E4%B8%8D%E7%9F%A5%E7%9A%84-json-%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%B4%B9/</guid><description>&lt;p&gt;還不知道 &lt;a href="http://www.json.org/"&gt;JSON&lt;/a&gt; 是什麼嘛？本篇教學會帶您瞭解 JSON 在網站上的應用，以及運作流程跟使用 &lt;a href="http://www.php.net"&gt;PHP&lt;/a&gt; 和 &lt;a href="http://zh.wikipedia.org/zh-hant/JavaScript"&gt;JavaScript&lt;/a&gt; 來處理 JSON。假如您現在的工作就是網站設計師，相信一定聽過 JSON，但是什麼是 JSON，它能夠做什麼，及您能透過它在網站上做到哪些事情呢？&lt;/p&gt;
&lt;p&gt;透過本篇介紹您可以瞭解基本的 JSON，底下會列出本篇會提到的重點：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;什麼是 JSON&lt;/li&gt;
&lt;li&gt;JSON 應用在哪些地方&lt;/li&gt;
&lt;li&gt;如何建立 JSON 字串&lt;/li&gt;
&lt;li&gt;一個簡單的 JSON 範例&lt;/li&gt;
&lt;li&gt;JSON vs XML&lt;/li&gt;
&lt;li&gt;如何透過 PHP 及 JavaScript 使用 JSON&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="什麼是-json"&gt;什麼是 JSON&lt;/h2&gt;
&lt;p&gt;JSON 是個以純文字為基底去儲存和傳送簡單結構資料，你可以透過特定的格式去儲存任何資料(字串,數字,陣列,物件)，也可以透過物件或陣列來傳送較複雜的資料。一旦建立了您的 JSON 資料，就可以非常簡單的跟其他程式溝通或交換資料，因為 JSON 就只是個純文字格式。&lt;/p&gt;
&lt;p&gt;JSON 的優點如下:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;相容性高&lt;/li&gt;
&lt;li&gt;格式容易瞭解，閱讀及修改方便&lt;/li&gt;
&lt;li&gt;支援許多資料格式 (number,string,booleans,nulls,array,associative array)&lt;/li&gt;
&lt;li&gt;許多程式都支援函式庫讀取或修改 JSON 資料&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>CodeIgniter 2.0.X MVC 架構介紹</title><link>https://blog.wu-boy.com/2011/04/codeigniter-2-0-x-mvc-%E6%9E%B6%E6%A7%8B%E4%BB%8B%E7%B4%B9/</link><pubDate>Sat, 16 Apr 2011 10:22:15 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/04/codeigniter-2-0-x-mvc-%E6%9E%B6%E6%A7%8B%E4%BB%8B%E7%B4%B9/</guid><description>&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 
&lt;p&gt;這次受到 &lt;a href="http://www.openfoundry.org/"&gt;OSSF::自由軟體鑄造場(Open Source Software Foundry)&lt;/a&gt; 邀請在高雄講 &lt;a href="http://www.codeigniter.org.tw"&gt;CodeIgniter&lt;/a&gt; 2.0.X 系列講座，一整天的課程，可以參考 &lt;a href="http://www.openfoundry.org/tw/workshop/details/140--php-framework-codeigniter-20"&gt;KaLUG 社群技術分享工作坊 - 快速學習 PHP Framework - CodeIgniter 2.0&lt;/a&gt;，2009 年我也是講了一場&lt;a href="http://blog.wu-boy.com/2009/07/codeigniter-open-source-php-web-framework-%E7%B3%BB%E5%88%97%E8%AC%9B%E5%BA%A7/"&gt;介紹 CodeIgniter 1.7.X 講座&lt;/a&gt;，這次針對於 CodeIgniter 2.0.X 做了詳細介紹，及我們該如何轉換原本網站程式到 CI 上面，學員雖然來的不多，但是我相信大家都有學到這次講課的精華，就是 CodeIgniter MVC 架構，跟如何應用 Controller Model Views 基礎用法，看到大家都很認真學習，還有學員從雲科大到高雄，真的太令我感動了，希望這次議程沒有讓學員們失望，底下附上我的簡報:&lt;/p&gt;
&lt;h2 id="簡報檔"&gt;簡報檔&lt;/h2&gt;
&lt;iframe src="//www.slideshare.net/slideshow/embed_code/key/CxNSbO87WsPGyw" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen&gt; &lt;/iframe&gt; &lt;div style="margin-bottom:5px"&gt; &lt;strong&gt; &lt;a href="//www.slideshare.net/appleboy/codeigniter-20x" title="CodeIgniter 2.0.X" target="_blank"&gt;CodeIgniter 2.0.X&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href="https://www.slideshare.net/appleboy" target="_blank"&gt;Bo-Yi Wu&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;</description></item><item><title>如何建立 Ram Disk 在 Ubuntu 上面</title><link>https://blog.wu-boy.com/2011/04/%E5%A6%82%E4%BD%95%E5%BB%BA%E7%AB%8B-ram-disk-%E5%9C%A8-ubuntu-%E4%B8%8A%E9%9D%A2/</link><pubDate>Thu, 14 Apr 2011 15:54:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/04/%E5%A6%82%E4%BD%95%E5%BB%BA%E7%AB%8B-ram-disk-%E5%9C%A8-ubuntu-%E4%B8%8A%E9%9D%A2/</guid><description>&lt;p&gt;&lt;strong&gt;Update: 此篇文章建立 RAM DISK 還是用原來 3G 記憶體，而不是用 4G 裡面的 1G，感謝&lt;a href="http://profiles.google.com/uijin.tw"&gt;威阿&lt;/a&gt;提醒修正&lt;/strong&gt; 之前拜了一台筆電 &lt;a href="http://www.techbang.com.tw/posts/3108-toshiba-portege-r700-evaluation"&gt;Toshiba Portege R700&lt;/a&gt;，拿到電腦馬上二話不說，灌成 &lt;a href="http://www.ubuntu-tw.org/"&gt;Ubuntu 10.10&lt;/a&gt; 32 位元，但是筆電有 4G 的記憶體，32位元只能支援到 3G，&lt;del datetime="2011-04-15T01:47:52+00:00"&gt;所以剩下 1G 就拿來當作是 Ram Disk，反正不用白不用&lt;/del&gt;，可以把臨時要用且關機不需要的檔案或程式丟到 RAM DISK，如果把 FireFox 的 cache 資料放在裡面應該會蠻快的，底下紀錄如何開機就直接掛上 1G 的 Ram Disk。 兩個步驟就可以了：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;mkdir -p /media/ramdisk
mount -t tmpfs -o size=1024M tmpfs /media/ramdisk&lt;/pre&gt; 把上面寫到 
&lt;p&gt;&lt;strong&gt;&lt;span style="color:green"&gt;/etc/rc.local&lt;/span&gt;&lt;/strong&gt; 檔案，這樣開機就會自動把 RAM Disk 掛上去。&lt;/p&gt;</description></item><item><title>CodeIgniter 2.0.2 Released</title><link>https://blog.wu-boy.com/2011/04/codeigniter-2-0-2-released/</link><pubDate>Mon, 11 Apr 2011 02:39:17 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/04/codeigniter-2-0-2-released/</guid><description>&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 很高興看到 
&lt;p&gt;&lt;a href="http://www.codeigniter.org.tw"&gt;CodeIgniter&lt;/a&gt; 又推出新版 2.0.2 Released，這次升級最主要是針對**&lt;span style="color:red"&gt;安全性的漏洞&lt;/span&gt;**，以及一些 bug 修正，升級步驟也非常簡單，可以參考 &lt;a href="http://www.codeigniter.org.tw/user_guide/installation/upgrade_202.html"&gt;Upgrading from 2.0.1 to 2.0.2&lt;/a&gt;，只要把 Core 核心檔案換掉，還有如果在程式碼有載入 &lt;a href="http://www.codeigniter.org.tw/user_guide/libraries/security.html"&gt;Security Library&lt;/a&gt; 的地方全部取消，看底下： 舉例 Example:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;$this-&gt;load-&gt;library("security");&lt;/pre&gt; 如果程式碼有用到上面部份，請將其拿掉，因為現在系統已經將 Security Library 加入核心一部分提高整個網站安全性。如果要想知道 2.0.2 做了哪些修正，可以參考 
&lt;p&gt;&lt;a href="http://www.codeigniter.org.tw/user_guide/changelog.html#2.0.2"&gt;Change log&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>用 cpanm 安裝 Perl 相依性模組</title><link>https://blog.wu-boy.com/2011/04/%E7%94%A8-cpanm-%E5%AE%89%E8%A3%9D-perl-%E7%9B%B8%E4%BE%9D%E6%80%A7%E6%A8%A1%E7%B5%84/</link><pubDate>Tue, 05 Apr 2011 06:29:15 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/04/%E7%94%A8-cpanm-%E5%AE%89%E8%A3%9D-perl-%E7%9B%B8%E4%BE%9D%E6%80%A7%E6%A8%A1%E7%B5%84/</guid><description>&lt;p&gt;最近在寫 &lt;a href="http://www.perl.org/"&gt;Perl&lt;/a&gt; 爬蟲程式，需要用到短網址 Bitly 的 API，所以找了 &lt;a href="http://search.cpan.org/~pjain/WWW-Shorten-Bitly-1.14/lib/WWW/Shorten/Bitly.pm"&gt;WWW::Shorten::Bitly&lt;/a&gt;，本篇紀錄安裝使用 cpanm 這 Perl 的小工具，此工具不需要任何設定，只要下載到 bin 目錄就可以正成使用了。由於 &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; 沒有包好的 dpkg 可以用，所以才想到用 cpanm。&lt;/p&gt;
&lt;h3 id="安裝-cpanm"&gt;安裝 cpanm&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;mkdir ~/bin
wget --no-check-certificate http://bit.ly/cpanm -O ~/bin/cpanm
chmod +x ~/bin/cpanm&lt;/pre&gt; 或者可以直接安裝到 
&lt;p&gt;&lt;span style="color:green"&gt;&lt;strong&gt;/usr/local/bin/&lt;/strong&gt;&lt;/span&gt; 底下，這樣不用在重新把 PATH 改寫&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;sudo cp ~/bin/cpanm /usr/local/bin/&lt;/pre&gt;
&lt;h3 id="使用-cpanm"&gt;使用 cpanm&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# 安裝 WWW::Shorten::Bitly
cpanm WWW::Shorten::Bitly
# 安裝 distribution path
cpanm MIYAGAWA/Plack-0.99_05.tar.gz
# 從 URL 安裝
cpanm http://example.org/LDS/CGI.pm-3.20.tar.gz
# 安裝本機檔案
cpanm ~/dists/MyCompany-Enterprise-1.00.tar.gz&lt;/pre&gt; 另外介紹幾個 option --sudo 直接用 sudo 方式安裝，也就是 root 啦 --verbose 檢查安裝過程 --notest 不需要測試 --force 強制安裝 --reinstall 重新安裝，假如已經有安裝過的軟體，一樣會 reinstall --installdeps 只安裝相依性軟體 非常簡單吧，這是懶人做法，如果在 
&lt;p&gt;&lt;a href="http://www.FreeBSD.org"&gt;FreeBSD&lt;/a&gt; 直接安裝 &lt;a href="http://www.freebsd.org/ports/index.html"&gt;ports&lt;/a&gt; 就好。&lt;/p&gt;</description></item><item><title>CSS 3 圓角 border-radius 介紹</title><link>https://blog.wu-boy.com/2011/04/css-3-%E5%9C%93%E8%A7%92-border-radius-%E4%BB%8B%E7%B4%B9/</link><pubDate>Sun, 03 Apr 2011 12:29:13 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/04/css-3-%E5%9C%93%E8%A7%92-border-radius-%E4%BB%8B%E7%B4%B9/</guid><description>&lt;p&gt;目前各家瀏覽器分別開始支援 &lt;a href="http://zh.wikipedia.org/wiki/CSS"&gt;CSS3&lt;/a&gt;，現在 MS 瀏覽器系列只有 IE 9 開始支援 CSS3，所以大家還是趕快升級到 &lt;a href="http://www.microsoft.com/taiwan/promo/ie9/"&gt;IE 9.0&lt;/a&gt;，或者是使用 &lt;a href="http://www.google.com/chrome"&gt;Google Chrome&lt;/a&gt;，&lt;a href="http://moztw.org/"&gt;FireFox 4.0&lt;/a&gt; 吧，以前還沒有 CSS 3 的時候，圓角功能都是靠 &lt;a href="http://plugins.jquery.com/"&gt;jQuery Plugin&lt;/a&gt;: &lt;a href="http://jquery.malsup.com/corner/"&gt;Corner&lt;/a&gt;，有了 CSS3 大家就不用這麼麻煩了，一行就可以搞定喔。&lt;/p&gt;
&lt;h3 id="css-border-radius-generator-大家可以參考"&gt;CSS Border Radius Generator 大家可以參考&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://border-radius.com/"&gt;CSS Border Radius Generator&lt;/a&gt; 這網站，只要輸入4個角所需要的圓角半徑，就會自動產生 CSS 3 的語法喔&lt;/p&gt;
&lt;pre class="brush: css; title: ; notranslate" title=""&gt;/* support Safari, Chrome */
-webkit-border-radius: 5px;
/* support firefox */
-moz-border-radius: 5px;
border-radius: 5px;
&lt;/pre&gt; 也可以個別設定角度 右上圓角： 
&lt;pre class="brush: css; title: ; notranslate" title=""&gt;border-topright-radius: 5px; 
-moz-border-topright-radius: 5px; 
-webkit-border-topright-radius: 5px;&lt;/pre&gt; 左上圓角： 
&lt;pre class="brush: css; title: ; notranslate" title=""&gt;border-topleft-radius: 5px; 
-moz-border-topleft-radius: 5px; 
-webkit-border-topleft-radius: 5px;&lt;/pre&gt; 右下圓角： 
&lt;pre class="brush: css; title: ; notranslate" title=""&gt;border-bottomright-radius: 5px; 
-moz-border-bottomright-radius: 5px; 
-webkit-border-bottomright-radius: 5px;&lt;/pre&gt; 左下圓角： 
&lt;pre class="brush: css; title: ; notranslate" title=""&gt;border-bottomleft-radius: 5px; 
-moz-border-bottomleft-radius: 5px; 
-webkit-border-bottomleft-radius: 5px;&lt;/pre&gt; 非常簡單，大家以後不用再自己做圓角的圖，CSS3 一行搞定啦 Ref: 
&lt;p&gt;&lt;a href="http://blog.mukispace.com/css-border-radius/"&gt;css圓角(border-radius)介紹&lt;/a&gt; &lt;a href="http://ant4css.blogspot.com/2009/03/border-radius.html"&gt;螞蟻的 CSS border-radius&lt;/a&gt; &lt;a href="https://developer.mozilla.org/en/CSS/border-radius#Browser_compatibility"&gt;developer mozilla border-radius&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[網站] 好站連結 (八) Android, javascript, CSS, PHP, Perl, FreeBSD, Linux</title><link>https://blog.wu-boy.com/2011/04/%E7%B6%B2%E7%AB%99-%E5%A5%BD%E7%AB%99%E9%80%A3%E7%B5%90-%E5%85%AB-android-javascript-css-php-perl-freebsd-linux/</link><pubDate>Sat, 02 Apr 2011 08:54:18 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/04/%E7%B6%B2%E7%AB%99-%E5%A5%BD%E7%AB%99%E9%80%A3%E7%B5%90-%E5%85%AB-android-javascript-css-php-perl-freebsd-linux/</guid><description>&lt;p&gt;PHP&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://net.tutsplus.com/tutorials/php/9-useful-php-functions-and-features-you-need-to-know/"&gt;9 Useful PHP Functions and Features You Need to Know&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CSS&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.admixweb.com/2010/11/09/tips-to-code-better-css-for-in-your-projects/"&gt;Tips to Code Better CSS in your Projects&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Html5&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://html5boilerplate.com/"&gt;A ROCK-SOLID DEFAULT FOR HTML5 AWESOME( Html5 模板)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://net.tutsplus.com/tutorials/html-css-techniques/the-official-guide-to-html5-boilerplate/?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed:+nettuts+(NETTUTS)"&gt;The Official Guide to HTML5 Boilerplate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://net.tutsplus.com/articles/news/create-a-sticky-note-effect-in-5-easy-steps-with-css3-and-html5/?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed:+nettuts+(NETTUTS)"&gt;Create a Sticky Note Effect in 5 Easy Steps with CSS3 and HTML5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Git:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://notexist.wordpress.com/2009/09/09/git-server-%E7%9A%84%E5%85%A9%E4%B8%89%E4%BA%8B/"&gt;git-server-的兩三事&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://progit.org/book/zh/"&gt;Pro Git - Table of Contents 簡體中文版&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://plog.longwin.com.tw/my_note-unix/2009/05/20/git-learn-test-command-2009"&gt;Git 初學筆記 - 實作測試 | Tsung&amp;rsquo;s Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Javascript:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.tuttoaster.com/learning-javascript-and-dom-with-console/"&gt;Learning JavaScript and DOM with Console&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/cn/web/1008_wangdd_jscodingrule/?ca=drs-tp4608"&gt;淺談 JavaScript 編程語言的編碼規範&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.script-tutorials.com/creating-photo-gallery-using-jquery-and-visuallightbox/"&gt;Creating photo gallery using jQuery and VisualLightBox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.script-tutorials.com/importing-multiple-rss-feeds-using-newswidget-jquery/"&gt;Importing multiple RSS feeds – using newsWidget (jQuery)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.stevesouders.com/blog/2010/12/06/evolution-of-script-loading/"&gt;Evolution of Script Loading&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perfectionkills.com/global-eval-what-are-the-options/?"&gt;Global eval. What are the options?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;FreeBSD:&lt;/p&gt;</description></item><item><title>2011 OSDC Day 1 筆記</title><link>https://blog.wu-boy.com/2011/03/2011-osdc-day-1-%E7%AD%86%E8%A8%98/</link><pubDate>Thu, 31 Mar 2011 12:55:56 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/03/2011-osdc-day-1-%E7%AD%86%E8%A8%98/</guid><description>&lt;p&gt;&lt;strong&gt;Update: 補上 OSDC 紀錄影片 2011.06.26&lt;/strong&gt; 今年很高興可以北上參加 &lt;a href="http://osdc.tw/"&gt;OSDC 2011&lt;/a&gt; (Open Source Developers Conference)，由於之前都在南部唸書及工作，沒有機會北上參加聚會，現在人在新竹，終於有機會可以參加了，雖然早上六點就要起床趕電車了，不過到現場聽課感覺就是不同，也可以認識很多新朋友，底下來紀錄上課筆記&lt;/p&gt;
&lt;h2 id="微軟與-jquery-社群的親密接觸"&gt;微軟與 jQuery 社群的親密接觸&lt;/h2&gt;
&lt;p&gt;講者: &lt;a href="https://profiles.google.com/ericsk/about"&gt;Eric Shangkuan&lt;/a&gt; (Microsoft) Slide: &lt;a href="http://www.slideshare.net/ericsk/microsoft-and-jquery"&gt;微軟與 jQuery 社群的親密接觸&lt;/a&gt; 這是 OSDC 第一場演講，早上九點就開始了，雖然人不多，但是蠻多人還是為了講者而來，首先介紹什麼是 jQuery，以及 jQuery 一些基本用法，像是 CSS selector，如何在 Windows Visual Studio 上面開發 jQuery 及撰寫 plugin 整合進去 ASP.Net，最後介紹三個不錯用的 jQuery Plugin: &lt;a href="http://api.jquery.com/category/plugins/templates/"&gt;Templeate&lt;/a&gt;, &lt;a href="http://api.jquery.com/category/plugins/data-link/"&gt;Datalink&lt;/a&gt;, &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/06/10/jquery-globalization-plugin-from-microsoft.aspx"&gt;Globalzation&lt;/a&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Templeate&lt;/strong&gt;: 這搭配 Facebook api 可以直接做個人頁面，請&lt;a href="http://tutorialzine.com/2011/03/custom-facebook-wall-jquery-graph/"&gt;參考這裡&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Globalzation&lt;/strong&gt;: 前端多國語系實做&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Datalink&lt;/strong&gt;: 可以快速處理 form，利用 object 跟 jQuery 搭配&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果要研究上述三個 jQuery Plugin 可以參考底下: jQuery Datalink: &lt;a href="https://github.com/jquery/jquery-datalink"&gt;https://github.com/jquery/jquery-datalink&lt;/a&gt; jQuery Templeate: &lt;a href="https://github.com/jquery/jquery-tmpl"&gt;https://github.com/jquery/jquery-tmpl&lt;/a&gt; jQuery Globalzation: &lt;a href="https://github.com/jquery/jquery-global"&gt;https://github.com/jquery/jquery-global&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="handlersocket---a-nosql-plugin-for-mysql"&gt;HandlerSocket - A NoSQL plugin for MySQL&lt;/h2&gt;
&lt;p&gt;講者: &lt;a href="http://jnlin.org/"&gt;Jui-Nan Lin&lt;/a&gt; (PIXNET) Slide: &lt;a href="http://www.slideshare.net/jnlin/handlersocket-a-nosql-plugin-for-mysql"&gt;HandlerSocket - A NoSQL plugin for MySQL&lt;/a&gt; 會後有部份聽眾提出了一些問題，PIXNET 也已經回報給 MySQL 請他們修復這些問題，可以參考 &lt;a href="http://blog.gslin.org/"&gt;gslin 大神&lt;/a&gt;回覆的這篇: &lt;a href="http://blog.gslin.org/archives/2011/03/29/2545/mysql-handlersocket-%E7%9A%84%E6%83%85%E6%B3%81"&gt;MySQL HandlerSocket 的情況…&lt;/a&gt;，不過 NoSQL 有個缺點就是沒有帳號密碼，這部份蠻好解覺的，因為 DB 都直接放在後面，前面加上防火牆就好了。&lt;/p&gt;</description></item><item><title>如何使用 PPA 升級 Ubunut Firefox 瀏覽器到 4.0</title><link>https://blog.wu-boy.com/2011/03/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-ppa-%E5%8D%87%E7%B4%9A-ubunut-firefox-%E7%80%8F%E8%A6%BD%E5%99%A8%E5%88%B0-4-0/</link><pubDate>Fri, 25 Mar 2011 05:50:44 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/03/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-ppa-%E5%8D%87%E7%B4%9A-ubunut-firefox-%E7%80%8F%E8%A6%BD%E5%99%A8%E5%88%B0-4-0/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/5557399853/" title="FireFox_4_about by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm6.static.flickr.com/5266/5557399853_16c4b21191.jpg?resize=500%2C309&amp;#038;ssl=1" alt="FireFox_4_about" data-recalc-dims="1" /&gt;&lt;/a&gt; 作者目前使用 &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; 10.10 (maverick) 桌面環境，也是台灣 &lt;a href="http://moztw.org/"&gt;MozTW&lt;/a&gt; 成員之一，這次 &lt;a href="http://www.mozilla.com/en-US/firefox/fx/"&gt;FireFox 4.0 Release&lt;/a&gt; 介面有些改變，使用上來也非常順手，記憶體好像吃的比較少了？(有待商榷)，現在就來升級 FireFox 吧，兩種升級方式，如果不熟悉 Command Line 就用 GUI 升級，另一種升級方式就是用 apt-get upgrade 啦。 如果用 Windows 請到&lt;a href="http://www.mozilla.com/en-US/firefox/all.html"&gt;這裡下載&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="利用-gui-介面升級-install-firefox-4-using-gui-我的環境是英文所以底下寫的是英文安裝方式-按照底下步驟進行"&gt;利用 GUI 介面升級 (Install firefox 4 using GUI) 我的環境是英文，所以底下寫的是英文安裝方式: 按照底下步驟進行&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;Applications &gt; Ubuntu Software Center &gt; Edit &gt; Software Sources &lt;/pre&gt; 之後點選 "Other Software" 選擇左下角 "Add" 按鈕，接著把底下文字輸入 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;ppa:mozillateam/firefox-stable&lt;/pre&gt; 最後到底下升級，就可以開始使用 FireFox 4 了 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;System &gt; Administration &gt; Update Manager&lt;/pre&gt;
&lt;h3 id="文字介面升級-install-firefox-4-using-terminal-只要鍵入三行指令即可"&gt;文字介面升級 (Install firefox 4 using terminal) 只要鍵入三行指令即可&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ sudo add-apt-repository ppa:mozillateam/firefox-stable
$ sudo apt-get update
$ sudo apt-get upgrade&lt;/pre&gt; 沒圖沒真相啦，底下附上桌面截圖 
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/5557399847/" title="firefox_4 by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm6.static.flickr.com/5024/5557399847_7afb451e72.jpg?resize=500%2C313&amp;#038;ssl=1" alt="firefox_4" data-recalc-dims="1" /&gt;&lt;/a&gt; Reference: &lt;a href="http://www.ubuntugeek.com/how-to-install-firefox-4-in-ubuntu-using-ppa.html"&gt;How to install firefox 4 in ubuntu using PPA&lt;/a&gt; &lt;a href="http://www.freegroup.org/2011/03/firefox-4/"&gt;Firefox 4 正式版現已推出，帶給您更棒的網路體驗&lt;/a&gt;&lt;/p&gt;</description></item><item><title>CodeIgniter 2.0.1 Release 發佈了</title><link>https://blog.wu-boy.com/2011/03/codeigniter-2-0-1-release-%E7%99%BC%E4%BD%88%E4%BA%86/</link><pubDate>Sun, 20 Mar 2011 04:44:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/03/codeigniter-2-0-1-release-%E7%99%BC%E4%BD%88%E4%BA%86/</guid><description>&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 很高興可以聽到這消息，那就是 
&lt;p&gt;&lt;a href="http://www.codeigniter.org.tw/blog/codeigniter_2.0.1_released"&gt;CodeIgniter Release 2.0.1&lt;/a&gt; 版本了，原本大家都很擔心為什麼 &lt;a href="http://www.codeigniter.org.tw"&gt;CodeIgniter&lt;/a&gt; 每發佈 Release 版本都要等個好幾個月甚至到半年以上，現在不用這麼久了，因為自從官方新增了 &lt;a href="https://bitbucket.org/ellislab/codeigniter-reactor"&gt;CodeIgniter Reactor&lt;/a&gt; 加速版本開發及修正，所以更多人貢獻了自己的程式碼及回報問題，我相信 CodeIgniter 會越來越好，希望有更多台灣的朋友來使用。 2.0.1 版本新增了 ENVIRONMENT 這環境變數，讓程式開發者可以任意調整環境狀況，最主要是改變 &lt;a href="http://php.net/manual/en/function.error-reporting.php"&gt;PHP error reporting&lt;/a&gt; 狀態:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;/*
 * production =&gt; error_reporting(0)
 * development =&gt; error_reporting(E_ALL)
 */
define('ENVIRONMENT', 'production');&lt;/pre&gt; 當您設定為 production，表示網站不需要任意輸出錯誤訊息，如果調整成 development，系統就會打開全部錯誤訊息，這對開發者相當重要。如果想瞭解更多，請參考 
&lt;p&gt;&lt;a href="http://codeigniter.org.tw/user_guide/general/environments.html"&gt;Handling Multiple Environments&lt;/a&gt;。 歡迎大家下載最新版本: &lt;a href="http://www.codeigniter.org.tw/downloads"&gt;http://www.codeigniter.org.tw/downloads&lt;/a&gt; 如果想加入翻譯團隊，可以參考這裡: &lt;a href="https://github.com/appleboy/PHP-CodeIgniter-Framework-Taiwan"&gt;https://github.com/appleboy/PHP-CodeIgniter-Framework-Taiwan&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Ubuntu (Debian) 架設 apache mpm worker mod_fcgid 筆記</title><link>https://blog.wu-boy.com/2011/03/ubuntu-debian-%E6%9E%B6%E8%A8%AD-apache-mpm-worker-mod_fcgid-%E7%AD%86%E8%A8%98/</link><pubDate>Thu, 17 Mar 2011 03:55:54 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/03/ubuntu-debian-%E6%9E%B6%E8%A8%AD-apache-mpm-worker-mod_fcgid-%E7%AD%86%E8%A8%98/</guid><description>&lt;p&gt;最近想架設 &lt;a href="http://www.redmine.org/"&gt;Redmine&lt;/a&gt; 在 &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; 伺服器上面，架設之前要先搞定 apache 搭配 mpm worker 及 mod_fcgi module，安裝步驟其實不難，就搭配懶人指令 &lt;a href="http://en.wikipedia.org/wiki/Advanced_Packaging_Tool"&gt;apt&lt;/a&gt; 就可以了。&lt;/p&gt;
&lt;h3 id="安裝-apache-mpm-worker-由於怕安裝過程會叫你把-apache2-mpm-worker-移除改裝-apache2-mpm-prefork所以安裝順序上面有些變化請參考底下"&gt;安裝 apache mpm worker 由於怕安裝過程會叫你把 apache2-mpm-worker 移除，改裝 apache2-mpm-prefork，所以安裝順序上面有些變化，請參考底下:&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# 先安裝
$ apt-get install apache2.2-bin apache2.2-common apache2-mpm-worker libapache2-mod-fcgid php5-cli php5-cgi php5-common
#後安裝
$ apt-get install apache2 php5 php5-gd php5-curl&lt;/pre&gt; 至於 PHP 5 套件就看你需要什麼就裝什麼吧，搜尋一下 php5-* 看看，apache 裝好預設看不到 PHP 網頁，也就是認不得 php type，請在 apache config 檔案加入底下</description></item><item><title>[Linux Kernel] 讀取 /proc 底下資料最佳方法: seq_file interface</title><link>https://blog.wu-boy.com/2011/03/linux-kernel-%E8%AE%80%E5%8F%96-proc-%E5%BA%95%E4%B8%8B%E8%B3%87%E6%96%99%E6%9C%80%E4%BD%B3%E6%96%B9%E6%B3%95-seq_file-interface/</link><pubDate>Mon, 14 Mar 2011 11:38:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/03/linux-kernel-%E8%AE%80%E5%8F%96-proc-%E5%BA%95%E4%B8%8B%E8%B3%87%E6%96%99%E6%9C%80%E4%BD%B3%E6%96%B9%E6%B3%95-seq_file-interface/</guid><description>&lt;h3 id="前言-最近在整合公司內部"&gt;前言 最近在整合公司內部&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.atheros.com/"&gt;Atheros&lt;/a&gt;(被&lt;a href="http://www.qualcomm.com/"&gt;高通&lt;/a&gt;買下) 晶片的 Router，從原本 2.6.15 升級到 2.6.34.7，升級過程遇到很多困難，其中一項升級 Wireless Driver 部份，發現在 Kernel Socket 與 User Space 溝通之間出了問題，利用 Ioctl 來取得目前在 AP 上面所有 Client 資料(包含 mac address, 處於 N or G mode&amp;hellip;等)，在 User Space 上會掉資料，後來利用 /proc 底下檔案來跟 User 之間溝通，才沒有發生任何問題，由於輸出的檔案比較多，就偏向用 2.6 Kernel 提供的 &lt;a href="http://lwn.net/Articles/22355/"&gt;seq_file 介面( interface )&lt;/a&gt;建立虛擬檔案 (virtual file) 與 User Space 溝通(此方法為 Alexander Viro 所設計)，此功能其實在 2.4.15 已經實做了，只是在 2.6 版本才被大量使用。 程式設計師可以透過引入 &lt;span style="color:green"&gt;&lt;strong&gt;&amp;lt;linux/seq_file.h&amp;gt;&lt;/strong&gt;&lt;/span&gt; 來實做 seq_file interface，seq_file 最大優勢就是讀取完全沒有4k boundry 的限制，也就是不用管會不會超出 output buffer。&lt;/p&gt;
&lt;h3 id="the-iterator-interface-為了能夠讓-iterator-正常運作我們必須實做-4-個-function-start-next-stop-show跑得過程為-start---show---next---show---next---stop為了方便講解參考"&gt;The iterator interface 為了能夠讓 iterator 正常運作，我們必須實做 4 個 function (start, next, stop, show)，跑得過程為 start -&amp;gt; show -&amp;gt; next -&amp;gt; show -&amp;gt; next -&amp;gt; stop，為了方便講解，參考&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://nano-chicken.blogspot.com/2009/12/linux-modulesiv-seqfile.html"&gt;Linux Kernel（4）- seq_file&lt;/a&gt; 裡面範例如下：&lt;/p&gt;
&lt;pre class="brush: cpp; title: ; notranslate" title=""&gt;#include &lt;linux/init.h&gt;
#include &lt;linux/module.h&gt;
#include &lt;linux/proc_fs.h&gt; /* Necessary because we use proc fs */
#include &lt;linux/seq_file.h&gt; /* for seq_file */
#include &lt;linux/uaccess.h&gt;

MODULE_LICENSE("GPL");

#define MAX_LINE 1000
static uint32_t *lines;

/**
 * seq_start() takes a position as an argument and returns an iterator which
 * will start reading at that position.
 */
static void* seq_start(struct seq_file *s, loff_t *pos)
{
 uint32_t *lines;

 if (*pos &gt;= MAX_LINE) {
 return NULL; // no more data to read
 }

 lines = kzalloc(sizeof(uint32_t), GFP_KERNEL);
 if (!lines) {
 return NULL;
 }

 *lines = *pos + 1;

 return lines;
}

/**
 * move the iterator forward to the next position in the sequence
 */
static void* seq_next(struct seq_file *s, void *v, loff_t *pos)
{
 uint32_t *lines = v;
 *pos = ++(*lines);
 if (*pos &gt;= MAX_LINE) {
 return NULL; // no more data to read
 }
 return lines;
}

/**
 * stop() is called when iteration is complete (clean up)
 */
static void seq_stop(struct seq_file *s, void *v)
{
 kfree(v);
}

/**
 * success return 0, otherwise return error code
 */
static int seq_show(struct seq_file *s, void *v)
{
 seq_printf(s, "Line #%d: This is Brook's demo\n", *((uint32_t*)v));
 return 0;
}

static struct seq_operations seq_ops = {
 .start = seq_start,
 .next = seq_next,
 .stop = seq_stop,
 .show = seq_show
};

static int proc_open(struct inode *inode, struct file *file)
{
 return seq_open(file, &amp;seq_ops);
}

static struct file_operations proc_ops = {
 .owner = THIS_MODULE, // system
 .open = proc_open,
 .read = seq_read, // system
 .llseek = seq_lseek, // system
 .release = seq_release // system
};

static int __init init_modules(void)
{
 struct proc_dir_entry *ent;

 ent = create_proc_entry("brook", 0, NULL);
 if (ent) {
 ent-&gt;proc_fops = &amp;proc_ops;
 }
 return 0;
}

static void __exit exit_modules(void)
{
 if (lines) {
 kfree(lines);
 }
 remove_proc_entry("brook", NULL);
}

module_init(init_modules);
module_exit(exit_modules);&lt;/pre&gt;</description></item><item><title>用 js 或 php 判斷 Android 手機上網</title><link>https://blog.wu-boy.com/2011/03/%E7%94%A8-js-%E6%88%96-php-%E5%88%A4%E6%96%B7-android-%E6%89%8B%E6%A9%9F%E4%B8%8A%E7%B6%B2/</link><pubDate>Sat, 05 Mar 2011 09:18:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/03/%E7%94%A8-js-%E6%88%96-php-%E5%88%A4%E6%96%B7-android-%E6%89%8B%E6%A9%9F%E4%B8%8A%E7%B6%B2/</guid><description>&lt;p&gt;之前寫了一篇 &lt;a href="http://blog.wu-boy.com/2010/10/jquery-%E5%81%B5%E6%B8%AC%E7%80%8F%E8%A6%BD%E5%99%A8%E7%89%88%E6%9C%AC-%E4%BD%9C%E6%A5%AD%E7%B3%BB%E7%B5%B1os-detection/"&gt;jQuery 偵測瀏覽器版本, 作業系統(OS detection)&lt;/a&gt;，這次可以來加上 Android 手機版本，其實就是分析瀏覽器 &lt;a href="http://en.wikipedia.org/wiki/User_agent"&gt;User Agent&lt;/a&gt; 來達到目的，底下分享 PHP 跟 Javascript 作法&lt;/p&gt;
&lt;h3 id="php-方法"&gt;PHP 方法&lt;/h3&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;if(stripos($_SERVER['HTTP_USER_AGENT'],'Android') !== false) 
{
	header('Location: http://android.xxx.com');
	exit();
}&lt;/pre&gt;
&lt;h3 id="javascript-方法"&gt;Javascript 方法&lt;/h3&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;if(navigator.userAgent.match(/Android/i))
{
	window.location = 'http://android.xxx.com';
}&lt;/pre&gt;
&lt;h3 id="apache-htaccess-方法-用"&gt;Apache .htaccess 方法 用&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html"&gt;Apache mod rewrite&lt;/a&gt; 方法&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;RewriteCond %{HTTP_USER_AGENT} ^.*Android.*$
RewriteRule ^(.*)$ http://android.xxx.com [R=301]
&lt;/pre&gt;</description></item><item><title>Git 版本控制 branch model 分支模組基本介紹</title><link>https://blog.wu-boy.com/2011/03/git-%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6-branch-model-%E5%88%86%E6%94%AF%E6%A8%A1%E7%B5%84%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%B4%B9/</link><pubDate>Wed, 02 Mar 2011 04:45:34 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/03/git-%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6-branch-model-%E5%88%86%E6%94%AF%E6%A8%A1%E7%B5%84%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%B4%B9/</guid><description>&lt;p&gt;我相信大家對於 &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; 版本控制不陌生了，Git 最大強項就是可以任意建立 branch，讓您開發程式不需要擔心原本的程式碼會被動到，造成不知道該怎麼恢復原來的狀態。為了不影響產品發展，branch 對於大型工作團隊就顯得更重要了，今天在網路上看到一篇 &lt;a href="http://nvie.com/posts/a-successful-git-branching-model/"&gt;A successful Git branching model&lt;/a&gt; 文章，裡面把 branch 使用方式寫得非常清楚，底下我會透過指令來說明如何使用簡單 branch 指令，當然請大家先去 &lt;a href="https://github.com/"&gt;github&lt;/a&gt; 註冊申請帳號，如果不想申請帳號，也可以自己在 local 端去執行。&lt;/p&gt;
&lt;p&gt;底下所引用的圖片都是經由 &lt;a href="http://nvie.com/posts/a-successful-git-branching-model/"&gt;A successful Git branching model&lt;/a&gt; 文章所提供。&lt;/p&gt;
&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/5488984404/" title="git-flow by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm6.static.flickr.com/5293/5488984404_4f693eec32_z.jpg?resize=480%2C640&amp;#038;ssl=1" alt="git-flow" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;看到這張圖其實就說明了 branch 最重要的精神:『無限建立分支』，大家也不用害怕看不懂這張圖，底下說明 branch 分支狀況&lt;/p&gt;</description></item><item><title>利用 mb_strwidth 取代 mb_strlen 計算 Multi-byte 字數</title><link>https://blog.wu-boy.com/2011/02/%E5%88%A9%E7%94%A8-mb_strwidth-%E5%8F%96%E4%BB%A3-mb_strlen-%E8%A8%88%E7%AE%97-multi-byte-%E5%AD%97%E6%95%B8/</link><pubDate>Sat, 26 Feb 2011 14:18:28 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/02/%E5%88%A9%E7%94%A8-mb_strwidth-%E5%8F%96%E4%BB%A3-mb_strlen-%E8%A8%88%E7%AE%97-multi-byte-%E5%AD%97%E6%95%B8/</guid><description>&lt;p&gt;之前寫了一篇&lt;a href="http://blog.wu-boy.com/2007/05/php-%E5%A6%82%E4%BD%95%E5%88%87%E5%89%B2%E4%B8%AD%E6%96%87%E6%A8%99%E9%A1%8C/"&gt;如何切割中文標題&lt;/a&gt;，裡面計算中文字數，這樣才不會直接切到中文字，但是 &lt;a href="http://tw2.php.net/"&gt;PHP&lt;/a&gt; 有很多函式可以算出字串有多少字元，我們看看底下例子，使用了 &lt;a href="http://tw2.php.net/manual/en/function.strlen.php"&gt;strlen&lt;/a&gt;、&lt;a href="http://tw2.php.net/manual/en/function.mb-strlen.php"&gt;mb_strlen&lt;/a&gt;、&lt;a href="http://php.net/manual/en/function.mb-strwidth.php"&gt;mb_strwidth&lt;/a&gt; 分別下去測試，看看會把中文字算成幾個字元:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;&lt;?php
echo strlen("測試ABC") . "&lt;br /&gt;";
# 輸出 9
echo mb_strlen("測試ABC", 'UTF-8') . "

&lt;br /&gt;";
# 輸出 5
echo mb_strwidth("測試ABC") . "&lt;br /&gt;";
#輸出 7
?&gt;
&lt;/pre&gt; 看到這結果並不意外，大家可以看到 strlen 把中文字元算成3個字元，mb\_strlen 不管是中文還是英文就都算成單一字元，mb\_strwidth 則是把中文算成 2 字元，mb_strwidth 算出來正是我想要的，如果是想要在 Web 上面切割中文，建議大家用 
&lt;p&gt;&lt;a href="http://tw2.php.net/manual/en/function.mb-substr.php"&gt;mb_substr&lt;/a&gt; 即可。因為作者本人在弄跟 BBS 相關技術，所以必須江中文字算成2字元，底下節錄 mb_strwidth 如何算字元長度:&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;Chars	 =&gt; Width
U+0000 - U+0019	=&gt; 0
U+0020 - U+1FFF	=&gt; 1
U+2000 - U+FF60	=&gt; 2
U+FF61 - U+FF9F	=&gt; 1
U+FFA0 -	=&gt; 2&lt;/pre&gt; PS: 測試環境 PHP 5.2.6</description></item><item><title>切換 Ubuntu apt 的 mirror site</title><link>https://blog.wu-boy.com/2011/02/%E5%88%87%E6%8F%9B-ubuntu-apt-%E7%9A%84-mirror-site/</link><pubDate>Tue, 22 Feb 2011 14:30:09 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/02/%E5%88%87%E6%8F%9B-ubuntu-apt-%E7%9A%84-mirror-site/</guid><description>&lt;p&gt;&lt;strong&gt;Update: 國網內部員工建議用 &lt;a href="http://ftp.twaren.net"&gt;http://ftp.twaren.net&lt;/a&gt; 這台&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;最近常常會發生 apt-get update 指令失敗，台大這台 &lt;span style="color:red"&gt;tw.archive.ubuntu.com&lt;/span&gt; 似乎常常掛點，所以網路上找一下其他的 mirror site，看到似乎很多人都在用國網的 Server ( &lt;a href="http://free.nchc.org.tw"&gt;http://free.nchc.org.tw&lt;/a&gt; )，要換的話，請更改 &lt;code&gt;/etc/apt/sources.list&lt;/code&gt;，將全部 tw.archive.ubuntu.com 都取代成 free.nchc.org.tw，其實還有另一個 domain 就是 opensource.nchc.org.tw，這些都可以用，沒有 apt 的 &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; 或 &lt;a href="http://www.debian.org/"&gt;Debian&lt;/a&gt; 簡直就不是 Server 了&amp;hellip;XD&lt;/p&gt;</description></item><item><title>WordPress plugin 加強網址 SEO</title><link>https://blog.wu-boy.com/2011/02/wordpress-plugin-seo/</link><pubDate>Mon, 21 Feb 2011 04:42:34 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/02/wordpress-plugin-seo/</guid><description>&lt;p&gt;由於網站 &lt;a href="http://en.wikipedia.org/wiki/Search_engine_optimization"&gt;SEO&lt;/a&gt; 在大家心中都是非常重要，現在製作網站也都考慮了很多 SEO 的問題，其中一個功能就是可不可以自訂網址，Wordpress 很早之前就支援了此功能，站長我呢，在創站的時候使用 &lt;span style="color:green"&gt;&lt;strong&gt;blog.wu-boy.com/2011/02/17/2542&lt;/strong&gt;&lt;/span&gt;，為了使搜尋引擎更可以快速找到本站，所以打算將網址改成 &lt;strong&gt;&lt;span style="color:green"&gt;blog.wu-boy.com/2011/02/php-codeigniter-google-url-shortener-api-library/&lt;/span&gt;&lt;/strong&gt;，在後台 Permalink Settings 可以自訂部落格網址，將網址格式改成 &lt;span style="color:red"&gt;&lt;strong&gt;/%year%/%monthnum%/%postname%/&lt;/strong&gt;&lt;/span&gt;，可是改了之後，之前搜尋引擎及別人引用的網址就會變成 &lt;strong&gt;&lt;span style="color:red"&gt;404 NOT Found&lt;/span&gt;&lt;/strong&gt;，為瞭解決此問題，必須寫一支 Mapping Url 程式，讓之前的舊網址轉到新網址，剛好在 &lt;a href="http://blog.roga.tw"&gt;Roga Blog&lt;/a&gt; 找到一篇 &lt;a href="http://blog.roga.tw/2011/02/%E5%8A%A0%E5%BC%B7%E9%83%A8%E8%90%BD%E6%A0%BC%E7%9A%84-seo/"&gt;加強部落格的 SEO&lt;/a&gt;，提供了轉換的 plugin，底下是該程式碼:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-15"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-16"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-17"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-18"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-18"&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-19"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-19"&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-20"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-20"&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-21"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-21"&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-22"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-22"&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-23"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-23"&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-24"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-24"&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-25"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-25"&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-26"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-26"&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-27"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-27"&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-28"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-28"&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-29"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-29"&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-30"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-30"&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-31"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-31"&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-32"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-32"&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-33"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-33"&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-34"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-34"&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-35"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-35"&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-36"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-36"&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-37"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-37"&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-38"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-38"&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-39"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-39"&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-40"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-40"&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-41"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-41"&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-42"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-42"&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-43"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-43"&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-44"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-44"&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-45"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-45"&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-46"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-46"&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-47"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-47"&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-48"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-48"&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-49"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-49"&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-50"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-50"&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-51"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-51"&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-52"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-52"&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-53"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-53"&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-54"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-54"&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-55"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-55"&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-56"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-56"&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-57"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-57"&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-58"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-58"&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-59"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-59"&gt;59&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-60"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-60"&gt;60&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;?php
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;Plugin Name: roga&amp;#39;s url hotfix
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;Plugin URI: http://blog.roga.tw/2011/02/%E5%8A%A0%E5%BC%B7%E9%83%A8%E8%90%BD%E6%A0%BC%E7%9A%84-seo/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;Description: redirect http requests.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;Version: 0.1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;Author: roga
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;Author URI: http://blog.roga.tw
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;License: GPL v2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;function&lt;/span&gt; &lt;span style="color:#008b45"&gt;roga_wrap&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#8b008b;font-weight:bold"&gt;GLOBAL&lt;/span&gt; &lt;span style="color:#00688b"&gt;$wpdb&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#00688b"&gt;$request_uri&lt;/span&gt; = getenv(&lt;span style="color:#cd5555"&gt;&amp;#39;REQUEST_URI&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#00688b"&gt;$array&lt;/span&gt; = explode(&lt;span style="color:#cd5555"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;, &lt;span style="color:#00688b"&gt;$request_uri&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#00688b"&gt;$status&lt;/span&gt; = &lt;span style="color:#8b008b;font-weight:bold"&gt;TRUE&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#8b008b;font-weight:bold"&gt;foreach&lt;/span&gt;(&lt;span style="color:#00688b"&gt;$array&lt;/span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;as&lt;/span&gt; &lt;span style="color:#00688b"&gt;$row&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#8b008b;font-weight:bold"&gt;if&lt;/span&gt;( ! is_numeric(&lt;span style="color:#00688b"&gt;$row&lt;/span&gt;) &amp;amp;&amp;amp; ! &lt;span style="color:#8b008b;font-weight:bold"&gt;empty&lt;/span&gt;(&lt;span style="color:#00688b"&gt;$row&lt;/span&gt;)) &lt;span style="color:#00688b"&gt;$status&lt;/span&gt; = &lt;span style="color:#8b008b;font-weight:bold"&gt;FALSE&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#8b008b;font-weight:bold"&gt;if&lt;/span&gt;(count(&lt;span style="color:#00688b"&gt;$array&lt;/span&gt;) != &lt;span style="color:#b452cd"&gt;5&lt;/span&gt; || &lt;span style="color:#00688b"&gt;$status&lt;/span&gt; != &lt;span style="color:#8b008b;font-weight:bold"&gt;TRUE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;NULL&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#00688b"&gt;$post_id&lt;/span&gt; = (int) &lt;span style="color:#00688b"&gt;$array&lt;/span&gt;[&lt;span style="color:#b452cd"&gt;4&lt;/span&gt;]; &lt;span style="color:#228b22"&gt;// http://blog.roga.tw/2011/02/16/2484
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#00688b"&gt;$wp_result&lt;/span&gt; = &lt;span style="color:#00688b"&gt;$wpdb&lt;/span&gt;-&amp;gt;&lt;span style="color:#658b00"&gt;get_row&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;SELECT `post_type`, `post_name`, `post_date` FROM `&lt;/span&gt;&lt;span style="color:#cd5555"&gt;$wpdb-&amp;gt;posts&lt;/span&gt;&lt;span style="color:#cd5555"&gt;` WHERE `ID` = &lt;/span&gt;&lt;span style="color:#cd5555"&gt;$post_id&lt;/span&gt;&lt;span style="color:#cd5555"&gt; &amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#8b008b;font-weight:bold"&gt;if&lt;/span&gt;( ! isset(&lt;span style="color:#00688b"&gt;$wp_result&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;NULL&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#00688b"&gt;$post_type&lt;/span&gt; = &lt;span style="color:#00688b"&gt;$wp_result&lt;/span&gt;-&amp;gt;&lt;span style="color:#658b00"&gt;post_type&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#00688b"&gt;$post_name&lt;/span&gt; = &lt;span style="color:#00688b"&gt;$wp_result&lt;/span&gt;-&amp;gt;&lt;span style="color:#658b00"&gt;post_name&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#00688b"&gt;$post_date&lt;/span&gt; = &lt;span style="color:#00688b"&gt;$wp_result&lt;/span&gt;-&amp;gt;&lt;span style="color:#658b00"&gt;post_date&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#8b008b;font-weight:bold"&gt;if&lt;/span&gt;(&lt;span style="color:#00688b"&gt;$post_type&lt;/span&gt; == &lt;span style="color:#cd5555"&gt;&amp;#39;revision&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;NULL&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#00688b"&gt;$time&lt;/span&gt; = strtotime(&lt;span style="color:#00688b"&gt;$post_date&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#00688b"&gt;$year&lt;/span&gt; = date(&lt;span style="color:#cd5555"&gt;&amp;#39;Y&amp;#39;&lt;/span&gt;, &lt;span style="color:#00688b"&gt;$time&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#00688b"&gt;$month&lt;/span&gt; = date(&lt;span style="color:#cd5555"&gt;&amp;#39;m&amp;#39;&lt;/span&gt;, &lt;span style="color:#00688b"&gt;$time&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#228b22"&gt;// old: /%year%/%monthnum%/%day%/%post_id%
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#228b22"&gt;// new: /%year%/%monthnum%/%postname%/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#00688b"&gt;$new_request_uri&lt;/span&gt; = &lt;span style="color:#cd5555"&gt;&amp;#34;/&lt;/span&gt;&lt;span style="color:#cd5555"&gt;$year&lt;/span&gt;&lt;span style="color:#cd5555"&gt;/&lt;/span&gt;&lt;span style="color:#cd5555"&gt;$month&lt;/span&gt;&lt;span style="color:#cd5555"&gt;/&lt;/span&gt;&lt;span style="color:#cd5555"&gt;$post_name&lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#00688b"&gt;$http_host&lt;/span&gt; = getenv(&lt;span style="color:#cd5555"&gt;&amp;#39;HTTP_HOST&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#00688b"&gt;$logfile&lt;/span&gt; = WP_CONTENT_DIR . &lt;span style="color:#cd5555"&gt;&amp;#34;/cache/wp-roga-redirect.log&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#8b008b;font-weight:bold"&gt;if&lt;/span&gt;(file_exists(&lt;span style="color:#00688b"&gt;$logfile&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		file_put_contents(&lt;span style="color:#00688b"&gt;$logfile&lt;/span&gt;, sprintf(&lt;span style="color:#cd5555"&gt;&amp;#34;[%s] %s -&amp;gt; %s / %s &amp;#34;&lt;/span&gt; . PHP_EOL, date_i18n(&lt;span style="color:#cd5555"&gt;&amp;#34;Y-m-d H:i:s&amp;#34;&lt;/span&gt;), &lt;span style="color:#00688b"&gt;$request_uri&lt;/span&gt;, urldecode(&lt;span style="color:#00688b"&gt;$new_request_uri&lt;/span&gt;), getenv(&lt;span style="color:#cd5555"&gt;&amp;#39;HTTP_USER_AGENT&amp;#39;&lt;/span&gt;)), FILE_APPEND);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	header(&lt;span style="color:#cd5555"&gt;&amp;#34;Status: 301 Moved Permanently&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	header(&lt;span style="color:#cd5555"&gt;&amp;#34;Location: http:/&lt;/span&gt;&lt;span style="color:#cd5555"&gt;$http_host$new_request_uri&lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#8b008b;font-weight:bold"&gt;exit&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add_action(&lt;span style="color:#cd5555"&gt;&amp;#39;init&amp;#39;&lt;/span&gt;, &lt;span style="color:#cd5555"&gt;&amp;#39;roga_wrap&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>PHP CodeIgniter Google URL Shortener API Library</title><link>https://blog.wu-boy.com/2011/02/php-codeigniter-google-url-shortener-api-library/</link><pubDate>Thu, 17 Feb 2011 05:38:24 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/02/php-codeigniter-google-url-shortener-api-library/</guid><description>&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;h3 id="原由-由於-bbs-的盛行從最早的"&gt;&lt;strong&gt;原由&lt;/strong&gt; 由於 bbs 的盛行，從最早的&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://0rz.tw/"&gt;0rz.tw&lt;/a&gt; 短網址出現，陸陸續續出來很多更好用的網址: &lt;a href="http://tinyurl.com/"&gt;tinyurl.com&lt;/a&gt;, &lt;a href="http://bit.ly/"&gt;bit.ly&lt;/a&gt;，後來 Google 也推出 &lt;a href="http://goo.gl/"&gt;goo.gl&lt;/a&gt; 服務，讓大家可以使用，提供了 &lt;a href="http://code.google.com/intl/zh-TW/apis/urlshortener/"&gt;Google URL Shortener API&lt;/a&gt; 讓程式開發者可以順利使用此 API，當然在使用 API 之前一定要跟 Google 申請一組 API Key，先到 &lt;a href="https://code.google.com/apis/console/"&gt;Google API Console&lt;/a&gt; 申請，Shortener API 的規定每天可以存取 1,000,000 次(100萬)，我想這樣也足夠個人或者是公司使用了，除非真的比這個大量，可以跟 Google 再提出額外申請。&lt;/p&gt;
&lt;h3 id="系統需求"&gt;&lt;strong&gt;系統需求&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bitbucket.org/ellislab/codeigniter-reactor"&gt;CodeIgniter Reactor 版本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PHP 5.2 版本支援 Curl&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="下載檔案-我已經將檔案都放在"&gt;&lt;strong&gt;下載檔案&lt;/strong&gt; 我已經將檔案都放在&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/appleboy/"&gt;github&lt;/a&gt; 上面，為了保持程式最新版本，請大家到底下連結進行下載&lt;/p&gt;
&lt;h2 id="codeigniter-google-url-shortener-api"&gt;&lt;a href="https://github.com/appleboy/CodeIgniter-Google-URL-Shortener-API"&gt;CodeIgniter-Google-URL-Shortener-API&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="系統文件"&gt;&lt;strong&gt;系統文件&lt;/strong&gt;&lt;/h3&gt;
&lt;h5 id="安裝-此安裝檔案共有三個"&gt;安裝 此安裝檔案共有三個:&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;application/config/google_url_api.php&lt;/li&gt;
&lt;li&gt;application/controllers/google_url.php&lt;/li&gt;
&lt;li&gt;application/libraries/Google_url_api.php 請將檔案放入到相對應的 application 目錄即可&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="設定-打開"&gt;設定 打開&lt;/h5&gt;
&lt;p&gt;&lt;span style="color:green"&gt;application/config/google_url_api.php&lt;/span&gt; 檔案，將申請好的 API Key 填入即可&lt;/p&gt;
&lt;h5 id="第一次執行-請在網址列打入"&gt;第一次執行 請在網址列打入&lt;/h5&gt;
&lt;p&gt;&lt;span style="color:green"&gt;http://your_host/index.php/google_url/&lt;/span&gt; 即可，如果有任何問題，可以在 Controller 部份將 debug mode 打開&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;$this-&gt;google_url_api-&gt;enable_debug(TRUE);&lt;/pre&gt;</description></item><item><title>[Linux] 打造 Ubuntu 10.10 嵌入式系統 Embedded System 開發環境</title><link>https://blog.wu-boy.com/2011/02/linux-%E5%BB%BA%E6%A7%8B-ubuntu-10-10-%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%B5%B1%E9%96%8B%E7%99%BC%E7%92%B0%E5%A2%83/</link><pubDate>Thu, 10 Feb 2011 03:50:39 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/02/linux-%E5%BB%BA%E6%A7%8B-ubuntu-10-10-%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%B5%B1%E9%96%8B%E7%99%BC%E7%92%B0%E5%A2%83/</guid><description>&lt;p&gt;作者於公司內部擔任&lt;a href="http://en.wikipedia.org/wiki/Embedded_system"&gt;嵌入式系統&lt;/a&gt;(Embedded System)工程師，由於嵌入式系統開發環境，本 Team 大多是用於 &lt;a href="http://fedoraproject.org/"&gt;Fedora&lt;/a&gt; 作業系統，個人覺得 Fedora 太肥了，所以打造了 &lt;a href="http://www.ubuntu-tw.org/"&gt;Ubuntu&lt;/a&gt; 的環境，針對於各家不同晶片廠商所提供的 &lt;a href="http://en.wikipedia.org/wiki/Toolchain"&gt;ToolChain&lt;/a&gt; 及 Code base 進行編譯，其實也不會很難，修改 Makefile 檔案大致上都可以完成，安裝各種不同版本的 gcc 來搭配各家 &lt;a href="http://en.wikipedia.org/wiki/Vendor"&gt;Vendor&lt;/a&gt; 所提供的環境，底下是剛安裝好 Ubuntu 10.10 版本所需要的一些軟體套件，利用 apt-get 指令就可以安裝完成:&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#!/bin/sh
apt-get update
apt-get -y install openssh-server
apt-get -y install vim
apt-get -y upgrade
apt-get -y install build-essential
apt-get -y install git
apt-get -y install subversion
apt-get -y install bison
apt-get -y install flex
apt-get -y install gettext
apt-get -y install g++
apt-get -y install libncurses5-dev
apt-get -y install libncursesw5-dev
apt-get -y install exuberant-ctags
apt-get -y install sharutils
apt-get -y install help2man
apt-get -y install zlib1g-dev libssl-dev
# for samba 3.0.2 
apt-get -y install gawk 
# for Ralink 
apt-get -y install libid3tag0-dev
apt-get -y install libgdbm-dev&lt;/pre&gt;</description></item><item><title>[新聞] CodeIgniter 發佈 2.0.0 版 Release</title><link>https://blog.wu-boy.com/2011/02/%E6%96%B0%E8%81%9E-codeigniter-%E7%99%BC%E4%BD%88-2-0-0-%E7%89%88-release/</link><pubDate>Tue, 01 Feb 2011 05:49:46 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/02/%E6%96%B0%E8%81%9E-codeigniter-%E7%99%BC%E4%BD%88-2-0-0-%E7%89%88-release/</guid><description>&lt;div style="margin: 0 auto; text-align: center;"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 繼上次 
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/2010/12/07/2488/"&gt;[新聞] PHP Framework Codeigniter 1.7.3 釋出 Release&lt;/a&gt; 之後，&lt;a href="http://codeigniter.com"&gt;官方&lt;/a&gt;終於釋出 2.0 的版本，消息來源: &lt;a href="http://codeigniter.com/news/codeigniter_2.0.0_released/"&gt;http://codeigniter.com/news/codeigniter_2.0.0_released/&lt;/a&gt;。 &lt;a href="http://codeigniter.com/"&gt;CodeIgniter&lt;/a&gt; 發展其實還蠻慢的，所以很多工程師都跳去其他 PHP Framework 了，然而我始終認為 CI 是一套非常好學習的初階 Framework，希望更多人來使用，底下是 2.0 發佈相關新聞，大家可以參考看看到底做了哪些改變以及 Fix Bug list:&lt;/p&gt;</description></item><item><title>[FreeBSD] 利用 fsck 指令修復不正常斷電關機</title><link>https://blog.wu-boy.com/2011/01/freebsd-%E5%88%A9%E7%94%A8-fsck-%E6%8C%87%E4%BB%A4%E4%BF%AE%E5%BE%A9%E4%B8%8D%E6%AD%A3%E5%B8%B8%E6%96%B7%E9%9B%BB%E9%97%9C%E6%A9%9F/</link><pubDate>Wed, 26 Jan 2011 13:49:45 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/01/freebsd-%E5%88%A9%E7%94%A8-fsck-%E6%8C%87%E4%BB%A4%E4%BF%AE%E5%BE%A9%E4%B8%8D%E6%AD%A3%E5%B8%B8%E6%96%B7%E9%9B%BB%E9%97%9C%E6%A9%9F/</guid><description>&lt;p&gt;由於人不在機器前面，所以都請學弟妹幫忙直接拔電在插電，現在問題出來了，完全不能開機了，現在就只能進去單人模式修復，其實修復也非常容易，進入開機選單，選擇 Single user mode 模式，進入之後會直接看到底下訊息提示:&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;enter full pathname of shell or return for :/bin/sh:&lt;/pre&gt; 沒意外就直接按下 Enter 鍵就可以了，由於 fsck 指令在修復過程不可以先 mount 磁區，所以先利用 mount -a 來掛上所有磁區 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# 掛上所有磁區
mount -a
# 顯示硬碟磁區
df -h&lt;/pre&gt; Console 會看到 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;Filesystem Size Used Avail Capacity Mounted on
/dev/da0s1a 496M 341M 115M 75% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/da0s1e 496M 16M 440M 4% /tmp
/dev/da0s1f 24G 15G 6.4G 71% /usr
/dev/da1s1d 33G 22G 8.4G 73% /usr/home
/dev/da0s1d 4.7G 2.5G 1.8G 58% /var&lt;/pre&gt; 如果針對 /dev/da1s1d 做修復，請下底下指令 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;umont /usr/home
fsck -y /dev/da1s1d&lt;/pre&gt; fsck 修復完成會出現底下訊息 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;** /dev/da1s1d
** Last Mounted on
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cyl groups
2 files, 2 used, 506337 free (25 frags, 63289 blocks, 0.0% fragmentation)&lt;/pre&gt; 如果中間有錯誤訊息，就繼續 fsck 步驟，直到修復完成，完成之後下 reboot 重新開機，就可以看到 login as: 可以在 rc.conf 裡面加入兩行設定 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;fsck_y_enable="YES"
background_fsck="YES"&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://hi.baidu.com/hy0kl/blog/item/934e744a49fbe42509f7efb7.html"&gt;[整理] 文件系統修復&lt;/a&gt; &lt;a href="http://bojack.pixnet.net/blog/post/20082824"&gt;【FreeBSD】系統異常關機修複方式 FSCK&lt;/a&gt; &lt;a href="http://bbs.chinaunix.net/viewthread.php?tid=1020897"&gt;[FreeBSD] 請教: FreeBSD斷電後fsck後能不能自動reboot&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Linux] 將 iperf 導入嵌入式系統 Router</title><link>https://blog.wu-boy.com/2011/01/linux-%E5%B0%87-iperf-%E5%B0%8E%E5%85%A5%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%B5%B1-router/</link><pubDate>Thu, 06 Jan 2011 05:51:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2011/01/linux-%E5%B0%87-iperf-%E5%B0%8E%E5%85%A5%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%B5%B1-router/</guid><description>&lt;p&gt;&lt;a href="http://iperf.sourceforge.net/"&gt;iperf&lt;/a&gt; 是一套測試網路效能工具，對於網通廠各工程師們不可或缺的啦，分享如何將 iperf 裝到嵌入式板子，其實在 Porting 每一個工具到板子上的方式差不多，步驟大概是利用 configure file 產生 Makefile，修改 gcc tool chain 路徑，將編譯好的程式放到 root file system，基本上就是如此，目前 iperf 到 2.0.5 版，大家快去&lt;a href="http://sourceforge.net/projects/iperf/"&gt;下載&lt;/a&gt;吧。 直接修改 user space 的 Makefile:&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;cd ./user/apps/iperf-2.0.5; \
./configure --host=mips-linux CC=$(TOOLPREFIX)gcc CXX=$(TOOLPREFIX)g++ --disable-ipv6 \
--prefix=$(shell (pwd -P))/user/apps/iperf-2.0.5/romfs;\
$(MAKE) &amp;&amp; $(MAKE) install ;\&lt;/pre&gt; --host, CC, CXX 請換上 Tool Chain 對應路徑，大致上就可以了，更多設定可以參考 ./configure --help 編譯過程如果出現底下錯誤 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;undefined reference to malloc&lt;/pre&gt; 就將 config.h.in 這檔案，底下整段 mark 起來，就可以編譯過了 
&lt;pre class="brush: cpp; title: ; notranslate" title=""&gt;/* Define to rpl_malloc if the replacement function should be used. */
undef malloc&lt;/pre&gt; ref: 
&lt;p&gt;&lt;a href="http://blog.csdn.net/linux_lyb/archive/2008/12/17/3536911.aspx"&gt;undefined reference to rpl_malloc&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Linux] 釋放虛擬記憶體 (cache)</title><link>https://blog.wu-boy.com/2010/12/linux-%E9%87%8B%E6%94%BE%E8%99%9B%E6%93%AC%E8%A8%98%E6%86%B6%E9%AB%94-cache/</link><pubDate>Mon, 27 Dec 2010 14:29:30 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/12/linux-%E9%87%8B%E6%94%BE%E8%99%9B%E6%93%AC%E8%A8%98%E6%86%B6%E9%AB%94-cache/</guid><description>&lt;p&gt;Linux Kernel 2.6.16 之後加入了 drop caches 的機制，可以讓系統清出多餘的記憶體，這對於搞嵌入式系統相當重要阿，Memory 不夠就不能 upgrade firmware，我們只要利用讀寫 proc 檔案就可以清除 cache 記憶體檔案，底下是操作步驟:&lt;/p&gt;
&lt;h3 id="釋放-pagecache捨棄一般沒使用的-cache"&gt;釋放 pagecache:捨棄一般沒使用的 cache&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;echo 1 &gt; /proc/sys/vm/drop_caches&lt;/pre&gt;
&lt;h3 id="釋放-dentries-and-inodes"&gt;釋放 dentries and inodes&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;echo 2 &gt; /proc/sys/vm/drop_caches&lt;/pre&gt;
&lt;h3 id="釋放-pagecache-dentries-and-inodes"&gt;釋放 pagecache, dentries and inodes&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;echo 3 &gt; /proc/sys/vm/drop_caches&lt;/pre&gt;
&lt;p&gt;Reference: &lt;a href="http://linux-mm.org/Drop_Caches"&gt;Drop Caches&lt;/a&gt; &lt;a href="http://blog.linux.org.tw/~jserv/archives/002039.html"&gt;觀察 Linux 的虛擬記憶體&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Linux] 嵌入式系統不可或缺的工具 – busybox 分析 ifconfig command</title><link>https://blog.wu-boy.com/2010/12/linux-%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%B5%B1%E4%B8%8D%E5%8F%AF%E6%88%96%E7%BC%BA%E7%9A%84%E5%B7%A5%E5%85%B7-busybox-%E5%88%86%E6%9E%90-ifconfig-command/</link><pubDate>Sun, 26 Dec 2010 16:08:07 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/12/linux-%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%B5%B1%E4%B8%8D%E5%8F%AF%E6%88%96%E7%BC%BA%E7%9A%84%E5%B7%A5%E5%85%B7-busybox-%E5%88%86%E6%9E%90-ifconfig-command/</guid><description>&lt;img src="https://i1.wp.com/www.busybox.net/images/busybox1.png?w=840" alt="Busybox" data-recalc-dims="1" /&gt; 
&lt;p&gt;玩過嵌入式系統的使用者，一定都會知道 &lt;a href="http://zh.wikipedia.org/zh-tw/BusyBox"&gt;Busybox&lt;/a&gt;，它提供一些小型 Linux command，方便在 console 端使用，以及一些 C 語言或者是 shell script 裡面，大家都知道 ifconfig 這指令，為了從 Kernel 2.6.15 轉換到 2.6.34.7 版本，原本的 Busybox 版本只有 1.0.1，現在已經到 1.18.1，轉換過程改了 Kernel &lt;a href="http://www.netfilter.org/"&gt;netfilter&lt;/a&gt; 部份，以及 user space 部份 &lt;a href="http://netfilter.org/documentation/HOWTO/netfilter-extensions-HOWTO.html"&gt;iptables extension&lt;/a&gt;。ifconfig 是 Busybox 其中一個指令用來查看目前有多少網路介面(network interface)，來看看他是如何得到這些 interface 資訊，包含介面名稱、type、IP Adress、IP network mask、HW address 等&amp;hellip;.。&lt;/p&gt;
&lt;p&gt;要讀取 interface 相關資訊可以透過兩種方式，一種是讀取 (IPv6 是 /proc/net/if_inet6)，另一種透過 Socket 連接SOCK_DGRAM，最後用 iotcl 方式讀取 interface 相關資料，busybox 會先偵測檔案 /proc/net/dev 是否存在，如果 Kernel 有支援，就會讀取此檔案，如果不存在，則利用 socket 讀取資料。&lt;/p&gt;
&lt;p&gt;if_readlist_proc 函式裡面:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fh = &lt;span style="color:#008b45"&gt;fopen_or_warn&lt;/span&gt;(_PATH_PROCNET_DEV, &lt;span style="color:#cd5555"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;if&lt;/span&gt; (!fh) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#008b45"&gt;if_readconf&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;看一下 /proc/net/dev 內容&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Inter-| Receive | Transmit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lo: &lt;span style="color:#b452cd"&gt;104&lt;/span&gt; &lt;span style="color:#b452cd"&gt;1&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;104&lt;/span&gt; &lt;span style="color:#b452cd"&gt;1&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; eth0:21798505 &lt;span style="color:#b452cd"&gt;51360&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;7693686&lt;/span&gt; &lt;span style="color:#b452cd"&gt;46844&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>[虛擬主機] VPS Linode 贈送 $100,000 美元給新註冊會員</title><link>https://blog.wu-boy.com/2010/12/%E8%99%9B%E6%93%AC%E4%B8%BB%E6%A9%9F-vps-linode-%E8%B4%88%E9%80%81-100000-%E7%BE%8E%E5%85%83%E7%B5%A6%E6%96%B0%E8%A8%BB%E5%86%8A%E6%9C%83%E5%93%A1/</link><pubDate>Sat, 18 Dec 2010 08:01:51 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/12/%E8%99%9B%E6%93%AC%E4%B8%BB%E6%A9%9F-vps-linode-%E8%B4%88%E9%80%81-100000-%E7%BE%8E%E5%85%83%E7%B5%A6%E6%96%B0%E8%A8%BB%E5%86%8A%E6%9C%83%E5%93%A1/</guid><description>&lt;p&gt;昨天在下班前看到 &lt;a href="http://www.linode.com/"&gt;Linode VPS&lt;/a&gt; 送出這個訊息: &lt;a href="http://blog.linode.com/2010/12/15/linode-100000-giveaway/"&gt;Linode $100,000 Giveaway!&lt;/a&gt;，只要在美國時間2010年12月17日早上九點開放名額1000名購買 VPS Linode 任何一種，就可以獨享 100 元美金的優惠，原本我已經有買一台 Linode 512 方案，我現在又加購一台，省下不少錢呢，到月底就不續約，然後再用新帳號繼續使用 Linode 512 服務，沒圖沒證據，底下附上我購買相關圖片 &lt;a href="https://www.flickr.com/photos/appleboy/5270076061/" title="VPS_Linode_01 by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm6.static.flickr.com/5241/5270076061_c1ac9d1064.jpg?resize=500%2C105&amp;#038;ssl=1" alt="VPS_Linode_01" data-recalc-dims="1" /&gt;&lt;/a&gt; 另外 VPS Linode 也提供了香港主機的服務，以及新的 Ubuntu OS 也上線了&lt;/p&gt;
&lt;ul style="list-style-type: disc; color: #555555; margin: 10px;"&gt;
 &lt;li&gt;
 Arch Linux 2010.05 (i386 and x86_64)
 &lt;/li&gt;
 &lt;li&gt;
 CentOS 5.5 (i386 and x86_64)
 &lt;/li&gt;
 &lt;li&gt;
 Debian 5.0 (i386 and x86_64)
 &lt;/li&gt;
 &lt;li&gt;
 Fedora 14 (i386 and x86_64)
 &lt;/li&gt;
 &lt;li&gt;
 Slackware 13.1 (i386 and x86_64)
 &lt;/li&gt;
 &lt;li&gt;
 Ubuntu 10.04 LTS (i386 and x86_64)
 &lt;/li&gt;
 &lt;li&gt;
 Ubuntu 10.10 (i386 and x86_64)
 &lt;/li&gt;
 &lt;li&gt;
 OpenSUSE 11.0
 &lt;/li&gt;
 &lt;li&gt;
 Gentoo 2008.0 (i386 and x86_64)
 &lt;/li&gt;
&lt;/ul&gt; 參考主機放在哪裡比較適合: 
&lt;p&gt;&lt;a href="http://www.linode.com/avail/"&gt;Datacenter Availability&lt;/a&gt;，您可以測試一下每個區域的連線速度 &lt;a href="http://www.linode.com/speedtest"&gt;download speed test&lt;/a&gt;，我利用學網測試了國外的速度，發現速度比較如下: 單檔都是 100 MB:&lt;/p&gt;</description></item><item><title>[資料庫] 如何轉換 Mysql varchar type 到 int type</title><link>https://blog.wu-boy.com/2010/12/%E8%B3%87%E6%96%99%E5%BA%AB-%E5%A6%82%E4%BD%95%E8%BD%89%E6%8F%9B-mysql-varchar-type-%E5%88%B0-int-type/</link><pubDate>Fri, 17 Dec 2010 06:14:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/12/%E8%B3%87%E6%96%99%E5%BA%AB-%E5%A6%82%E4%BD%95%E8%BD%89%E6%8F%9B-mysql-varchar-type-%E5%88%B0-int-type/</guid><description>&lt;p&gt;先來說明為什麼有時候需要用到轉換 varchar 到 int 型態，就是因為 order by 的問題，幫學校修改 Mysql 錯誤排序，前人設計全部都用 varchar 型態去存資料，當然包含了學生入學年度，以前不會遇到這問題，但是到了民國100年，就會發生排序錯誤，底下來講個例子，這樣大家就可以瞭解了。 建立 test 資料表，並且先增兩個欄位分別是 a(&lt;span style="color:red"&gt;&lt;strong&gt;varchar&lt;/strong&gt;&lt;/span&gt;) 跟 b(&lt;span style="color:green"&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;/span&gt;)，個別輸入 100, 90 兩列資料&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;mysql&gt; select * from test;
+------+------+
| a | b |
+------+------+
| 100 | 100 |
| 90 | 90 |
+------+------+
&lt;/pre&gt; 先針對 varchar 排序 order by a DESC 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;mysql&gt; select * from test order by a desc;
+------+------+
| a | b |
+------+------+
| 90 | 90 |
| 100 | 100 |
+------+------+&lt;/pre&gt; 再來針對 int 排序 order by b DESC 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;mysql&gt; select * from test order by b desc;
+------+------+
| a | b |
+------+------+
| 100 | 100 |
| 90 | 90 |
+------+------+&lt;/pre&gt;</description></item><item><title>[C/C++] 判斷檔案是否存在 file_exists</title><link>https://blog.wu-boy.com/2010/12/cc-%E5%88%A4%E6%96%B7%E6%AA%94%E6%A1%88%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8-file_exists/</link><pubDate>Wed, 08 Dec 2010 04:36:48 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/12/cc-%E5%88%A4%E6%96%B7%E6%AA%94%E6%A1%88%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8-file_exists/</guid><description>&lt;p&gt;在 PHP 函式裡面，有直接 file_exists 可以使用，相當方便:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;?php
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;if&lt;/span&gt;(file_exists(&lt;span style="color:#cd5555"&gt;&amp;#34;files/appleboy.c&amp;#34;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#cd5555"&gt;&amp;#34;File found!&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#a61717;background-color:#e3d2d2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在 C 裡面該如何實做？有兩種方式如下:&lt;/p&gt;
&lt;h3 id="1-直接開檔"&gt;1. 直接開檔&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-6"&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-7"&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-8"&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-9"&gt;9&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;bool&lt;/span&gt; &lt;span style="color:#008b45"&gt;file_exists&lt;/span&gt;(&lt;span style="color:#8b008b;font-weight:bold"&gt;const&lt;/span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; * filename)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;if&lt;/span&gt; (FILE * file = &lt;span style="color:#008b45"&gt;fopen&lt;/span&gt;(filename, &lt;span style="color:#cd5555"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;fclose&lt;/span&gt;(file);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#658b00"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#658b00"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;C++ 寫法&lt;/p&gt;</description></item><item><title>[新聞] PHP Framework Codeigniter 1.7.3 釋出 Release</title><link>https://blog.wu-boy.com/2010/12/%E6%96%B0%E8%81%9E-php-framework-codeigniter-1-7-3-%E9%87%8B%E5%87%BA-release/</link><pubDate>Tue, 07 Dec 2010 03:25:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/12/%E6%96%B0%E8%81%9E-php-framework-codeigniter-1-7-3-%E9%87%8B%E5%87%BA-release/</guid><description>&lt;div style="margin: 0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 剛出爐的新聞: 
&lt;p&gt;&lt;a href="http://codeigniter.com/news/codeigniter_1.7.3_released/"&gt;CodeIgniter 1.7.3 Released&lt;/a&gt;，1.7.3 版本的出來，最主要是修正了 Upload class 的安全性，在上一次公告就有 Upload Class Patch，只是 1.7.3 就把它納入進來，還有修正在某些情況下可能出現所有檔案，除此之外沒有其他重大修正了，看起來是為了過不久的 2.0 所準備，目前團隊都朝 2.0 發展了。 原文:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Version 1.7.3 is a security maintenance release, including a previously patched file Upload class, and a new security fix to prevent possible directory traversal in certain circumstances (back ported from a fix made to CodeIgniter 2.0 at BitBucket). There are no other significant changes. 搶先版: &lt;a href="http://www.codeigniter.com/download_files/CodeIgniter_1.7.3.zip"&gt;下載 Codeigniter 1.7.3&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Linux] VirtualBox + Ubuntu 10.10 編譯嵌入式系統</title><link>https://blog.wu-boy.com/2010/12/linux-virtualbox-ubuntu-10-10-%E7%B7%A8%E8%AD%AF%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%B5%B1/</link><pubDate>Sat, 04 Dec 2010 08:45:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/12/linux-virtualbox-ubuntu-10-10-%E7%B7%A8%E8%AD%AF%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%B5%B1/</guid><description>&lt;div style="float:left;margin-right:25px"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/4105985126/" title="vbox_logo2_gradient (by appleboy46)"&gt;&lt;img src="https://i1.wp.com/farm3.static.flickr.com/2522/4105985126_591a664ca4_o.png?resize=140%2C180&amp;#038;ssl=1" title="vbox_logo2_gradient (by appleboy46)" alt="vbox_logo2_gradient (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 最近使用 
&lt;p&gt;&lt;a href="http://www.ubuntu-tw.org/"&gt;Ubuntu&lt;/a&gt; 來編譯嵌入式的環境，由於個人比較不喜歡 &lt;a href="http://fedora.tw/"&gt;Fedora&lt;/a&gt; 的系統，所以自己用了 &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; 來搭配 10.10 的 Ubuntu 系統，在這裡提醒一下，請安裝最新版的 &lt;strong&gt;VirtualBox 3.2.12 for Windows hosts&lt;/strong&gt;，否則在安裝 Ubuntu 之後，繼續安裝 Guest Addition 的時候會當機喔，重開機之後可以看到桌面多出一個光碟，是要您繼續安裝 Additions &lt;a href="https://www.flickr.com/photos/appleboy/5230492977/" title="VirtualBox + Ubuntu by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm6.static.flickr.com/5128/5230492977_ea049b4d9b.jpg?resize=500%2C276&amp;#038;ssl=1" alt="VirtualBox + Ubuntu" data-recalc-dims="1" /&gt;&lt;/a&gt; 切換到該光碟目錄&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;cd /media/VBOXADDITIONS_3.2.12_68302/&lt;/pre&gt; 直接執行 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;sh VBoxLinuxAdditions-x86.run&lt;/pre&gt; 重新開機就完成了，可以直接切換視窗大小...等，編譯 gcc 必須要一些 Cross tool，利用 apt-get 方式安裝: 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;apt-get install build-essential&lt;/pre&gt; 安裝額外 USB 裝置: 視窗上面 Devices -&gt; USB Devices 選擇你要的外接硬碟，會跳出 Windows 安裝額外 Driver 
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/5230491839/" title="VirtualBox + Ubuntu 10.10 by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm6.static.flickr.com/5205/5230491839_0486144dc4.jpg?resize=396%2C308&amp;#038;ssl=1" alt="VirtualBox + Ubuntu 10.10" data-recalc-dims="1" /&gt;&lt;/a&gt; 直接按 Continue Anyway &lt;a href="https://www.flickr.com/photos/appleboy/5230491869/" title="VirtualBox + Ubuntu 10.10 by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm6.static.flickr.com/5123/5230491869_0b65019a5c.jpg?resize=500%2C383&amp;#038;ssl=1" alt="VirtualBox + Ubuntu 10.10" data-recalc-dims="1" /&gt;&lt;/a&gt; 完成 &lt;a href="https://www.flickr.com/photos/appleboy/5230491883/" title="VirtualBox + Ubuntu 10.10 by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm6.static.flickr.com/5082/5230491883_923604958e.jpg?resize=500%2C383&amp;#038;ssl=1" alt="VirtualBox + Ubuntu 10.10" data-recalc-dims="1" /&gt;&lt;/a&gt; 補上 Ubuntu 畫面 &lt;a href="https://www.flickr.com/photos/appleboy/5231085398/" title="VirtualBox + Ubuntu 10.10 by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm6.static.flickr.com/5085/5231085398_0f81217c05.jpg?resize=500%2C304&amp;#038;ssl=1" alt="VirtualBox + Ubuntu 10.10" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Git] 版本控制: 如何使用標籤(Tag)</title><link>https://blog.wu-boy.com/2010/11/git-%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E6%A8%99%E7%B1%A4tag/</link><pubDate>Thu, 18 Nov 2010 14:45:52 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/11/git-%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E6%A8%99%E7%B1%A4tag/</guid><description>&lt;p&gt;&lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; Tag 功能就如同 Cvs Tag 是一樣的，您可以在專案裡面隨意新增 Tag，方便您紀錄訊息，底下一些基本的操作來學習如何使用標籤(Tag)功能(新增標籤、以及各種不同類型標籤之間的差別)。&lt;/p&gt;
&lt;h2 id="列出既有標籤"&gt;列出既有標籤&lt;/h2&gt;
&lt;p&gt;直接使用 git tag 即可&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git tag -l
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;v0.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;v1.3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果整個專案過多 Tag 也可以透過底下方式搜尋出來&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git tag -l &lt;span style="color:#cd5555"&gt;&amp;#39;v1.4.2.*&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;v1.4.2.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;v1.4.2.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;v1.4.2.3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;v1.4.2.4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>CodeIgniter 2.0 發展狀況(現在更棒了) 不再支援 PHP4</title><link>https://blog.wu-boy.com/2010/11/codeigniter-2-0-%E7%99%BC%E5%B1%95%E7%8B%80%E6%B3%81%E7%8F%BE%E5%9C%A8%E6%9B%B4%E6%A3%92%E4%BA%86-%E4%B8%8D%E5%86%8D%E6%94%AF%E6%8F%B4-php4/</link><pubDate>Sat, 13 Nov 2010 10:54:15 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/11/codeigniter-2-0-%E7%99%BC%E5%B1%95%E7%8B%80%E6%B3%81%E7%8F%BE%E5%9C%A8%E6%9B%B4%E6%A3%92%E4%BA%86-%E4%B8%8D%E5%86%8D%E6%94%AF%E6%8F%B4-php4/</guid><description>&lt;div style="margin: 0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://CodeIgniter.com"&gt;CodeIgniter&lt;/a&gt; 在官網正式公告了一篇 2.0 目前的狀況及改善 &lt;a href="http://codeigniter.com/news/codeigniter_2.0_-_now_with_more_awesome/"&gt;CodeIgniter 2.0 - Now with more Awesome&lt;/a&gt;，該篇重點莫過於 &lt;span style="color:red"&gt;&lt;strong&gt;CI 2.0 將不再支援 PHP 4.0 版本&lt;/strong&gt;&lt;/span&gt;了，這是一項重大改變，官方給目前版本取了一個名稱：&lt;span style="color:green"&gt;&lt;strong&gt;CodeIgniterNoPhp4&lt;/strong&gt;&lt;/span&gt;，看到這名字大概就可以知道官方要捨棄 PHP4 了。 自從 CodeIgniter 將所有程式碼搬到 Bitbucket 上面時，就已經宣稱不再 support PHP4，運行了好幾個月，現在以 PHP 5.1.6 來當作開發重點，底下是官方說明 CI 2.0 該注意的地方(其實還有很多地方要注意): 1. 所有類別將以 CI_ 當作前置符號 2. 因為不支援 PHP4 了，所以建構子一律改成 __construct 3. CI_Base 已經被移除，取而代之的是 CI_Controller 4. 之前有提供 &lt;a href="http://www.codeigniter.org.tw/user_guide/helpers/compatibility_helper.html"&gt;Compatibility 輔助函數&lt;/a&gt;，目前已經支援 PHP5 了，故將此移除 開始支援 Email and Validation chaining，看一下範例：&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;$this-&gt;email-&gt;from('your@example.com', 'Your Name')
 -&gt;to('someone@example.com')
 -&gt;cc('another@another-example.com')
 -&gt;bcc('them@their-example.com')
 -&gt;subject('Email Test')
 -&gt;message('Testing the email class.')
 -&gt;send(); &lt;/pre&gt; 最後官方作者有提到一些事情：ExpressionEngine and CodeIgniter 將不再支援 PHP4，PHP4 從2000年出來，到 2007 年結束，重點來了，官方說 
&lt;p&gt;&lt;span style="color:red"&gt;&lt;strong&gt;PHP 4 帶給您的困擾，就如同現在 Internet Explorer 6&lt;/strong&gt;&lt;/span&gt;。 可以參考: &lt;a href="http://bitbucket.org/ellislab/codeigniter/wiki/What's%20New"&gt;What&amp;rsquo;s New in CodeIgniter 2.0&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Upgrading to CodeIgniter 2.0 (升級 CI 到 2.0 版本)</title><link>https://blog.wu-boy.com/2010/10/upgrading-to-codeigniter-2-0-%E5%8D%87%E7%B4%9A-ci-%E5%88%B0-2-0-%E7%89%88%E6%9C%AC/</link><pubDate>Sat, 30 Oct 2010 06:10:49 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/10/upgrading-to-codeigniter-2-0-%E5%8D%87%E7%B4%9A-ci-%E5%88%B0-2-0-%E7%89%88%E6%9C%AC/</guid><description>&lt;p&gt;&lt;strong&gt;2011.02.09 Update: 由於官方推出 2.0.0 的升級方式，請參考&lt;a href="http://www.codeigniter.org.tw/user_guide/installation/upgrade_200.html"&gt;升級版本 1.7.3 到 2.0.0&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div style="margin: 0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 在國外文章看到 
&lt;p&gt;&lt;a href="http://philsturgeon.co.uk"&gt;Phil Sturgeon&lt;/a&gt; 已在今年三月發佈了一篇如何將目前 &lt;a href="http://CodeIgniter.com"&gt;CodeIgniter&lt;/a&gt; 版本升級到 2.0 開發版本，轉移的經驗會在底下做介紹，&lt;a href="http://pyrocms.com/"&gt;PyroCMS&lt;/a&gt; 是該作者產品之一，也升級到 2.0 了，大家可以參考看看。&lt;/p&gt;</description></item><item><title>利用 jQuery 動態改變網站 CSS</title><link>https://blog.wu-boy.com/2010/10/%E5%88%A9%E7%94%A8-jquery-%E5%8B%95%E6%85%8B%E6%94%B9%E8%AE%8A%E7%B6%B2%E7%AB%99-css/</link><pubDate>Thu, 07 Oct 2010 10:05:49 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/10/%E5%88%A9%E7%94%A8-jquery-%E5%8B%95%E6%85%8B%E6%94%B9%E8%AE%8A%E7%B6%B2%E7%AB%99-css/</guid><description>&lt;p&gt;繼前一篇所寫的『&lt;a href="http://blog.wu-boy.com/2010/10/06/2426/"&gt;jQuery 偵測瀏覽器版本, 作業系統(OS detection)&lt;/a&gt;』，當我們遇到手機上網使用者，可以透過 javascript 來判斷目前使用者瀏覽器以及 OS，iPad user agent 如下:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10 我們必須分析上面字串來判斷是否用手機上網，手機網頁跟PC網頁大小一定有所不同，透過底下兩個方法來改變瀏覽器的畫面&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;自動導向手機網頁&lt;/li&gt;
&lt;li&gt;動態改變 CSS 兩個方法都不錯，如果決定使用前者，建議在 Server side 那邊做判斷，底下先列出 javascript, PHP, .htaccess 判斷檢查&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="the-javascript"&gt;The JavaScript&lt;/h3&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;var isiPad = navigator.userAgent.match(/iPad/i) != null;&lt;/pre&gt;
&lt;h3 id="the-php"&gt;The PHP&lt;/h3&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;$isiPad = (bool) strpos($_SERVER['HTTP_USER_AGENT'],'iPad');&lt;/pre&gt;
&lt;h3 id="the-htaccess"&gt;The .htaccess&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;RewriteCond %{HTTP_USER_AGENT} ^.*iPad.*$
RewriteRule ^(.*)$ http://ipad.yourdomain.com [R=301]&lt;/pre&gt; 如果您在前端做判斷，那就使用 jQuery 方式: 
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;if(jQuery){
 jQuery("body").addClass("jq");
}
&lt;/pre&gt; CSS 檔案: 
&lt;pre class="brush: css; title: ; notranslate" title=""&gt;.someClass{
 display:block;
}
.jq .someClass{
 display:none;
}&lt;/pre&gt; 如果不用 jQuery 就使用底下寫法: 
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;document.getElementsByTagName("body")[0].setAttribute("class", "js");&lt;/pre&gt;</description></item><item><title>jQuery 偵測瀏覽器版本, 作業系統(OS detection)</title><link>https://blog.wu-boy.com/2010/10/jquery-%E5%81%B5%E6%B8%AC%E7%80%8F%E8%A6%BD%E5%99%A8%E7%89%88%E6%9C%AC-%E4%BD%9C%E6%A5%AD%E7%B3%BB%E7%B5%B1os-detection/</link><pubDate>Wed, 06 Oct 2010 03:32:46 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/10/jquery-%E5%81%B5%E6%B8%AC%E7%80%8F%E8%A6%BD%E5%99%A8%E7%89%88%E6%9C%AC-%E4%BD%9C%E6%A5%AD%E7%B3%BB%E7%B5%B1os-detection/</guid><description>&lt;p&gt;&lt;strong&gt;update: 簡易版的偵測 iphone/ipod time: 23:32&lt;/strong&gt; &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; 真是一個相當方便的 javascript framework，最近在弄嵌入式系統時候需要去偵測瀏覽器 user agent，就類似下此訊息 &amp;ldquo;&lt;span style="color:red"&gt;&lt;strong&gt;Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)&lt;/strong&gt;&lt;/span&gt;&amp;quot;，原本打算直接用 C 語言內建的 &lt;span style="color:green"&gt;&lt;strong&gt;getenv(&amp;ldquo;HTTP_USER_AGENT&amp;rdquo;)&lt;/strong&gt;&lt;/span&gt; 來做掉，不過後來想想，直接在 UI 那邊，利用 jQuery 來偵測瀏覽器版本、系統OS，這樣就解決了，上網找到有人寫了 &lt;a href="http://www.mengu.net/post/jquery-os-detection"&gt;jQuery browser and OS detection plugin&lt;/a&gt;，利用底下語法就可以知道一些 user agent 裡面的資料&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate" title=""&gt;

 

&lt;div id="os"&gt;
 
&lt;/div&gt;
 

&lt;div id="browser"&gt;
 
&lt;/div&gt;
 

&lt;div id="version"&gt;
 
&lt;/div&gt;
 

&lt;div id="d_width"&gt;
 
&lt;/div&gt;
 

&lt;div id="d_height"&gt;
 
&lt;/div&gt;
 
 
 


&lt;/pre&gt;</description></item><item><title>CodeIgniter 2.0 的發展以及特性改變</title><link>https://blog.wu-boy.com/2010/10/codeigniter-2-0-%E7%9A%84%E7%99%BC%E5%B1%95%E4%BB%A5%E5%8F%8A%E7%89%B9%E6%80%A7%E6%94%B9%E8%AE%8A/</link><pubDate>Sat, 02 Oct 2010 18:20:58 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/10/codeigniter-2-0-%E7%9A%84%E7%99%BC%E5%B1%95%E4%BB%A5%E5%8F%8A%E7%89%B9%E6%80%A7%E6%94%B9%E8%AE%8A/</guid><description>&lt;div style="margin: 0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?w=840&amp;#038;ssl=1" alt="CodeIgniter" data-recalc-dims="1" /&gt;
&lt;/div&gt; 在今年3月11日 
&lt;p&gt;&lt;a href="http://www.ellislab.com/"&gt;EllisLab&lt;/a&gt; 發布了一則&lt;a href="http://codeigniter.com/news/ellislab_moves_to_mercurial_assembla_bitbucket_codeigniter_2.0_baking/"&gt;新訊息&lt;/a&gt;，信件內容大致上提到，他們將會改變程式的版本控制軟體，由原本的 &lt;a href="http://zh.wikipedia.org/zh-tw/Subversion"&gt;Subversion&lt;/a&gt; 轉換到 &lt;a href="http://zh.wikipedia.org/zh-tw/Mercurial"&gt;Mercurial&lt;/a&gt;，CodeIgniter 也選擇了網路知名版本控制 &lt;a href="http://bitbucket.org/"&gt;BitBucket&lt;/a&gt; 網站來存放 CI 的程式碼，CI 團隊目前致力於 CodeIgniter 2.0 作開發，如果要取得程式碼，可以透過&lt;a href="http://bitbucket.org/ellislab/codeigniter/"&gt;這裡&lt;/a&gt;，利用底下指令來取得:&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;hg clone http://bitbucket.org/ellislab/codeigniter&lt;/pre&gt; 這次我們來看看 CodeIgniter 2.0 跟 1.7.2 的版本差異性，雖然說這些不是官方公告的，可是也是改變蠻多的，也許有哪些沒有列到的，之後再慢慢補: 
&lt;p&gt;&lt;strong&gt;&lt;span style="color:red"&gt;1. PHP4 正式掰掰&lt;/span&gt;&lt;/strong&gt; 我想使用 CI 最方便的地方，就是支援 PHP5 &amp;amp; PHP4，方便使用者轉換網站到 CI 上面，現在 CI 2.0 之後將完全不支援 PHP4，一些舊有的函式會在 2.1 之後也不支援 PHP4 了，我想這樣整個 CI 的架構會縮小許多，PHP4 也太多漏洞了，這樣跟 &lt;a href="http://kohanaframework.org/"&gt;Kohana PHP Framwork&lt;/a&gt;(原本從 CI branch 出來的) 一樣只會支援 PHP5 了，效能應該可以增加不少 &lt;strong&gt;&lt;span style="color:red"&gt;2. Scaffolding 正式移除&lt;/span&gt;&lt;/strong&gt; &lt;a href="http://codeigniter.com/user_guide/general/scaffolding.html"&gt;Scaffolding&lt;/a&gt; 對於沒有後台管理的網站，臨時可以修改新增或者是刪除資料庫，不過相當危險，所以 CI 正式移除它，可以看一下&lt;a href="http://www.codeigniter.org.tw/user_guide/general/scaffolding.html"&gt;中文文件&lt;/a&gt;。 &lt;strong&gt;&lt;span style="color:red"&gt;3. 重新命名核心資料夾&lt;/span&gt;&lt;/strong&gt; 將 &lt;span style="color:green"&gt;system/codeigniter/&lt;/span&gt; 名稱變成 &lt;span style="color:green"&gt;system/core/&lt;/span&gt;，核心程式 Router, Loader, Output 等，都可以用 application/core 之中去替換(&lt;a href="http://bitbucket.org/ellislab/codeigniter/src/tip/system/core/"&gt;參考&lt;/a&gt;) &lt;strong&gt;&lt;span style="color:red"&gt;4. system/plugins/ 正式走入歷史&lt;/span&gt;&lt;/strong&gt; 其實本來就沒有必要有這資料夾，這跟 library 有衝突性的，應該說很類似差不多，我真的不知道為什麼會有此資料夾 &lt;strong&gt;&lt;span style="color:red"&gt;5. 正式支援 jQuery&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt; CI 開始支援 &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;，檔案 (system/libraries/javascript/Jquery.php) 這跟 database library 差不多 ，之後陸續更多 javascript 支援(&lt;a href="http://bitbucket.org/ellislab/codeigniter/src/tip/system/libraries/Javascript.php"&gt;參考&lt;/a&gt;) &lt;strong&gt;&lt;span style="color:red"&gt;6. 新增 Drivers Library 功能&lt;/span&gt;&lt;/strong&gt; 這功能在 Kohana 這套 Framework 已經實做出來，這對於 CI 是一個新的 Library，他能擁有一個父類(parent class)，可以很多子類(child classes)，最好的範例就是 JavaScript library，他是一個 parent class，而 jQuery Driver 是 child class，還有其他例子，例如 Cache class 它底下就會有 Memcache, APC 等諸如此類的 Driver。 &lt;strong&gt;&lt;span style="color:red"&gt;7. 新增 /third_party/ 資料夾&lt;/span&gt;&lt;/strong&gt; 在 application 裡面會多出 third_party 資料夾，它會提供最基本的一些資料夾，包含 libraries, models, helpers, 等，架構如下&lt;/p&gt;</description></item><item><title>[CodeIgniter] 簡單擷取 html 原始碼(PHP Simple HTML DOM Parser)</title><link>https://blog.wu-boy.com/2010/09/codeigniter-%E7%B0%A1%E5%96%AE%E6%93%B7%E5%8F%96-html-%E5%8E%9F%E5%A7%8B%E7%A2%BCphp-simple-html-dom-parser/</link><pubDate>Wed, 29 Sep 2010 06:15:28 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/09/codeigniter-%E7%B0%A1%E5%96%AE%E6%93%B7%E5%8F%96-html-%E5%8E%9F%E5%A7%8B%E7%A2%BCphp-simple-html-dom-parser/</guid><description>&lt;p&gt;來介紹一套解析 html 原始碼的 open source: &lt;a href="http://simplehtmldom.sourceforge.net/"&gt;PHP Simple HTML DOM Parser&lt;/a&gt;，這套程式可以讓您任意對原始碼進行擷取操作，抓取一些您需要的資訊，在搭配 preg_match 跟 preg_match_all 函數來使用，使用方法可以參考線上 &lt;a href="http://simplehtmldom.sourceforge.net/manual.htm"&gt;Document&lt;/a&gt;，簡單的範例如下(參考官方網站):&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;// Create a DOM object from a string
$html = str_get_html('Hello!');

// Create a DOM object from a URL
$html = file_get_html('http://www.google.com/');

// Create a DOM object from a HTML file
$html = file_get_html('test.htm');&lt;/pre&gt; 程式提供了三種讓您讀取原始碼，您可以直接丟 $string 或者是網址列，或者是檔案都可以，如果使用過 jQuery 您會發現在擷取 dom 的寫法很像，參考使用說明都寫得很清楚，由於 
&lt;p&gt;&lt;a href="http://codeigniter.com"&gt;CodeIgniter&lt;/a&gt; 沒有此功能，所以我把程式改了一下 porting 到 CI 的 libraries 資料夾裡面，Patch 檔案&lt;/p&gt;</description></item><item><title>ICOS 2010 Introduction to CodeIgniter PHP MVC Framework</title><link>https://blog.wu-boy.com/2010/09/icos-2010-introduction-to-codeigniter-php-mvc-framework/</link><pubDate>Sat, 18 Sep 2010 14:26:05 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/09/icos-2010-introduction-to-codeigniter-php-mvc-framework/</guid><description>&lt;div style="margin: 0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/4928689646/" title="codeigniter_2 by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?resize=137%2C189&amp;#038;ssl=1" alt="codeigniter_2" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 今年 
&lt;p&gt;&lt;a href="http://www.slat.org/icos2010/"&gt;ICOS 2010&lt;/a&gt; 我有講一場『I&lt;a href="http://www.slideshare.net/appleboy/benefit-of-codeigniter-php-framework"&gt;ntroduction to CodeIgniter PHP MVC Framework&lt;/a&gt;』的介紹，本來想藉此機會來宣導 &lt;a href="http://codeigniter.com/"&gt;CodeIgniter&lt;/a&gt; 這套比較少人知道的 Framework，可惜天公不作美，來了一場颱風，以至於2010年9月19號的議程全部取消，不過還是希望自己可以分享跟推廣這套 Framework，將來有機會也想在台北開一場台北的教學課程，就跟去年在高雄跟 &lt;a href="http://www.openfoundry.org/"&gt;OSSF&lt;/a&gt; 合作的『&lt;a href="http://blog.wu-boy.com/2009/07/20/1511/"&gt;Open Source PHP Web Framework 系列講座&lt;/a&gt;』類似，底下是原本預計在19號(星期日)的簡報，希望大家會喜歡&lt;/p&gt;
&lt;div style="width:425px" id="__ss_5229020"&gt;
 &lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/appleboy/benefit-of-codeigniter-php-framework" title="Benefit of CodeIgniter php framework"&gt;Benefit of CodeIgniter php framework&lt;/a&gt;&lt;/strong&gt; 
 &lt;div style="padding:5px 0 12px"&gt;
 View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/appleboy"&gt;Wu Bo-Yi&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt;</description></item><item><title>[C/C++] 將字串轉成 16 進位</title><link>https://blog.wu-boy.com/2010/09/cc-%E5%B0%87%E5%AD%97%E4%B8%B2%E8%BD%89%E6%88%90-16-%E9%80%B2%E4%BD%8D/</link><pubDate>Mon, 13 Sep 2010 03:11:22 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/09/cc-%E5%B0%87%E5%AD%97%E4%B8%B2%E8%BD%89%E6%88%90-16-%E9%80%B2%E4%BD%8D/</guid><description>&lt;p&gt;最近在碰嵌入式系統遇到一個還蠻常見的問題，我要將16進位的字串(例如 AAC2) test 轉成16進位的 unsigned int，讓我可以進行 &amp;amp; | not 一些二進位運算，底下是轉換程式，大家參考看看&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-15"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-16"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-17"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-18"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-18"&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-19"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-19"&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-20"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-20"&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-21"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-21"&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-22"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-22"&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-23"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-23"&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-24"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-24"&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-25"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-25"&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-26"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-26"&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-27"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-27"&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-28"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-28"&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-29"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-29"&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; &lt;span style="color:#008b45"&gt;power&lt;/span&gt;(&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; x,&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; n)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; i;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; num = &lt;span style="color:#b452cd"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;for&lt;/span&gt;(i=&lt;span style="color:#b452cd"&gt;1&lt;/span&gt;;i&amp;lt;=n;i++)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; num*=x;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; num;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; &lt;span style="color:#008b45"&gt;transfer_string_to_hex&lt;/span&gt;(&lt;span style="color:#00688b;font-weight:bold"&gt;unsigned&lt;/span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; *str_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; string[]=&lt;span style="color:#cd5555"&gt;&amp;#34;0123456789ABCDEF&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; number[]={&lt;span style="color:#b452cd"&gt;0&lt;/span&gt;,&lt;span style="color:#b452cd"&gt;1&lt;/span&gt;,&lt;span style="color:#b452cd"&gt;2&lt;/span&gt;,&lt;span style="color:#b452cd"&gt;3&lt;/span&gt;,&lt;span style="color:#b452cd"&gt;4&lt;/span&gt;,&lt;span style="color:#b452cd"&gt;5&lt;/span&gt;,&lt;span style="color:#b452cd"&gt;6&lt;/span&gt;,&lt;span style="color:#b452cd"&gt;7&lt;/span&gt;,&lt;span style="color:#b452cd"&gt;8&lt;/span&gt;,&lt;span style="color:#b452cd"&gt;9&lt;/span&gt;,&lt;span style="color:#b452cd"&gt;10&lt;/span&gt;,&lt;span style="color:#b452cd"&gt;11&lt;/span&gt;,&lt;span style="color:#b452cd"&gt;12&lt;/span&gt;,&lt;span style="color:#b452cd"&gt;13&lt;/span&gt;,&lt;span style="color:#b452cd"&gt;14&lt;/span&gt;,&lt;span style="color:#b452cd"&gt;15&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; i = &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; j = &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; str_number = &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;for&lt;/span&gt;(i=&lt;span style="color:#b452cd"&gt;0&lt;/span&gt;; i&amp;lt;&lt;span style="color:#8b008b;font-weight:bold"&gt;sizeof&lt;/span&gt;(str_name); i++)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;for&lt;/span&gt;(j=&lt;span style="color:#b452cd"&gt;0&lt;/span&gt;; j&amp;lt;&lt;span style="color:#8b008b;font-weight:bold"&gt;sizeof&lt;/span&gt;(string); j++)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;if&lt;/span&gt;(&lt;span style="color:#008b45"&gt;toupper&lt;/span&gt;(str_name&amp;lt;em&amp;gt;&amp;lt;/em&amp;gt;) == string[j])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; str_number += &lt;span style="color:#008b45"&gt;power&lt;/span&gt;(&lt;span style="color:#b452cd"&gt;16&lt;/span&gt;, (&lt;span style="color:#8b008b;font-weight:bold"&gt;sizeof&lt;/span&gt;(str_name)-&lt;span style="color:#b452cd"&gt;1&lt;/span&gt;-i))* number[j];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; str_number;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;由於嵌入式並沒有 &lt;a href="http://www.cplusplus.com/reference/clibrary/cmath/pow/"&gt;pow&lt;/a&gt; 這個函式可以使用，所以自己寫了 power 來取代，我用在偵測網路線是否有插上：&lt;/p&gt;</description></item><item><title>[CodeIgniter] 利用 jQuery 簡易驗證使用者帳號/Email</title><link>https://blog.wu-boy.com/2010/08/codeigniter-%E5%88%A9%E7%94%A8-jquery-%E7%B0%A1%E6%98%93%E9%A9%97%E8%AD%89%E4%BD%BF%E7%94%A8%E8%80%85%E5%B8%B3%E8%99%9Femail/</link><pubDate>Thu, 26 Aug 2010 06:01:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/08/codeigniter-%E5%88%A9%E7%94%A8-jquery-%E7%B0%A1%E6%98%93%E9%A9%97%E8%AD%89%E4%BD%BF%E7%94%A8%E8%80%85%E5%B8%B3%E8%99%9Femail/</guid><description>&lt;div style="margin: 0 auto; width:100%;text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/4928689646/" title="codeigniter_2 by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm5.static.flickr.com/4139/4928689646_4309e16e13_o.png?resize=137%2C189&amp;#038;ssl=1" alt="codeigniter_2" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt; 好久沒寫相關 
&lt;p&gt;&lt;a href="http://CodeIgniter.com"&gt;CodeIgniter&lt;/a&gt; 文章，針對於剛入門 CI 的新手們，此篇教學如何使用 &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; AJAX 搭配 CI 來驗證使用者帳號及相關資訊，本篇教學帶您如何在 CI 中發出 AJAX request 給伺服器端。 請先在網頁 header 自行 include jQuery 檔案，或者可以使用 &lt;a href="http://code.google.com/intl/zh-TW/apis/libraries/devguide.html"&gt;Google AJAX CDN&lt;/a&gt; 方式來讀取，將底下程式碼放到 &lt;/header&gt; 之前：&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;$(document).ready(function() {
 /* 先停止讀取狀態 */
 $('#Loading').hide();

 /* 填寫好 email 欄位，按下 Tab 會進行讀取 */
 $('#email').blur(function(){
 /* 讀取 email 欄位 */
	var a = $("#email").val();
 /* email 正規語法 */
	var filter = /^[a-zA-Z0-9]+[a-zA-Z0-9_.-]+[a-zA-Z0-9_-]+@[a-zA-Z0-9]+[a-zA-Z0-9.-]+[a-zA-Z0-9]+.[a-z]{2,4}$/;
 /* 簡易驗證 email */
	if(filter.test(a)){
 /* 讀取狀態 */
		$('#Loading').show();
 /* AJAX 比對資料庫 */
		$.post("&lt;?php echo base_url()?&gt;controller_name/check_email_availablity", {
			email: $('#email').val()
		}, function(response){
 /* 驗證後讀取 reponse 狀態 */
			$('#Loading').hide();
			setTimeout("finishAjax('Loading', '"+escape(response)+"')", 400);
		});
		return false;
	}
});
&lt;/pre&gt;</description></item><item><title>[Vim] 將 Tab 轉換成 Space</title><link>https://blog.wu-boy.com/2010/08/vim-%E5%B0%87-tab-%E8%BD%89%E6%8F%9B%E6%88%90-space/</link><pubDate>Wed, 25 Aug 2010 04:19:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/08/vim-%E5%B0%87-tab-%E8%BD%89%E6%8F%9B%E6%88%90-space/</guid><description>&lt;p&gt;Update 2010.08.28: &lt;a href="#Pspad"&gt;&lt;strong&gt;Pspad 轉換既有 Tabs to Spaces&lt;/strong&gt;&lt;/a&gt; by &lt;a href="http://bootleq.blogspot.com/"&gt;bootleq&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/4925098933/" title="vim_header by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm5.static.flickr.com/4080/4925098933_f7fb7a1312_o.gif?resize=180%2C45&amp;#038;ssl=1" alt="vim_header" data-recalc-dims="1" /&gt;&lt;/a&gt; 為了統一 Windows 跟 Linux 底下的編輯器在使用 Tab 功能相同，所以調整了 &lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; 及 &lt;a href="http://www.pspad.com/"&gt;Pspad&lt;/a&gt;(我常用編輯器)的設定，底下是針對 Vim 及 Pspad 的解決方法。首先當大家使用 Vim 編輯器撰寫程式，常常會使用 Tab 來縮排程式碼，我們可以使用 &lt;span style="color:green"&gt;&lt;strong&gt;expandtab&lt;/strong&gt;&lt;/span&gt; 來插入空白鍵(Space)取代 Tab:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:set expandtab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;控制插入 Tab 時所需要的空白鍵(Tab)字元數，例如用4個空白鍵取代 Tab:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:set &lt;span style="color:#00688b"&gt;tabstop&lt;/span&gt;=&lt;span style="color:#b452cd"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在我們設定完 &lt;span style="color:green"&gt;&lt;strong&gt;expandtab&lt;/strong&gt;&lt;/span&gt; 之後，所有的 Tab 鍵將會被 Space 所取代，但是原本在檔案文件中的 Tab 將不會改變，為了取代原有的 Tab 到新的設定，我們必須鍵入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:retab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;針對程式縮排所需要的 Space 個數，我們可以使用 &lt;span style="color:green"&gt;&lt;strong&gt;shiftwidth&lt;/strong&gt;&lt;/span&gt; 選項&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:set &lt;span style="color:#00688b"&gt;shiftwidth&lt;/span&gt;=&lt;span style="color:#b452cd"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;底下舉個例子：&lt;/p&gt;</description></item><item><title>Html5 模板架構(Boilerplate)</title><link>https://blog.wu-boy.com/2010/08/html5-%E6%A8%A1%E6%9D%BF%E6%9E%B6%E6%A7%8Bboilerplate/</link><pubDate>Mon, 23 Aug 2010 14:53:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/08/html5-%E6%A8%A1%E6%9D%BF%E6%9E%B6%E6%A7%8Bboilerplate/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/4919688039/" title="HTML5 Boilerplate - A rock-solid default for HTML5 awesome._1282574693481 by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm5.static.flickr.com/4095/4919688039_d7c6e91661.jpg?resize=500%2C209&amp;#038;ssl=1" alt="HTML5 Boilerplate - A rock-solid default for HTML5 awesome._1282574693481" data-recalc-dims="1" /&gt;&lt;/a&gt; 今年在 &lt;a href="http://coscup.org/2010/zh-tw"&gt;COSCUP&lt;/a&gt; 大會上最主流的議題就是 &lt;a href="http://en.wikipedia.org/wiki/HTML5"&gt;Html5&lt;/a&gt;，今天看到一個網站 &lt;a href="http://html5boilerplate.com/"&gt;HTML5 Boilerplate&lt;/a&gt;，這網站提一個全新 html 5 模板，自從離開 Dreamweaver 樣板軟體，利用 &lt;a href="http://www.pspad.com/"&gt;Pspad&lt;/a&gt; 手動撰寫 html，此網站就發揮非常大的用處，提供全新 html，CSS 以及 javascript，支援了底下很多功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;跨瀏覽器 (IE6&amp;hellip;)&lt;/li&gt;
&lt;li&gt;支援多種 html5 Tag&lt;/li&gt;
&lt;li&gt;Compress 和 cache html 檔案&lt;/li&gt;
&lt;li&gt;CSS IE6 , IE7 Hack&lt;/li&gt;
&lt;li&gt;IE6 Png Fix (連這個都幫忙解決了)&lt;/li&gt;
&lt;li&gt;支援 CDN jQuery，避免在 local 端沒讀取到檔案 你還可以根據自己需要的功能做添加或者是減少，CSS reset、跨瀏覽器 CSS、robots.txt、Apache .htaccess cache 壓縮也有支援，如果不需要的功能，也可以參考看看，對於初學者也是非常好的學習例子。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Git 版本控制：利用 git reset 恢復檔案、暫存狀態、commit 訊息</title><link>https://blog.wu-boy.com/2010/08/git-%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6%EF%BC%9A%E5%88%A9%E7%94%A8-git-reset-%E6%81%A2%E5%BE%A9%E6%AA%94%E6%A1%88%E3%80%81%E6%9A%AB%E5%AD%98%E7%8B%80%E6%85%8B%E3%80%81commit-%E8%A8%8A%E6%81%AF/</link><pubDate>Fri, 20 Aug 2010 12:15:50 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/08/git-%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6%EF%BC%9A%E5%88%A9%E7%94%A8-git-reset-%E6%81%A2%E5%BE%A9%E6%AA%94%E6%A1%88%E3%80%81%E6%9A%AB%E5%AD%98%E7%8B%80%E6%85%8B%E3%80%81commit-%E8%A8%8A%E6%81%AF/</guid><description>&lt;p&gt;這次來介紹一下 &lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt; reset 的用法，為什麼會介紹這指令呢？因為今天想要看專案狀態，用 git status 觀看，發現被我玩爛了，所以出現了底下錯誤訊息：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ git status
error: bad index file sha1 signature
fatal: index file corrupt&lt;/pre&gt; 解決此問題非常簡單，要先刪除 index 檔案，請先砍掉 
&lt;p&gt;&lt;span style="color:green"&gt;&lt;strong&gt;.git/index&lt;/strong&gt;&lt;/span&gt;，恢復此 index 請用&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;git reset&lt;/pre&gt; 這行指令相當於 
&lt;p&gt;&lt;span style="color:red"&gt;&lt;strong&gt;git reset &amp;ndash;mixed HEAD&lt;/strong&gt;&lt;/span&gt;，或者是可以用 &lt;span style="color:red"&gt;&lt;strong&gt;git read-tree&lt;/strong&gt;&lt;/span&gt; 來取代 git reset，當然 git reset 不只是有這功能而已，假如您已經建立了 commit 訊息，也可以將此訊息拿掉，重新在 commit，或者是您修改過的檔案在暫存區，git 也可以幫您恢復到未暫存，或者是不想要這次的修改，也可以恢復到未修改的檔案喔。&lt;/p&gt;
&lt;h3 id="取消已經暫存的檔案-假如我們有兩個檔案需要-commit但是不小心按到-git-add--全部加入到暫存區那該怎麼恢復呢"&gt;取消已經暫存的檔案 假如我們有兩個檔案需要 commit，但是不小心按到 git add * 全部加入到暫存區，那該怎麼恢復呢？&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# On branch master
# Changes to be committed:
# (use "git reset HEAD &lt;file&gt;..." to unstage)
#
# modified: Makefile
# modified: user/easy_setup/easysetup.h
#&lt;/pre&gt; 上面是以經在暫存區裡面等待被 commit 檔案(
&lt;p&gt;&lt;span style="color:green"&gt;Changes to be committed&lt;/span&gt;)，大家可以看到括號裡面有提示如何拿掉 (use &amp;ldquo;git reset HEAD &lt;file&gt;&amp;hellip;&amp;rdquo; to unstage)，所以我們下：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;git reset HEAD user/easy_setup/easysetup.h&lt;/pre&gt; 之後會看到 『
&lt;p&gt;&lt;span style="color:red"&gt;user/easy_setup/easysetup.h: locally modified&lt;/span&gt;』此訊息，這時候在用 git status 看狀態&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# On branch master
# Changes to be committed:
# (use "git reset HEAD &lt;file&gt;..." to unstage)
#
# modified: Makefile
#
# Changed but not updated:
# (use "git add &lt;file&gt;..." to update what will be committed)
#
# modified: user/easy_setup/easysetup.h
#&lt;/pre&gt;</description></item><item><title>Git 版本控制: 「You have some suspicious patch lines」</title><link>https://blog.wu-boy.com/2010/08/git-%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6-%E3%80%8Cyou-have-some-suspicious-patch-lines%E3%80%8D/</link><pubDate>Wed, 18 Aug 2010 06:18:11 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/08/git-%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6-%E3%80%8Cyou-have-some-suspicious-patch-lines%E3%80%8D/</guid><description>&lt;p&gt;相信大家對 &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; 並不陌生，這次在升級 &lt;a href="http://Moztw.org"&gt;Moztw&lt;/a&gt; 的&lt;a href="http://forum.moztw.org"&gt;討論區&lt;/a&gt;，從 3.0.5 升級到 3.0.7 p1，過程由其他 Moztw 成員升級，我在將最後程式 commit 到 &lt;a href="http://github.com/"&gt;github&lt;/a&gt;，因為兩個版本差異性很大，所以有新增多個檔案，commit 過程出現了錯誤訊息：「&lt;span style="color:red"&gt;&lt;strong&gt;You have some suspicious patch lines&lt;/strong&gt;&lt;/span&gt;」，這是因為 git 會檢查每行程式碼最後是否有多餘空白或者是 Tab 按鍵，為瞭解決此問題，可以去修改 &lt;span style="color:green"&gt;&lt;strong&gt;.git/hooks/pre-commit&lt;/strong&gt;&lt;/span&gt;，將底下程式碼：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;if (s/^\+//) {
 $lineno++;
 chomp;
 if (/\s$/) {
 bad_line("trailing whitespace", $_);
 }
 if (/^\s* \t/) {
 bad_line("indent SP followed by a TAB", $_);
 }
 if (/^([&lt;&gt;])\1{6} |^={7}$/) {
 bad_line("unresolved merge conflict", $_);
 }
}&lt;/pre&gt; 改成： 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;if (s/^\+//) {
 $lineno++;
 chomp;
# if (/\s$/) {
# bad_line("trailing whitespace", $_);
# }
# if (/^\s* \t/) {
# bad_line("indent SP followed by a TAB", $_);
# }
 if (/^([&lt;&gt;])\1{6} |^={7}$/) {
 bad_line("unresolved merge conflict", $_);
 }
}&lt;/pre&gt; 暫時停止 git 過濾字串，等 commit 完成之後，在將其 unmask 掉。 參考網站： 
&lt;p&gt;&lt;a href="http://www.dont-panic.cc/capi/2007/07/13/git-on-windows-you-have-some-suspicious-patch-lines/"&gt;Git on Windows: 「You have some suspicious patch lines」&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[C/C++] cstring (string.h) 函式：strcat, strncat, strcmp, strncmp</title><link>https://blog.wu-boy.com/2010/08/cc-cstring-string-h-%E5%87%BD%E5%BC%8F%EF%BC%9Astrcat-strncat-strcmp-strncmp/</link><pubDate>Wed, 04 Aug 2010 07:29:46 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/08/cc-cstring-string-h-%E5%87%BD%E5%BC%8F%EF%BC%9Astrcat-strncat-strcmp-strncmp/</guid><description>&lt;h2 id="串接函式-strcat"&gt;串接函式 strcat&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://www.cplusplus.com/reference/clibrary/cstring/strcat/"&gt;strcat&lt;/a&gt; 此函式用來連接兩字串合併成單一字串，直接看底下範例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;/* strcat example */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#include&lt;/span&gt; &lt;span style="color:#1e889b"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#1e889b"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#include&lt;/span&gt; &lt;span style="color:#1e889b"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span style="color:#1e889b"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; &lt;span style="color:#008b45"&gt;main&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; str[&lt;span style="color:#b452cd"&gt;80&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;strcpy&lt;/span&gt; (str,&lt;span style="color:#cd5555"&gt;&amp;#34;these &amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;strcat&lt;/span&gt; (str,&lt;span style="color:#cd5555"&gt;&amp;#34;strings &amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;strcat&lt;/span&gt; (str,&lt;span style="color:#cd5555"&gt;&amp;#34;are &amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;strcat&lt;/span&gt; (str,&lt;span style="color:#cd5555"&gt;&amp;#34;concatenated.&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;puts&lt;/span&gt; (str);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;output:&lt;/p&gt;</description></item><item><title>[C/C++] cstring (string.h) 搜尋函式：strstr, strchr</title><link>https://blog.wu-boy.com/2010/08/cc-cstring-string-h-%E5%87%BD%E5%BC%8F%EF%BC%9Astrstr-strchr/</link><pubDate>Tue, 03 Aug 2010 08:24:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/08/cc-cstring-string-h-%E5%87%BD%E5%BC%8F%EF%BC%9Astrstr-strchr/</guid><description>&lt;p&gt;這次介紹 C 語言常用 string 函式：&lt;a href="http://www.cplusplus.com/reference/clibrary/cstring/strstr/"&gt;strstr&lt;/a&gt;，主要是針對兩個輸入參數做比對，&lt;span style="color:green"&gt;Parameters 1&lt;/span&gt; 是&lt;span style="color:red"&gt;輸入字串&lt;/span&gt;，&lt;span style="color:green"&gt;Parameters 2&lt;/span&gt; 是&lt;span style="color:red"&gt;找尋字串&lt;/span&gt;，strstr 會先將頭一次比對成功的 pointer 回傳，也就是如果要找尋 appleboyappleboy 字串中的 boy，函式會回傳第一次比對成功的 boy pointer，而並非回傳最後一個比對到的，底下是一個參考範例：&lt;/p&gt;
&lt;h2 id="strstr"&gt;strstr&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-15"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;/* strstr example */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#include&lt;/span&gt; &lt;span style="color:#1e889b"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#1e889b"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#include&lt;/span&gt; &lt;span style="color:#1e889b"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span style="color:#1e889b"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; &lt;span style="color:#008b45"&gt;main&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; str[] =&lt;span style="color:#cd5555"&gt;&amp;#34;This is a simple string&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; * pch;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#228b22"&gt;/* 找尋 simple 字串 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pch = &lt;span style="color:#008b45"&gt;strstr&lt;/span&gt; (str,&lt;span style="color:#cd5555"&gt;&amp;#34;simple&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#228b22"&gt;/* 將 simple 換成 sample */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;strncpy&lt;/span&gt; (pch,&lt;span style="color:#cd5555"&gt;&amp;#34;sample&amp;#34;&lt;/span&gt;,&lt;span style="color:#b452cd"&gt;6&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;puts&lt;/span&gt; (str);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;看一下 Kernel 原始檔案，strstr 函式：&lt;/p&gt;</description></item><item><title>[網站] 好站連結 (七) Android, javascript, Css, PHP, Perl, FreeBSD, Linux</title><link>https://blog.wu-boy.com/2010/07/%E7%B6%B2%E7%AB%99-%E5%A5%BD%E7%AB%99%E9%80%A3%E7%B5%90-%E4%B8%83-android-javascript-css-php-perl-freebsd-linux/</link><pubDate>Fri, 30 Jul 2010 14:53:46 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/07/%E7%B6%B2%E7%AB%99-%E5%A5%BD%E7%AB%99%E9%80%A3%E7%B5%90-%E4%B8%83-android-javascript-css-php-perl-freebsd-linux/</guid><description>&lt;p&gt;Windows C#&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://m955.com/wp/archives/174"&gt;C# 比較字串&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/zh-tw/library/fbh501kz%28VS.80%29.aspx"&gt;MSDN 比較字串&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms525985.aspx"&gt;Request.Form Collection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codeproject.com/KB/aspnet/RequestParam.aspx"&gt;Request Query String / Form Parametrs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dotnetperls.com/querystring-net"&gt;ASP.NET QueryString Usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.christopherjason.com/asp-net/using-includes-asp-net/"&gt;Using include files with ASP.NET&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;html&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;[將所有 的內容包到一個&lt;/p&gt;
&lt;div /&gt;
中][7]
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;apache&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://feedproxy.google.com/~r/Bludice/~3/tQrBnQc7cWE/mod_rewrite-htaccess-godaddy"&gt;Fixing mod_rewrite and .htaccess on GoDaddy Hosting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;javascript&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.redredred.com.au/projects/jquery-week-calendar/"&gt;jQuery Week Calendar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.electrictoolbox.com/javascript-reference-parent-window-popup/?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+ElectricToolboxBlog+%28Chris+Hope%27s+LAMP+Blog%29&amp;amp;utm_content=Google+Reader"&gt;Javascript: reference the parent window from a popup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.electrictoolbox.com/jquery-get-set-form-values/"&gt;How to get and set form element values with jQuery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.electrictoolbox.com/check-uncheck-checkbox-jquery/"&gt;How to check and uncheck a checkbox with jQuery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.electrictoolbox.com/loop-parameters-passed-javascript-function/"&gt;Loop through parameters passed to a Javascript function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://c9s.blogspot.com/2009/11/perl-completionvim-now-supports-simple.html"&gt;perl-completion.vim now supports simple context completion.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jquery-howto.blogspot.com/2009/09/get-url-parameters-values-with-jquery.html"&gt;Get URL parameters &amp;amp; values with jQuery&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CSS&lt;/p&gt;</description></item><item><title>[Kernel Driver] 撰寫簡易 Timer 機制</title><link>https://blog.wu-boy.com/2010/07/kernel-driver-%E6%92%B0%E5%AF%AB%E7%B0%A1%E6%98%93-timer-%E6%A9%9F%E5%88%B6/</link><pubDate>Tue, 27 Jul 2010 14:04:30 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/07/kernel-driver-%E6%92%B0%E5%AF%AB%E7%B0%A1%E6%98%93-timer-%E6%A9%9F%E5%88%B6/</guid><description>&lt;p&gt;在底層 Linux Kernel 提供了時序(timing)機制，方便驅動程式設計者所使用，核心是依據硬體發出的『計時器中斷』來追蹤時間的流動狀況。我們可以依據 HZ 的值來設計 Delay 機制，讓驅動程式可以每隔固定一段時間啟動或者是發出訊號，也可以利用 Timer 來讓 LED 閃爍變化，在介紹 Timer API 之前，可以先參考 &lt;a href="http://adrianhuang.blogspot.com/2007/10/linux-kernel-hz-tick-and-jiffies.html"&gt;Linux Kernel: 簡介HZ, tick and jiffies&lt;/a&gt; 這篇文章，瞭解一些相關名詞，舉例：如果想知道一秒後的 jiffies 時間，可以寫成底下：&lt;/p&gt;
&lt;pre class="brush: cpp; title: ; notranslate" title=""&gt;#ifdef CONFIG_BMA150_TIMER
#include &lt;linux/timer.h&gt;
#endif
j = jiffies;
/* 一秒之後 */
stamp_1 = j + HZ;
/* 半秒之後 */
stamp_1 = j + HZ/2; 
/* 20秒之後 */
stamp_1 = j + 20*HZ;&lt;/pre&gt;
&lt;h3 id="timer-api-用法-筆記一下自己在寫-bosch-sensortec-三軸加速偵測器bma150-sensor-driver-的時候遇到底層要回報-input-event-xyz-到"&gt;Timer API 用法 筆記一下自己在寫 BOSCH Sensortec 三軸加速偵測器(BMA150 Sensor) Driver 的時候，遇到底層要回報 input event X,Y,Z 到&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://code.google.com/intl/zh-TW/android/"&gt;Android&lt;/a&gt; HAL(&lt;a href="http://en.wikipedia.org/wiki/Hardware_abstraction_layer"&gt;Hardware abstraction layer&lt;/a&gt;)，所以利用 Timer 的機制定時 report 給 Android。 首先宣告：&lt;/p&gt;</description></item><item><title>[Linux Kernel] 簡單 hello world: License and Module 介紹(part 3)</title><link>https://blog.wu-boy.com/2010/07/linux-kernel-%E7%B0%A1%E5%96%AE-hello-world-license-and-module-%E4%BB%8B%E7%B4%B9part-3/</link><pubDate>Sun, 25 Jul 2010 08:17:52 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/07/linux-kernel-%E7%B0%A1%E5%96%AE-hello-world-license-and-module-%E4%BB%8B%E7%B4%B9part-3/</guid><description>&lt;p&gt;在 Kernel 2.4 或以上版本，在編譯模組完成，要進行 load module 之前，你會發現底下訊息：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# insmod hello-3.o
Warning: loading hello-3.o will taint the kernel: no license
 See http://www.tux.org/lkml/#export-tainted for information about tainted modules&lt;/pre&gt; 很顯然這訊息是要您在 kernel module 裡面加上版權宣告，例如："GPL"，"GPL v2"…等來宣告您的 module 並非 open source，利用 
&lt;p&gt;&lt;strong&gt;&lt;span style="color:green"&gt;MODULE_LICENSE()&lt;/span&gt;&lt;/strong&gt; 巨集來宣告程式 License，同樣的，可以用 &lt;strong&gt;&lt;span style="color:green"&gt;MODULE_DESCRIPTION()&lt;/span&gt;&lt;/strong&gt; 來描述此模組或者是 Driver 的功用跟簡介，以及用 &lt;strong&gt;&lt;span style="color:green"&gt;MODULE_AUTHOR()&lt;/span&gt;&lt;/strong&gt; 來定義此模組作者，這些巨集都可以在 &lt;span style="color:red"&gt;linux/module.h&lt;/span&gt; 裡找到，但是這些並非用於 Kernel 本身，如果大家想看範例程式，可以到 &lt;span style="color:red"&gt;drivers&lt;/span&gt;/ 資料夾底下觀看每一個 Driver 程式，底下是簡單 hello world 範例：&lt;/p&gt;
&lt;pre class="brush: cpp; title: ; notranslate" title=""&gt;#include &lt;linux/kernel.h&gt; /* pr_info所需 include 檔案*/
#include &lt;linux/init.h&gt;
#include &lt;linux/module.h&gt; /* 所有 module 巨集需要檔案*/
#include &lt;linux/version.h&gt;

static int __init hello_init(void)
{
 pr_info("Hello, world appleboy\n");
 pr_info("The process is \"%s\" (pid %i)\n", current-&gt;comm, current-&gt;pid);
 return 0;
}

static void __exit hello_exit(void)
{
 printk(KERN_INFO "Goodbye\n");
}
MODULE_DESCRIPTION("Hello World !!");/* 此程式介紹與描述*/
MODULE_AUTHOR("Bo-Yi Wu &lt;appleboy.tw AT gmail.com&gt;");/* 此程式作者*/
MODULE_LICENSE("GPL");/* 程式 License*/
module_init(hello_init);
module_exit(hello_exit);&lt;/pre&gt; 在 linux/module.h 裡頭，可以找到 MODULE_LICENSE 可定義的 License 
&lt;pre class="brush: cpp; title: ; notranslate" title=""&gt;/*
 * The following license idents are currently accepted as indicating free
 * software modules
 *
 *	"GPL"				[GNU Public License v2 or later]
 *	"GPL v2"			[GNU Public License v2]
 *	"GPL and additional rights"	[GNU Public License v2 rights and more]
 *	"Dual BSD/GPL"			[GNU Public License v2
 *					 or BSD license choice]
 *	"Dual MIT/GPL"			[GNU Public License v2
 *					 or MIT license choice]
 *	"Dual MPL/GPL"			[GNU Public License v2
 *					 or Mozilla license choice]
 *
 * The following other idents are available
 *
 *	"Proprietary"			[Non free products]
 *
 * There are dual licensed components, but when running with Linux it is the
 * GPL that is relevant so this is a non issue. Similarly LGPL linked with GPL
 * is a GPL combined work.
 *
 * This exists for several reasons
 * 1.	So modinfo can show license info for users wanting to vet their setup 
 *	is free
 * 2.	So the community can ignore bug reports including proprietary modules
 * 3.	So vendors can do likewise based on their own policies
 */&lt;/pre&gt; 巨集 define: 
&lt;pre class="brush: cpp; title: ; notranslate" title=""&gt;#define MODULE_LICENSE(_license) MODULE_INFO(license, _license)

/*
 * Author(s), use "Name &lt;email&gt;" or just "Name", for multiple
 * authors use multiple MODULE_AUTHOR() statements/lines.
 */
#define MODULE_AUTHOR(_author) MODULE_INFO(author, _author)

/* What your module does. */
#define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description)&lt;/pre&gt;</description></item><item><title>[高雄美食]道明中學武廟路好吃愛嬌姨臭豆腐</title><link>https://blog.wu-boy.com/2010/07/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F%E9%81%93%E6%98%8E%E4%B8%AD%E5%AD%B8%E6%AD%A6%E5%BB%9F%E8%B7%AF%E5%A5%BD%E5%90%83%E8%87%AD%E8%B1%86%E8%85%90/</link><pubDate>Sat, 24 Jul 2010 07:56:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/07/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F%E9%81%93%E6%98%8E%E4%B8%AD%E5%AD%B8%E6%AD%A6%E5%BB%9F%E8%B7%AF%E5%A5%BD%E5%90%83%E8%87%AD%E8%B1%86%E8%85%90/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/4783335906/" title="Flickr 上 appleboy46 的 IMG_1290"&gt;&lt;img src="https://i2.wp.com/farm5.static.flickr.com/4116/4783335906_6df8eacf93.jpg?resize=500%2C375&amp;#038;ssl=1" alt="IMG_1290" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;我相信在高雄要吃到好吃的臭豆腐，無非就是豪記臭豆腐，大家可以參考&lt;a href="http://blog.sina.com.tw/akane847/"&gt;懶喵兒滴窩&lt;/a&gt;：『&lt;a href="http://blog.sina.com.tw/akane847/article.php?pbgid=7423&amp;amp;entryid=612784"&gt;[高雄-三民]豪記臭豆腐王【港式臭豆腐專賣店】 (新址)&lt;/a&gt;』，但是這次要來介紹也許在高雄比較少人知道的路邊攤臭豆腐，它位於高雄市武廟路上一間不起眼的臭豆腐，&lt;a href="http://www.dmhs.kh.edu.tw/"&gt;道明中學&lt;/a&gt;對面巷子走進去接到武廟路就可以吃到了，營業時間是下午15:30~19:40，時間不長，但是大排長龍阿，想要去吃的，最好不要挑晚餐時間，因為自己那個時間去吃，至少等了半小時。&lt;/p&gt;</description></item><item><title>[Linux Kernel] 撰寫 Hello, World module: The __init and __exit Macros (part 2).</title><link>https://blog.wu-boy.com/2010/07/linux-kernel-%E6%92%B0%E5%AF%AB-hello-world-module-the-__init-and-__exit-macros-part-2/</link><pubDate>Tue, 20 Jul 2010 16:04:16 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/07/linux-kernel-%E6%92%B0%E5%AF%AB-hello-world-module-the-__init-and-__exit-macros-part-2/</guid><description>&lt;p&gt;再看此篇之前，可以先閱讀作者先前寫的：『&lt;a href="http://blog.wu-boy.com/2010/06/21/2231/"&gt;[Linux Kernel Driver] 撰寫簡單 Hello, World module (part 1).&lt;/a&gt;』，今天要介紹 Driver 的 init module 區別，在 Kernel 2.4 版本，您可以自行定義 init 跟 cleanup 函式，他們不再被個別稱為 &lt;span style="color:green"&gt;init_module()&lt;/span&gt; 和 &lt;span style="color:green"&gt;cleanup_module()&lt;/span&gt;，現在都使用 &lt;span style="color:green"&gt;&lt;strong&gt;module_init()&lt;/strong&gt;&lt;/span&gt; 和 &lt;span style="color:green"&gt;&lt;strong&gt;module_exit()&lt;/strong&gt;&lt;/span&gt; 兩大巨集，這兩函式被定義在 &lt;span style="color:red"&gt;linux/init.h&lt;/span&gt; 檔案裡面，所以在寫程式務必將其 include 喔，另外一個核心模組(MODULE_LICENSE)，用於讓核心知道此模組遵守自由授權條款，若沒這項宣告，核心會跟您抱怨的喔，底下為範例：&lt;/p&gt;
&lt;pre class="brush: cpp; title: ; notranslate" title=""&gt;#include &lt;linux/kernel.h&gt; /* pr_info所需 include 檔案*/
#include &lt;linux/init.h&gt;
#include &lt;linux/module.h&gt; /* 所有 module 需要檔案*/
#include &lt;linux/version.h&gt;

MODULE_DESCRIPTION("Hello World !!");
MODULE_AUTHOR("Bo-Yi Wu &lt;appleboy.tw AT gmail.com&gt;");
MODULE_LICENSE("GPL");

static int __init hello_init(void)
{
 pr_info("Hello, world appleboy\n");
 pr_info("The process is \"%s\" (pid %i)\n", current-&gt;comm, current-&gt;pid);
 return 0;
}

static void __exit hello_exit(void)
{
 printk(KERN_INFO "Goodbye\n");
}

module_init(hello_init);
module_exit(hello_exit);&lt;/pre&gt; 編譯過程，可以自行修改 Makefile，可以打開 
&lt;p&gt;&lt;span style="color:green"&gt;kernel/android-2.6.29/drivers/i2c/chips/Makefile&lt;/span&gt; 參考範例，您會發現很多類似底下寫法：&lt;/p&gt;</description></item><item><title>ProFTPD UseEncoding 繁體中文亂碼解決 Localization</title><link>https://blog.wu-boy.com/2010/07/proftpd-useencoding-%E7%B9%81%E9%AB%94%E4%B8%AD%E6%96%87%E4%BA%82%E7%A2%BC%E8%A7%A3%E6%B1%BA-localization/</link><pubDate>Wed, 07 Jul 2010 08:07:13 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/07/proftpd-useencoding-%E7%B9%81%E9%AB%94%E4%B8%AD%E6%96%87%E4%BA%82%E7%A2%BC%E8%A7%A3%E6%B1%BA-localization/</guid><description>&lt;p&gt;&lt;img src="https://i0.wp.com/farm5.static.flickr.com/4096/4770121725_6a997912c6_o.png?w=840&amp;#038;ssl=1" alt="Proftpd" data-recalc-dims="1" /&gt; &lt;a href="http://www.proftpd.org/"&gt;ProFTPD&lt;/a&gt; 一直都是我最喜歡使用的 FTP 伺服器，設定方式簡單淺顯易懂，最近在用 &lt;a href="http://www.pspad.com/"&gt;PSPad&lt;/a&gt; 寫程式，發現使用內建 FTP 功能時候，連不上 &lt;a href="http://www.freebsd.org"&gt;FreeBSD&lt;/a&gt; 架設的 ProFTPD，連線過程出現許多亂碼，所以造成 PSPad 斷線出現錯誤，解決方式就是利用 &lt;a href="http://www.proftpd.org/docs/modules/mod_lang.html"&gt;mod_lang&lt;/a&gt; 模組，設定 &lt;a href="http://www.proftpd.org/docs/modules/mod_lang.html#UseEncoding"&gt;UseEncoding&lt;/a&gt; 讓系統可以顯示 Big5 中文編碼，FreeBSD Ports 請勾選&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;[X] NLSUOTA Use nls (builds mod_lang)&lt;/pre&gt; 自行編譯請按照底下步驟 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;./configure --enable-nls
make
make install &lt;/pre&gt;
&lt;h3 id="useencoding-設定"&gt;UseEncoding 設定&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;Syntax: UseEncoding on|off|local-charset client-charset
Default: None
Context: "server config", &lt;VirtualHost&gt;, &lt;Global&gt;
Module: mod_lang
Compatibility: 1.3.2rc1&lt;/pre&gt; 在 1.3.2rc1 版本之後才有支援，請複製底下設定，貼到 proftpd.conf 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# 简体中文環境
UseEncoding UTF-8 GBK
# 繁体中文環境
UseEncoding UTF-8 Big5&lt;/pre&gt; Reference: 
&lt;p&gt;&lt;a href="http://www.proftpd.org/docs/modules/mod_lang.html"&gt;ProFTPD module mod_lang&lt;/a&gt; &lt;a href="http://wanglq.blog.51cto.com/783560/340741"&gt;centos上解決proftp中文亂碼問題&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[phpBB3] BBCode [url] Tag 支援中文網址</title><link>https://blog.wu-boy.com/2010/06/phpbb3-bbcode-url-tag-%E8%BD%89%E6%8F%9B%E4%B8%AD%E6%96%87%E7%B6%B2%E5%9D%80%E9%A9%97%E8%AD%89/</link><pubDate>Wed, 30 Jun 2010 12:05:07 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/06/phpbb3-bbcode-url-tag-%E8%BD%89%E6%8F%9B%E4%B8%AD%E6%96%87%E7%B6%B2%E5%9D%80%E9%A9%97%E8%AD%89/</guid><description>&lt;p&gt;在 phpBB2 的時候就有發現這問題了，當時並沒有想去解決這問題，然而至今到了 &lt;a href="http://www.phpbb.com/"&gt;phpBB3&lt;/a&gt;，依然出現這問題，不過我想這是因為中文網址的盛行，以及像 &lt;a href="http://en.wikipedia.org/wiki/Wiki"&gt;Wiki&lt;/a&gt; 之類都會有中文標籤，例如：&lt;a href="http://wiki.moztw.org/Firefox_%E4%B8%80%E5%88%86%E9%90%98%E6%95%99%E5%AE%A4-userChrome.css"&gt;一分鐘教室-userChrome.css&lt;/a&gt;，解決方法可以透過 &lt;a href="http://php.net/manual/en/function.urlencode.php"&gt;urlencode&lt;/a&gt; 函式來處理掉網址編碼問題，在 phpBB 處理文章儲存，會先經過 bbcode 的處理，將 **** 標籤，會經過 &lt;span style="color:green"&gt;get_preg_expression&lt;/span&gt;(&amp;lsquo;url&amp;rsquo;) 這函式的驗證，看 url 是否合法，當然如果網址列有中文就不可能通過，所以必須在網址驗證之前，把網址編碼過，通過驗證之後再把網址解碼，這樣就沒問題了，底下為安裝步驟 打開 &lt;span style="color:green"&gt;&lt;strong&gt;includes/message_parser.php&lt;/strong&gt;&lt;/span&gt; 找尋&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;function validate_url($var1, $var2)&lt;/pre&gt; 前面加入 
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;/**
* url encode
*
* @param string $string http url
*/

function encode_url($string)
{
 $entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D');
 $replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&amp;", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]");
 return str_replace($entities, $replacements, urlencode($string));
}&lt;/pre&gt; 找尋 
&lt;p&gt;&lt;span style="color:green"&gt;&lt;strong&gt;validate_url&lt;/strong&gt;&lt;/span&gt; 函式&lt;/p&gt;</description></item><item><title>[FreeBSD] update apache -&gt; 2.2.15, PHP -&gt; 5.3.2, and MySQL downgrade to 5.1.9</title><link>https://blog.wu-boy.com/2010/06/freebsd-update-apache-2-2-15-php-5-3-2-and-mysql-downgrade-to-5-1-9/</link><pubDate>Wed, 23 Jun 2010 05:46:34 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/06/freebsd-update-apache-2-2-15-php-5-3-2-and-mysql-downgrade-to-5-1-9/</guid><description>&lt;p&gt;昨天升級了 &lt;a href="http://www.freebsd.org"&gt;FreeBSD&lt;/a&gt; 的 Apache, &lt;a href="http://www.php.net"&gt;PHP&lt;/a&gt;, and &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt;，遇到很多地雷阿，最多的就是 PHP 的部份，因為本來自己使用 5.2.11 版本，但是在 commit port 的時候發生去裝 5.3.2 版本，所以就直接砍掉全部重練，先是遇到 MySQL 問題，原先在 database/mysql60-server 已經被 FreeBSD 移除，任何關於 mysql60 的相關 port 都被 remove 掉了，只好 downgrade 到 mysql 5.1.48 版本，移除同時順手把 apache PHP 相關都拿掉了。&lt;/p&gt;
&lt;h3 id="移除-apache-mysql-php-相關-ports--rf-依序找尋相關-mysql-ports-移除"&gt;移除 apache mysql php 相關 ports -rf 依序找尋相關 Mysql ports 移除&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;pkg_deinstall -rf mysql60-server&lt;/pre&gt; 接下來安裝 MySQL 5.1.48 Server and Client，可以找到在 
&lt;p&gt;&lt;span style="color:green"&gt;databases/mysql51-server&lt;/span&gt; and &lt;span style="color:green"&gt;databases/mysql51-client&lt;/span&gt;，直接安裝即可&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;cd /usr/ports/databases/mysql51-server &amp;&amp; make install&lt;/pre&gt; 安裝 Apache 2.2.15 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;cd /usr/ports/www/apache22 &amp;&amp; make WITH_MPM=worker install&lt;/pre&gt; 安裝 PHP 5.3.2，FreeBSD 把 5.2.X 跟 5.3.X 分開不同資料夾 
&lt;p&gt;&lt;span style="color:green"&gt;lang/php5&lt;/span&gt;, &lt;span style="color:green"&gt;lang/php52&lt;/span&gt;，extension 也是分成兩個，所以要安裝 5.2 版本也是可以的&lt;/p&gt;</description></item><item><title>[Linux Kernel] 撰寫簡單 Hello, World module (part 1).</title><link>https://blog.wu-boy.com/2010/06/linux-kernel-driver-%E6%92%B0%E5%AF%AB%E7%B0%A1%E5%96%AE-hello-world-module-part-1/</link><pubDate>Mon, 21 Jun 2010 09:36:10 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/06/linux-kernel-driver-%E6%92%B0%E5%AF%AB%E7%B0%A1%E5%96%AE-hello-world-module-part-1/</guid><description>&lt;p&gt;來筆記如何在 Kernel 撰寫 hello world! module，在 Ubuntu Kernel 2.6.31-14 環境下撰寫，其實不難啦，首先先進入 Kernel 目錄，請在 &lt;span style="color:green"&gt;/usr/src&lt;/span&gt; 底下看自己的系統版本，或者是利用 &lt;span style="color:green"&gt;uname -r&lt;/span&gt; 來知道 Kernel 版本，底下是在 Ubuntu Kernel 2.6.31-14 Kernel 實做：&lt;/p&gt;
&lt;h3 id="進入-kernel-目錄"&gt;進入 Kernel 目錄&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# cd Kernel directory
#
cd /usr/src/linux-headers-2.6.31-14-generic-pae&lt;/pre&gt;
&lt;h3 id="建立-hello-目錄"&gt;建立 hello 目錄&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# mkdir directory
#
mkdir hello&lt;/pre&gt;
&lt;h3 id="建立-makfile-以及-helloc-helloc"&gt;建立 Makfile 以及 hello.c hello.c:&lt;/h3&gt;
&lt;pre class="brush: cpp; title: ; notranslate" title=""&gt;#include &lt;linux/kernel.h&gt; /* pr_info 所需 include 檔案*/
#include &lt;linux/init.h&gt;
#include &lt;linux/module.h&gt; /* 所有 module 需要檔案*/
#include &lt;linux/version.h&gt;

MODULE_DESCRIPTION("Hello World !!");
MODULE_AUTHOR("Bo-Yi Wu &lt;appleboy.tw AT gmail.com&gt;");
MODULE_LICENSE("GPL");

static int __init hello_init(void)
{
 pr_info("Hello, world\n");
 pr_info("The process is \"%s\" (pid %i)\n", current-&gt;comm, current-&gt;pid);
 return 0;
}

static void __exit hello_exit(void)
{
 printk(KERN_INFO "Goodbye\n");
}

module_init(hello_init);
module_exit(hello_exit);&lt;/pre&gt; Makefile: 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# Makefile by appleboy &lt;appleboy.tw AT gmail.com&gt;
#
obj-m += hello.o
KVERSION := $(shell uname -r)

all:
 $(MAKE) -C /lib/modules/$(KVERSION)/build M=$(PWD) modules

clean:
 $(MAKE) -C /lib/modules/$(KVERSION)/build M=$(PWD) clean&lt;/pre&gt; 之後只要切換到 hello 目錄，直接打 make 就可以產生出 hello.ko 檔案，直接載入 hello.ko 方式： 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;insmod ./hello.ko&lt;/pre&gt; 移除 hello.ko 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;rmmod ./hello.ko&lt;/pre&gt; 之後到 /var/log/message 底下就可以看到訊息： 
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/4719816041/" title="Flickr 上 appleboy46 的 Kernel Hello World"&gt;&lt;img src="https://i0.wp.com/farm5.static.flickr.com/4068/4719816041_ffa47ac6d5.jpg?resize=500%2C136&amp;#038;ssl=1" alt="Kernel Hello World" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>WordPress 3.0 Release “Thelonious”</title><link>https://blog.wu-boy.com/2010/06/wordpress-3-0-release-thelonious/</link><pubDate>Sun, 20 Jun 2010 13:30:13 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/06/wordpress-3-0-release-thelonious/</guid><description>&lt;p&gt;&lt;a href="http://wordpress.org/"&gt;WordPress&lt;/a&gt; 在6月17日 Release 3.0 版本名稱：Thelonious，&lt;a href="http://wordpress.org/development/2010/06/thelonious/"&gt;官方部落格 WordPress 3.0 &amp;ldquo;Thelonious&amp;rdquo;&lt;/a&gt;，使用者可以在&lt;a href="http://wordpress.org/download/"&gt;這裡下載&lt;/a&gt;，或者是利用&lt;a href="http://codex.wordpress.org/Dashboard_Updates_SubPanel"&gt;後台方式升級&lt;/a&gt;，這次更新了 1,217 bug 修正以及功能增加，可以看底下官方網站影片：&lt;/p&gt;
&lt;embed src="http://v.wordpress.com/wp-content/plugins/video/flvplayer.swf?ver=1.21" type="application/x-shockwave-flash" width="500" height="270" wmode="transparent" seamlesstabbing="true" allowfullscreen="true" allowscriptaccess="always" overstretch="true" flashvars="guid=BQtfIEY1&amp;width=640&amp;height=360&amp;locksize=no&amp;dynamicseek=false&amp;qc_publisherId=p-18-mFEk4J448M" title="Introducing WordPress 3.0 &amp;quot;Thelonious&amp;quot;"&gt;
&lt;/embed&gt; 大家可以參考 3.0 版本更
&lt;p&gt;&lt;a href="http://codex.wordpress.org/Version_3.0"&gt;詳細介紹&lt;/a&gt;，以及 &lt;a href="http://core.trac.wordpress.org/query?group=status&amp;amp;milestone=3.0&amp;amp;desc=1&amp;amp;order=priority"&gt;long list of issues in Trac&lt;/a&gt;。感謝 218 位 contributors 為 3.0 的貢獻，目前官方也繼續開始邁向 3.1 的開發。&lt;/p&gt;</description></item><item><title>[phpBB3 外掛] 根據使用者文章數目限制簽名檔顯示</title><link>https://blog.wu-boy.com/2010/06/phpbb3-%E5%A4%96%E6%8E%9B-%E6%A0%B9%E6%93%9A%E4%BD%BF%E7%94%A8%E8%80%85%E6%96%87%E7%AB%A0%E6%95%B8%E7%9B%AE%E9%99%90%E5%88%B6%E7%B0%BD%E5%90%8D%E6%AA%94%E9%A1%AF%E7%A4%BA/</link><pubDate>Sun, 13 Jun 2010 07:00:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/06/phpbb3-%E5%A4%96%E6%8E%9B-%E6%A0%B9%E6%93%9A%E4%BD%BF%E7%94%A8%E8%80%85%E6%96%87%E7%AB%A0%E6%95%B8%E7%9B%AE%E9%99%90%E5%88%B6%E7%B0%BD%E5%90%8D%E6%AA%94%E9%A1%AF%E7%A4%BA/</guid><description>&lt;p&gt;前一篇提到：『&lt;a href="http://blog.wu-boy.com/2010/06/10/2203/"&gt;[教學] phpBB3 使用者簽名檔 url 連結加上 rel=”nofollow”&lt;/a&gt;』，本篇會將其做成後台，方便管理者可以從後台管理，這次加上一個新功能：『限制使用者顯示簽名檔』，根據使用者文章數量來決定是否顯示簽名檔，可以避免想要來打廣告的新註冊使用者，限制文章數量是一種方式，但是也不是最好的方式，&lt;a href="http://www.phpbb.com/"&gt;phpBB3&lt;/a&gt; 本身可以在後台限制是否顯示使用者簽名檔，不過我想各大站長都會開放此功能，好讓使用者可以放個人網站或者是部落格，底下是外掛安裝方式：&lt;/p&gt;
&lt;h3 id="安裝-打開"&gt;安裝 打開&lt;/h3&gt;
&lt;p&gt;&lt;span style="color:green"&gt;includes/acp/acp_board.php&lt;/span&gt; 找尋&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;#
# Find
#
'max_sig_img_height' =&gt; array('lang' =&gt; 'MAX_SIG_IMG_HEIGHT', 'validate' =&gt; 'int:0', 'type' =&gt; 'text:5:4', 'explain' =&gt; true, 'append' =&gt; ' ' . $user-&gt;lang['PIXEL']),&lt;/pre&gt; 後面加上 
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;#
# after add
#
'max_sig_post_count_limit' =&gt; array('lang' =&gt; 'MAX_SIG_POSTS_LIMIT', 'validate' =&gt; 'int:0', 'type' =&gt; 'text:5:4', 'explain' =&gt; true),
&lt;/pre&gt; 打開 
&lt;p&gt;&lt;span style="color:green"&gt;viewtopic.php&lt;/span&gt; 找尋&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;#
# Find
#
if ($row['user_sig'] &amp;&amp; $config['allow_sig'] &amp;&amp; $user-&gt;optionget('viewsigs'))&lt;/pre&gt; 取代 
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;#
# Replace
#
if (($row['user_sig'] &amp;&amp; $config['allow_sig'] &amp;&amp; $user-&gt;optionget('viewsigs') &amp;&amp; $row['user_posts'] &gt;= $config['max_sig_post_count_limit']) || (isset($user-&gt;data['session_admin']) &amp;&amp; $user-&gt;data['session_admin']))&lt;/pre&gt;
&lt;h3 id="中文化-打開"&gt;中文化 打開&lt;/h3&gt;
&lt;p&gt;&lt;span style="color:green"&gt;language/zh_cmn_hant/acp/board.php&lt;/span&gt; 找尋&lt;/p&gt;</description></item><item><title>[教學] phpBB3 使用者簽名檔 url 連結加上 rel=”nofollow”</title><link>https://blog.wu-boy.com/2010/06/%E6%95%99%E5%AD%B8-phpbb3-%E4%BD%BF%E7%94%A8%E8%80%85%E7%B0%BD%E5%90%8D%E6%AA%94-url-%E9%80%A3%E7%B5%90%E5%8A%A0%E4%B8%8A-relnofollow/</link><pubDate>Thu, 10 Jun 2010 13:29:02 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/06/%E6%95%99%E5%AD%B8-phpbb3-%E4%BD%BF%E7%94%A8%E8%80%85%E7%B0%BD%E5%90%8D%E6%AA%94-url-%E9%80%A3%E7%B5%90%E5%8A%A0%E4%B8%8A-relnofollow/</guid><description>&lt;p&gt;基於 &lt;a href="http://forum.moztw.org/"&gt;Moztw 討論區&lt;/a&gt; 有大陸使用者註冊之後，在簽名檔加入一些廣告連結，為了降低 Google Page Rank，所以我們必須指示搜尋引擎「不要前往此網頁上的連結」或是「不要前往此連結」，可以參考 &lt;a href="http://www.google.com/support/webmasters/bin/answer.py?hl=b5&amp;amp;answer=96569"&gt;關於 rel=&amp;ldquo;nofollow&amp;rdquo;&lt;/a&gt;，&lt;a href="http://www.phpbb.com/"&gt;phpBB3&lt;/a&gt; 編輯三個檔案就可以了，此修改不影響&lt;span style="color:red"&gt;文章內容&lt;/span&gt;，只有針對&lt;span style="color:red"&gt;簽名檔&lt;/span&gt;作用，底下是 patch 程式碼，可以參考看看 &lt;span style="color:green"&gt;includes/bbcode.php&lt;/span&gt;&lt;/p&gt;
&lt;pre class="brush: diff; title: ; notranslate" title=""&gt;--- phpBB3/includes/bbcode.php 2010-03-06 04:37:23.000000000 +0800
+++ www/includes/bbcode.php 2010-06-10 20:58:02.000000000 +0800
@@ -2,7 +2,8 @@
 /**
 *
 * @package phpBB3
-* @version $Id$
+* @version $Id: bbcode.php 9461 2009-04-17 15:23:17Z acydburn $
+* @log 2010-06-10 appleboy $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -48,7 +49,7 @@
 /**
 * Second pass bbcodes
 */
- function bbcode_second_pass(&amp;$message, $bbcode_uid = '', $bbcode_bitfield = false)
+ function bbcode_second_pass(&amp;$message, $bbcode_uid = '', $bbcode_bitfield = false, $bbcode_is_sig = false)
 {
 if ($bbcode_uid)
 {
@@ -110,6 +111,13 @@
 }

 $message = preg_replace($preg['search'], $preg['replace'], $message);
+
+ /*
+ * 2010.06.10 add search nofollow module by appleboy
+ */
+ $replace = ($bbcode_is_sig === true) ? 'rel="external nofollow"' : '';
+ $message = preg_replace("/\{NOFOLLOW\}/i", $replace, $message);
+
 $preg = array('search' =&gt; array(), 'replace' =&gt; array());
 }
 }&lt;/pre&gt;
&lt;p&gt;&lt;span style="color:green"&gt;styles/Moztw-2009-1.0.6/template/bbcode.html&lt;/span&gt;&lt;/p&gt;</description></item><item><title>[PHP] 好用 Debug PHP 工具 FirePHP for FireFox on CodeIgniter</title><link>https://blog.wu-boy.com/2010/06/php-%E5%A5%BD%E7%94%A8-debug-php-%E5%B7%A5%E5%85%B7-firephp-for-firefox-on-codeigniter/</link><pubDate>Mon, 07 Jun 2010 11:30:56 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/06/php-%E5%A5%BD%E7%94%A8-debug-php-%E5%B7%A5%E5%85%B7-firephp-for-firefox-on-codeigniter/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i0.wp.com/www.firephp.org/images/FirePHP_Large_White.png?w=840" alt="FirePHP" data-recalc-dims="1" /&gt;
&lt;/div&gt; 之前介紹過 javascript FireFox Debug 工具 
&lt;p&gt;&lt;a href="http://getfirebug.com/"&gt;FireBug&lt;/a&gt; (&lt;a href="http://blog.wu-boy.com/2010/01/05/1943/"&gt;Using firebug for firefox 除錯 javascript&lt;/a&gt;)，今天來介紹 PHP 除錯工具 &lt;a href="http://www.firephp.org/"&gt;FirePHP&lt;/a&gt;，它可以輸出 PHP 資料到 FireBug console 介面，方便解決 PHP 相關問題，而不會去影響線上網站的畫面，安裝方式非常簡單，請先安裝 &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/6149/"&gt;FireFox addon for FirePHP&lt;/a&gt;，重新啟動 FireFox 這樣就安裝成功了，接下來就是 include FirePHP Library 檔案，就可以正常使用了。另外還會介紹如何安裝到 &lt;a href="http://codeigniter.com/"&gt;CodeIgniter PHP Framework&lt;/a&gt; Firebug: &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1843"&gt;https://addons.mozilla.org/en-US/firefox/addon/1843&lt;/a&gt; FirePHP: &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/6149"&gt;https://addons.mozilla.org/en-US/firefox/addon/6149&lt;/a&gt; 底下先看畫面：&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;$array = array("a" =&gt; "1", "b" =&gt; "2");
$firephp-&gt;info($array, "info");
$firephp-&gt;warn($array, "warn");
$firephp-&gt;error($array, "error");&lt;/pre&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/4677599187/" title="Flickr 上 appleboy46 的 FirePHP"&gt;&lt;img src="https://i0.wp.com/farm5.static.flickr.com/4072/4677599187_64c5568b73_o.png?resize=444%2C200&amp;#038;ssl=1" alt="FirePHP" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="install-firephp-安裝-ref-"&gt;Install FirePHP 安裝 Ref :&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://www.firephp.org/HQ/Install.htm"&gt;http://www.firephp.org/HQ/Install.htm&lt;/a&gt; 在 Zend Framework 已經有開發完成，可以參考：&lt;a href="http://www.christophdorn.com/Blog/2008/09/02/firephp-and-zend-framework-16/"&gt;FirePHP and Zend Framework 1.6&lt;/a&gt; 下載檔案：&lt;a href="http://www.firephp.org/DownloadRelease/FirePHPLibrary-FirePHPCore-0.3.1"&gt;Download FirePHPCore library version 0.3.1&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Linux Kernel] built-in vs. module</title><link>https://blog.wu-boy.com/2010/05/linux-kernel-built-in-vs-module/</link><pubDate>Fri, 28 May 2010 14:36:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/05/linux-kernel-built-in-vs-module/</guid><description>&lt;p&gt;在編譯 &lt;a href="http://code.google.com/android/"&gt;Android&lt;/a&gt; Linux Kernel 2.6.29 Driver，常常遇到該把 Driver 用 built-in 或者是編譯成 module 呢？這其實看人習慣，就跟問你編輯器是用 &lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; 或者是 &lt;a href="http://www.gnu.org/software/emacs/"&gt;emacs&lt;/a&gt; 是同樣意思，這兩者是有很大的差異，built-in 用在開機自動讀取載入，所以直接編譯成 uImage 檔案給嵌入式系統，像是 SCSI 或者是 SATA Driver 都建議編譯成 built-in 的方式，反而是一些音效驅動程式，可以編譯成 module，NTFS 就是可以編譯成 module，等您需要的時候在動態載入就可以，這樣可以減少 Kernel Image 的使用空間。 如果不想用 built-in 編譯，開機又需要驅動程式，那就需要透過 initrd 方式來啟動。底下整理兩者差異：&lt;/p&gt;
&lt;h3 id="built-in"&gt;built-in：&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;開機自動載入，不可移除 Linux Kernel Image 大 需要重新 Compile&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="module"&gt;module：&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;可動態載入 Linux Kernel Image 小 不需要重新 Compile reference: &lt;a href="http://www.mail-archive.com/gentoo-user@gentoo.org/msg09418.html"&gt;[gentoo-user] kernel: built-in vs. module&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[Ubuntu/Debian] 使用系統設定全域 http Proxy</title><link>https://blog.wu-boy.com/2010/05/ubuntudebian-%E4%BD%BF%E7%94%A8%E7%B3%BB%E7%B5%B1%E8%A8%AD%E5%AE%9A%E5%85%A8%E5%9F%9F-http-proxy/</link><pubDate>Thu, 20 May 2010 08:46:01 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/05/ubuntudebian-%E4%BD%BF%E7%94%A8%E7%B3%BB%E7%B5%B1%E8%A8%AD%E5%AE%9A%E5%85%A8%E5%9F%9F-http-proxy/</guid><description>&lt;p&gt;如果想讓 Ubuntu/Debian 不管是 http 或者是 ftp 都可以透過 Proxy 去取得資料，就必須要設定系統 Proxy，目前任職公司就必須這樣設定，當然也可以透過其他方式出去(ex. ssh tunnel) 可以搜尋其他文章，底下分成兩種方式設定。 1. 利用 command line 方式設定&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;export http_proxy=http://username:password@proxyserver.net:port/
export ftp_proxy=http://username:password@proxyserver.netport/&lt;/pre&gt; 寫入 ~/.bashrc 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;source ~/.bashrc &lt;/pre&gt; 2. 利用 Desktop 介面設定 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;Settings-&gt; Preference -&gt; Network
系統\偏好設定\代理伺服器&lt;/pre&gt; reference: 
&lt;p&gt;&lt;a href="http://blog.mypapit.net/2006/02/how-to-use-apt-get-behind-proxy-server-ubuntudebian.html"&gt;How to use apt-get behind proxy server (Ubuntu/Debian)&lt;/a&gt; &lt;a href="http://goo.gl/SZYH"&gt;Ubuntu Proxy的設定&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[C/C++] count 1 bits of input value by shifting.</title><link>https://blog.wu-boy.com/2010/05/cc-count-1-bits-of-input-value-by-shifting/</link><pubDate>Tue, 18 May 2010 14:37:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/05/cc-count-1-bits-of-input-value-by-shifting/</guid><description>&lt;p&gt;之前寫了一篇：『&lt;a href="http://blog.wu-boy.com/2010/02/24/2036/"&gt;[C/C++] 計算二進位任意數含有多少個位元為1?&lt;/a&gt;』，裡面用 n &amp;amp;= (n - 1); 的方式來計算二進位數字總共會得到多少 bit，這次來紀錄利用 shift 方式也可以得到總共含有多少 bit 數目，函式如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-15"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-16"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-17"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-18"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-18"&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-19"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-19"&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-20"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-20"&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-21"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-21"&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#include&lt;/span&gt; &lt;span style="color:#1e889b"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#1e889b"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#include&lt;/span&gt; &lt;span style="color:#1e889b"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span style="color:#1e889b"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; &lt;span style="color:#008b45"&gt;count_1_bit_count&lt;/span&gt;(&lt;span style="color:#00688b;font-weight:bold"&gt;unsigned&lt;/span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; &lt;span style="color:#008b45"&gt;main&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; count = &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;, a;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; a = &lt;span style="color:#b452cd"&gt;1023&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; count = &lt;span style="color:#008b45"&gt;count_1_bit_count&lt;/span&gt;(a);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;printf&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;%d有%d個位元為1&lt;/span&gt;&lt;span style="color:#cd5555"&gt;\n\n&lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;, a, count);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;system&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;pause&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; &lt;span style="color:#008b45"&gt;count_1_bit_count&lt;/span&gt;(&lt;span style="color:#00688b;font-weight:bold"&gt;unsigned&lt;/span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; n)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; count = &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;for&lt;/span&gt;(count = &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;; n != &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;; n &amp;gt;&amp;gt;= &lt;span style="color:#b452cd"&gt;1L&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;if&lt;/span&gt;(n &amp;amp; &lt;span style="color:#b452cd"&gt;0x01&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; count++;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; count;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;關鍵就是在 &lt;span style="color:green"&gt;n &amp;raquo;= 1L&lt;/span&gt;，把該數字往右位移 1 bit，然後跟 &lt;span style="color:green"&gt;0x01&lt;/span&gt; 去做 and，如果數字大於0，count 就加 1。&lt;/p&gt;</description></item><item><title>[筆記] iframe 父頁子頁呼叫函式 parent call function</title><link>https://blog.wu-boy.com/2010/05/%E7%AD%86%E8%A8%98-iframe-%E7%88%B6%E9%A0%81%E5%AD%90%E9%A0%81%E5%91%BC%E5%8F%AB%E5%87%BD%E5%BC%8F-parent-call-function/</link><pubDate>Fri, 07 May 2010 16:13:48 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/05/%E7%AD%86%E8%A8%98-iframe-%E7%88%B6%E9%A0%81%E5%AD%90%E9%A0%81%E5%91%BC%E5%8F%AB%E5%87%BD%E5%BC%8F-parent-call-function/</guid><description>&lt;p&gt;紀錄 iframe 如何呼叫子頁或者是父頁函式，iframe 在現今 Web 2.0 時代已經不流行了，因為有很多問題的存在，例如對於 SEO 搜尋引擎也沒有幫助，但是也是很多人在使用，底下筆記心得，說不定之後會 google 到自己的文章，哈哈。 父頁(主視窗)呼叫子頁函式：&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;/* iframeID 是 iframe ID*/
window.iframeID.formSubmit();
/* ifr 是 iframe ID */
document.getElementById('ifr').contentWindow.formSubmit();
&lt;/pre&gt; 子頁(iframe)呼叫父頁(主視窗)函式： 
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;parent.formSubmit();&lt;/pre&gt; 如果有兩層 
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;parent.parent.formSubmit();&lt;/pre&gt; 注意 timing issue，等 iframe 視窗 load 完之後才可以呼叫 iframe function。至於如果取主視窗跟 iframe 的變數 value，可以利用 jQuery $("#ID") 方式來得到。 reference: 
&lt;p&gt;&lt;a href="http://blog.xuite.net/chingwei/blog/22953175"&gt;【程式】JS : parent , iframe function call&lt;/a&gt; &lt;a href="http://www.codingforums.com/showthread.php?t=136737"&gt;Access child function from iframe&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[jQuery] 解決 IE6 PNG 透明背景 (Supersleight jQuery Plugin for Transparent PNGs in IE6)</title><link>https://blog.wu-boy.com/2010/05/jquery-%E8%A7%A3%E6%B1%BA-ie6-png-%E9%80%8F%E6%98%8E%E8%83%8C%E6%99%AF-supersleight-jquery-plugin-for-transparent-pngs-in-ie6/</link><pubDate>Sun, 02 May 2010 08:56:05 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/05/jquery-%E8%A7%A3%E6%B1%BA-ie6-png-%E9%80%8F%E6%98%8E%E8%83%8C%E6%99%AF-supersleight-jquery-plugin-for-transparent-pngs-in-ie6/</guid><description>&lt;p&gt;今天無意間看到 &lt;a href="http://24ways.org/"&gt;Drew McLellan&lt;/a&gt; 在 2007 年寫了這篇 &lt;a href="http://24ways.org/2007/supersleight-transparent-png-in-ie6"&gt;Transparent PNGs in Internet Explorer 6&lt;/a&gt;，真的是太晚發現這篇了，之前自己寫到一篇：『&lt;a href="http://blog.wu-boy.com/2010/04/06/2110/"&gt;[CSS] IE 6, 7, 8 FireFox hack 支援透明背景圖 background or img javascript&lt;/a&gt;』，雖然 &lt;a href="http://googleenterprise.blogspot.com/2010/01/modern-browsers-for-modern-applications.html"&gt;Google 官方網站宣佈完全不支援 IE6 瀏覽器&lt;/a&gt;，打算只支援 &lt;a href="http://www.microsoft.com/windows/Internet-explorer/default.aspx"&gt;Microsoft Internet Explorer 7.0+&lt;/a&gt;, &lt;a href="http://www.mozilla.com/en-US/firefox/firefox.html"&gt;Mozilla Firefox 3.0+&lt;/a&gt;, &lt;a href="http://www.google.com/chrome?brand=CHFV"&gt;Google Chrome 4.0+&lt;/a&gt;, &lt;a href="http://www.apple.com/safari/"&gt;Safari 3.0+&lt;/a&gt;，可是我們這些 Web Developer 還是需要考慮客戶的瀏覽器阿，因為客戶才是最大的，尤其是在一些學術機構，安裝好 XP，預設就是 IE6，從 Google 分析裡面，IE6 也是網站的客戶大群。&lt;/p&gt;
&lt;p&gt;先來介紹 Drew McLellan 寫的一支好用 js 來改善所有 png 透明圖檔，最主要是修正 background-image 跟 img tag 所包含的 png 圖檔&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;先下載：&lt;a href="http://24ways.org/code/supersleight-transparent-png-in-ie6/supersleight.zip"&gt;Download SuperSleight&lt;/a&gt;，解壓縮放到 js 資料夾&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;針對 IE6 瀏覽器寫入 html&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;pre class=&amp;quot;brush: xml; title: ; notranslate&amp;quot; title=&amp;quot;&amp;quot;&amp;gt;&amp;lt;!--[if lte IE 6]&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;script type="text/javascript" src="supersleight-min.js"&gt;&lt;/script&gt;
&lt;p&gt;&amp;lt;![endif]&amp;ndash;&amp;gt;
&lt;/pre&gt;&lt;/p&gt;</description></item><item><title>[C/C++] C語言切割字串函式 strsep，分析 URL GET 參數</title><link>https://blog.wu-boy.com/2010/04/cc-c%E8%AA%9E%E8%A8%80%E5%88%87%E5%89%B2%E5%AD%97%E4%B8%B2%E5%87%BD%E5%BC%8F-strsep%EF%BC%8C%E5%88%86%E6%9E%90-url-get-%E5%8F%83%E6%95%B8/</link><pubDate>Wed, 28 Apr 2010 03:25:44 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/04/cc-c%E8%AA%9E%E8%A8%80%E5%88%87%E5%89%B2%E5%AD%97%E4%B8%B2%E5%87%BD%E5%BC%8F-strsep%EF%BC%8C%E5%88%86%E6%9E%90-url-get-%E5%8F%83%E6%95%B8/</guid><description>&lt;p&gt;今天來簡介 UNIX 內建的 &lt;a href="http://linux.about.com/library/cmd/blcmdl3_strsep.htm"&gt;strsep&lt;/a&gt; 函式，這在 Windows &lt;a href="http://www.bloodshed.net/dev/devcpp.html"&gt;Dev-C++&lt;/a&gt; 是沒有支援的，在寫 UNIX 分析字串常常需要利用到此函式，大家可以 man strsep 來看如何使用 strsep，假設我們要分析 URL Get 字串：&lt;span style="color:green"&gt;user_command=appleboy&amp;amp;test=1&amp;amp;test2=2&lt;/span&gt;，就可以利用兩次 strsep 函式，將字串全部分離，取的個別的 name, value。strsep(stringp, delim) 第一個參數傳入需要分析的字串，第二個參數傳入 delim 符號，假設 stringp 為 NULL 字串，則函式會回傳 NULL，換句話說，strsep 會找到 stringp 字串&lt;span style="color:red"&gt;&lt;strong&gt;第一個出現 delim 符號&lt;/strong&gt;&lt;/span&gt;，並將其取代為 \0 符號，然後將 stringp &lt;span style="color:red"&gt;&lt;strong&gt;更新&lt;/strong&gt;&lt;/span&gt;指向到 \0 符號的下一個字串，strsep() function 回傳原來的 stringp 指標。看上面文字敘述，好像不太瞭解，沒關係，底下是 UNIX strsep.c 的原始碼：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-15"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-16"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-17"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-18"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-18"&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-19"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-19"&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-20"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-20"&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-21"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-21"&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-22"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-22"&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-23"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-23"&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-24"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-24"&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-25"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-25"&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-26"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-26"&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-27"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-27"&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-28"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-28"&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-29"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-29"&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-30"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-30"&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-31"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-31"&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-32"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-32"&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-33"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-33"&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-34"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-34"&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-35"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-35"&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-36"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-36"&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-37"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-37"&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-38"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-38"&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-39"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-39"&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt; * Get next token from string *stringp, where tokens are possibly-empty
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt; * strings separated by characters from delim.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt; *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt; * Writes NULs into the string at *stringp to end tokens.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt; * delim need not remain constant from call to call.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt; * On return, *stringp points past the last NUL written (if there might
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt; * be further tokens), or is NULL (if there are definitely no more tokens).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt; *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt; * If *stringp is NULL, strsep returns NULL.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; *
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008b45"&gt;strsep&lt;/span&gt;(stringp, delim)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; **stringp;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;const&lt;/span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; *delim;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; *s;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;const&lt;/span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; *spanp;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; c, sc;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; *tok;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;if&lt;/span&gt; ((s = *stringp) == &lt;span style="color:#658b00"&gt;NULL&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; (&lt;span style="color:#658b00"&gt;NULL&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;for&lt;/span&gt; (tok = s;;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; c = *s++;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; spanp = delim;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;do&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;if&lt;/span&gt; ((sc = *spanp++) == c) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;if&lt;/span&gt; (c == &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; s = &lt;span style="color:#658b00"&gt;NULL&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; s[-&lt;span style="color:#b452cd"&gt;1&lt;/span&gt;] = &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; *stringp = s;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; (tok);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#8b008b;font-weight:bold"&gt;while&lt;/span&gt; (sc != &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#228b22"&gt;/* NOTREACHED */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>[jQuery] AjaxFileUpload : Multiple File Upload plugin</title><link>https://blog.wu-boy.com/2010/04/jquery-ajaxfileupload-multiple-file-upload-plugin/</link><pubDate>Tue, 13 Apr 2010 06:42:48 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/04/jquery-ajaxfileupload-multiple-file-upload-plugin/</guid><description>&lt;p&gt;最近 survey 一些 AJAX upload plugin by &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;，或者是一些網路知名 upload opensource: &lt;a href="http://www.swfupload.org/"&gt;SWFUpload&lt;/a&gt;, 以及目前很強大的 &lt;a href="http://www.plupload.com/index.php"&gt;Plupload&lt;/a&gt;，先來說明 &lt;a href="http://www.phpletter.com/Demo/AjaxFileUpload-Demo/" target="_blank"&gt;AjaxFileUpload&lt;/a&gt; 這個 jQuery Plugin 單一檔案上傳，如果想要簡單方便的單一上傳，我很推薦這個，搭配回傳的 json type 吐出錯誤訊息還蠻好用的，雖然作者給單一上傳的說明，不過還是可以將它改成多檔上傳，也就是多增加 input type=&amp;ldquo;file&amp;rdquo; 就可以了，底下介紹一下怎麼實作單一檔案或者是多檔案上傳。&lt;/p&gt;
&lt;h3 id="單一檔案上傳-先-include-ajaxfileupload-javascript"&gt;單一檔案上傳 先 include AjaxFileUpload javascript&lt;/h3&gt;
&lt;pre class="brush: xml; title: ; notranslate" title=""&gt;&lt;/pre&gt; html: 
&lt;pre class="brush: xml; title: ; notranslate" title=""&gt;&lt;/pre&gt; jQuery code: 
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;function ajaxFileUpload()
{
	//這部份可以省略，或者是撰寫當 ajax 開始啟動需讀取圖片，完成之後移除圖片
	$("#loading")
	.ajaxStart(function(){
		$(this).show();
	})
	.ajaxComplete(function(){
		$(this).hide();
	});
	
 /*
 prepareing ajax file upload
 url: the url of script file handling the uploaded files
 fileElementId: the file type of input element id and it will be the index of $_FILES Array()
 dataType: it support json, xml
 secureuri:use secure protocol
 success: call back function when the ajax complete
 error: callback function when the ajax failed
 */
	$.ajaxFileUpload
	(
		{
			url:'doajaxfileupload.php', 
			secureuri:false,
			fileElementId:'fileToUpload',
			dataType: 'json',
			success: function (data, status)
			{
				if(typeof(data.error) != 'undefined')
				{
					if(data.error != '')
					{
						alert(data.error);
					}else
					{
						alert(data.msg);
					}
				}
			},
			error: function (data, status, e)
			{
				alert(e);
			}
		}
	)
	
	return false;

}&lt;/pre&gt; 注意 fileElementId 對應到 input file 裡面的 ID 值，取 name 是後端程式需要用到，例如 PHP $_FILES，後端處理回傳 json Type 給 jQuery 處理，json 格式： 
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;{
 "error" : 'test',
 "msg" : 'upload completed'
}&lt;/pre&gt; 這樣大致上ok了。如果要多檔案上傳，其實就是改 jQuery 部份：html 部份請加上多個 input file 
&lt;h3 id="多重檔案上傳"&gt;多重檔案上傳&lt;/h3&gt;
&lt;pre class="brush: xml; title: ; notranslate" title=""&gt;&lt;/pre&gt; jQuery 部份改成： 
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;$().ready(function() { 
 $('#uploadfile').click(function(){ 
 $('input:file').each(function(){		 
 $.ajaxFileUpload
 		(
 			{
 				url:'doajaxfileupload.php', 
 				secureuri:false,
 				fileElementId: $(this).attr('id'),
 				dataType: 'json',
 				success: function (data, status)
 				{
 						if(data.error != '')
 						{
 							alert(data.error);
 						}else
 						{
 							alert(data.msg);
 						}
 				},
 				error: function (data, status, e)
 				{
 					alert(e);
 				}
 			}
 		); 
 });
 
 });
 });
&lt;/pre&gt; 另外也可以參考 jQuery Plugin: 
&lt;p&gt;&lt;a href="http://www.fyneworks.com/jquery/multiple-file-upload/"&gt;jQuery Multiple File Upload Plugin v1.47&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[CSS] IE 6, 7, 8 FireFox hack 支援透明背景圖 background or img javascript</title><link>https://blog.wu-boy.com/2010/04/css-ie-6-7-8-firefox-hack-%E6%94%AF%E6%8F%B4%E9%80%8F%E6%98%8E%E8%83%8C%E6%99%AF%E5%9C%96-background-or-img-javascript/</link><pubDate>Mon, 05 Apr 2010 16:44:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/04/css-ie-6-7-8-firefox-hack-%E6%94%AF%E6%8F%B4%E9%80%8F%E6%98%8E%E8%83%8C%E6%99%AF%E5%9C%96-background-or-img-javascript/</guid><description>&lt;p&gt;先前在國外部落格發現一篇非常好用的教學：&lt;a href="http://net.tutsplus.com/tutorials/html-css-techniques/quick-tip-how-to-target-ie6-ie7-and-ie8-uniquely-with-4-characters/"&gt;Quick Tip: How to Target IE6, IE7, and IE8 Uniquely with 4 Characters&lt;/a&gt;，裡面有提供一部教學影片，非常好用，也很實在，底下可以先看影片，看完大概就可以針對 IE, FireFox, Chrome 進行 CSS Hack。 目前網頁製作，要符合多瀏覽器跨平台(&lt;a href="http://www.microsoft.com/taiwan/products/ie/"&gt;IE&lt;/a&gt;, &lt;a href="http://www.apple.com/tw/safari/download/"&gt;Safari&lt;/a&gt;, &lt;a href="http://www.google.com.tw/chrome"&gt;Chrome&lt;/a&gt;, &lt;a href="http://moztw.org/"&gt;FireFox&lt;/a&gt;…等)，就必須動到 CSS Hack，雖然 Google 已經宣稱不支援 IE6，但是很多單位，很多學校跟客戶都是使用 IE6 瀏覽器，不只國內這樣，國外大廠也都希望支援 IE 系列，包含 IE6, IE7, IE8，這時候就必須知道如何分別針對各種不同 IE 做設定，底下就來看看實做例子。&lt;/p&gt;</description></item><item><title>[C/C++] strpbrk 在字串中找尋指定的符號或字母</title><link>https://blog.wu-boy.com/2010/04/cc-strpbrk-%E5%9C%A8%E5%AD%97%E4%B8%B2%E4%B8%AD%E6%89%BE%E5%B0%8B%E6%8C%87%E5%AE%9A%E7%9A%84%E7%AC%A6%E8%99%9F%E6%88%96%E5%AD%97%E6%AF%8D/</link><pubDate>Thu, 01 Apr 2010 15:19:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/04/cc-strpbrk-%E5%9C%A8%E5%AD%97%E4%B8%B2%E4%B8%AD%E6%89%BE%E5%B0%8B%E6%8C%87%E5%AE%9A%E7%9A%84%E7%AC%A6%E8%99%9F%E6%88%96%E5%AD%97%E6%AF%8D/</guid><description>&lt;p&gt;繼上一篇：『&lt;a href="http://blog.wu-boy.com/2010/04/01/2103/"&gt;[C/C++] 切割字串函數：strtok, Network mac address 分割&lt;/a&gt;』，內容寫到 Microsoft 用到 &lt;a href="http://www.cplusplus.com/reference/clibrary/cstring/strpbrk/"&gt;strpbrk&lt;/a&gt; 來找尋字串中特定符號，並且回傳該符號的位址，用法如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-15"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-16"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-17"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-18"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-18"&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-19"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-19"&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-20"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-20"&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-21"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-21"&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-22"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-22"&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#include&lt;/span&gt; &lt;span style="color:#1e889b"&gt;&amp;#34;string.h&amp;#34;&lt;/span&gt;&lt;span style="color:#1e889b"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#include&lt;/span&gt; &lt;span style="color:#1e889b"&gt;&amp;#34;stdlib.h&amp;#34;&lt;/span&gt;&lt;span style="color:#1e889b"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#include&lt;/span&gt; &lt;span style="color:#1e889b"&gt;&amp;#34;stdio.h&amp;#34;&lt;/span&gt;&lt;span style="color:#1e889b"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; &lt;span style="color:#008b45"&gt;main&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; str[] = &lt;span style="color:#cd5555"&gt;&amp;#34;This is a sample string&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; key[] = &lt;span style="color:#cd5555"&gt;&amp;#34;aeiou&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; * pch;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;printf&lt;/span&gt; (&lt;span style="color:#cd5555"&gt;&amp;#34;Vowels in &amp;#39;%s&amp;#39;: &amp;#34;&lt;/span&gt;,str);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pch = &lt;span style="color:#008b45"&gt;strpbrk&lt;/span&gt; (str, key);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;while&lt;/span&gt; (pch != &lt;span style="color:#658b00"&gt;NULL&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;printf&lt;/span&gt; (&lt;span style="color:#cd5555"&gt;&amp;#34;%c &amp;#34;&lt;/span&gt; , *pch);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#228b22"&gt;/* 也可以直接輸出字串 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;printf&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#cd5555"&gt;\n&lt;/span&gt;&lt;span style="color:#cd5555"&gt;output=%s&lt;/span&gt;&lt;span style="color:#cd5555"&gt;\n&lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;, pch);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pch = &lt;span style="color:#008b45"&gt;strpbrk&lt;/span&gt; (pch+&lt;span style="color:#b452cd"&gt;1&lt;/span&gt;,key);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;printf&lt;/span&gt; (&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#cd5555"&gt;\n&lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;system&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;pause&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;輸出結果： &lt;a href="https://www.flickr.com/photos/appleboy/4481282945/" title="Flickr"&gt;&lt;img src="https://i2.wp.com/farm5.static.flickr.com/4025/4481282945_92162c62ae_o.png?w=840&amp;#038;ssl=1" alt="strpbrk" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[C/C++] 切割字串函數：strtok, Network mac address 分割</title><link>https://blog.wu-boy.com/2010/04/cc-%E5%88%87%E5%89%B2%E5%AD%97%E4%B8%B2%E5%87%BD%E6%95%B8%EF%BC%9Astrtok-network-mac-address-%E5%88%86%E5%89%B2/</link><pubDate>Thu, 01 Apr 2010 14:16:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/04/cc-%E5%88%87%E5%89%B2%E5%AD%97%E4%B8%B2%E5%87%BD%E6%95%B8%EF%BC%9Astrtok-network-mac-address-%E5%88%86%E5%89%B2/</guid><description>&lt;p&gt;今天寫了 &lt;a href="http://www.cplusplus.com/reference/clibrary/cstring/strtok/"&gt;strtok&lt;/a&gt; 的範例：『如何分離網路 mac address』程式碼如下，大家一定會有疑問 strtok 第一次呼叫，第一參數輸入愈分離的字串，在 while 迴圈，則是輸入 NULL 呢？底下就來解析 strtok.c 的程式碼。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-15"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-16"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-17"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-18"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-18"&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-19"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-19"&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-20"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-20"&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-21"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-21"&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-22"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-22"&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-23"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-23"&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-24"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-24"&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-25"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-25"&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-26"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-26"&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-27"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-27"&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;* Author : appleboy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;* Date : 2010.04.01
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;* Filename : strtok.c
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#include&lt;/span&gt; &lt;span style="color:#1e889b"&gt;&amp;#34;string.h&amp;#34;&lt;/span&gt;&lt;span style="color:#1e889b"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#include&lt;/span&gt; &lt;span style="color:#1e889b"&gt;&amp;#34;stdlib.h&amp;#34;&lt;/span&gt;&lt;span style="color:#1e889b"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#include&lt;/span&gt; &lt;span style="color:#1e889b"&gt;&amp;#34;stdio.h&amp;#34;&lt;/span&gt;&lt;span style="color:#1e889b"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; &lt;span style="color:#008b45"&gt;main&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; str[]=&lt;span style="color:#cd5555"&gt;&amp;#34;00:22:33:4B:55:5A&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; *delim = &lt;span style="color:#cd5555"&gt;&amp;#34;:&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; * pch;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;printf&lt;/span&gt; (&lt;span style="color:#cd5555"&gt;&amp;#34;Splitting string &lt;/span&gt;&lt;span style="color:#cd5555"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#cd5555"&gt;%s&lt;/span&gt;&lt;span style="color:#cd5555"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#cd5555"&gt; into tokens:&lt;/span&gt;&lt;span style="color:#cd5555"&gt;\n&lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;,str);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pch = &lt;span style="color:#008b45"&gt;strtok&lt;/span&gt;(str,delim);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;while&lt;/span&gt; (pch != &lt;span style="color:#658b00"&gt;NULL&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;printf&lt;/span&gt; (&lt;span style="color:#cd5555"&gt;&amp;#34;%s&lt;/span&gt;&lt;span style="color:#cd5555"&gt;\n&lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;,pch);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pch = &lt;span style="color:#008b45"&gt;strtok&lt;/span&gt; (&lt;span style="color:#658b00"&gt;NULL&lt;/span&gt;, delim);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;system&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;pause&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;執行結果如下圖：&lt;/p&gt;</description></item><item><title>[編輯器] CKeditor 更換 background-color and font-size</title><link>https://blog.wu-boy.com/2010/03/%E7%B7%A8%E8%BC%AF%E5%99%A8-ckeditor-%E6%9B%B4%E6%8F%9B-background-color-and-font-size/</link><pubDate>Tue, 30 Mar 2010 12:21:52 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/03/%E7%B7%A8%E8%BC%AF%E5%99%A8-ckeditor-%E6%9B%B4%E6%8F%9B-background-color-and-font-size/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/4476260884/" title="Flickr 上 appleboy46 的 logo"&gt;&lt;img src="https://i2.wp.com/farm5.static.flickr.com/4024/4476260884_a9464cf0e5_o.png?resize=182%2C134&amp;#038;ssl=1" alt="logo" data-recalc-dims="1" /&gt;&lt;/a&gt; 相信大家在製作 Web 過程，一定會用到編輯器，然而 &lt;a href="http://ckeditor.com/"&gt;CKeditor&lt;/a&gt; 前身 &lt;a href="http://zh.wikipedia.org/zh-tw/FCKeditor"&gt;FCKeditor&lt;/a&gt; 非常有名，FCKeditor 運行了六年之久，在去年2009年的時候，轉換成了 CKeditor，目前開發團隊也專注於此版本，現在已經推出到 &lt;a href="http://ckeditor.com/blog/CKEditor_3.2_released"&gt;CKEditor 3.2 released!&lt;/a&gt;，可以參考 &lt;a href="http://docs.cksource.com/CKEditor_3.x/Developers_Guide"&gt;CKEditor 3.x - Developer&amp;rsquo;s Guide&lt;/a&gt;，裡面也整合了 &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;，替很多開發者想到更多管道去整合網站，然而今天設計網站，需要改變編輯器的背景顏色，預設是白色背景，但是並非所有網站都是白色呈現，所以才需要動到背景顏色，這樣好讓使用者可以融入整個背景，在 &lt;a href="http://plurk.com"&gt;Plurk&lt;/a&gt; 發表了這問題，也找了官方論壇，都沒有發現正確解答，官方論壇有篇類似問題：&lt;a href="http://goo.gl/3iyL"&gt;Change the background color of the CKEditor text area&lt;/a&gt;，這篇自己試過是沒有用的，正確解法可以參考 CKeditor 的 &lt;a href="http://docs.cksource.com/ckeditor_api/"&gt;API&lt;/a&gt;:&lt;a href="http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.config.html#.contentsCss"&gt;contentsCss&lt;/a&gt;。 1. 首先在 CKeditor 根目錄建立新檔案：mysitestyles.css&lt;/p&gt;
&lt;pre class="brush: css; title: ; notranslate" title=""&gt;body
{
 /* Font */
 font-family: Arial, Verdana, sans-serif;
 font-size: 12px;

 /* Text color */
 color: #f0f0f0;

 /* Remove the background color to make it transparent */
 background-color: #353c42;
}

html
{
 /* #3658: [IE6] Editor document has horizontal scrollbar on long lines
 To prevent this misbehavior, we show the scrollbar always */
 _overflow-y: scroll
}

img:-moz-broken
{
 -moz-force-broken-image-icon : 1;
 width : 24px;
 height : 24px;
}
img, input, textarea
{
 cursor: default;
}&lt;/pre&gt; 2. 設定 config.js 檔案(Ckeditor 目錄裡面) 
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;CKEDITOR.editorConfig = function( config )
{
	// Define changes to default configuration here. For example:
	// config.language = 'fr';
	config.uiColor = '#AADC6E';
	config.contentsCss = '/path/ckeditor/mysitestyles.css';
};&lt;/pre&gt; 重點在於 
&lt;p&gt;&lt;span style="color:green"&gt;config.contentsCss = &amp;lsquo;/path/ckeditor/mysitestyles.css&amp;rsquo;;&lt;/span&gt; 這行，在 Path 部份，請注意由根目錄開始寫起喔。 另外解法，就是用 &lt;a href="http://docs.cksource.com/CKEditor_3.x/Developers_Guide/jQuery_Adapter"&gt;jQuery Adapter&lt;/a&gt;，header 加入：&lt;/p&gt;</description></item><item><title>Apache 取得透過 Reverse Proxy (Varnish) 的 Client 真正 IP (mod_rpaf)</title><link>https://blog.wu-boy.com/2010/03/apache-%E5%8F%96%E5%BE%97%E9%80%8F%E9%81%8E-reverse-proxy-varnish-%E7%9A%84-client-%E7%9C%9F%E6%AD%A3-ip-mod_rpaf/</link><pubDate>Thu, 25 Mar 2010 17:21:51 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/03/apache-%E5%8F%96%E5%BE%97%E9%80%8F%E9%81%8E-reverse-proxy-varnish-%E7%9A%84-client-%E7%9C%9F%E6%AD%A3-ip-mod_rpaf/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/4462939520/" title="Flickr 上 appleboy46 的 feather"&gt;&lt;img src="https://i1.wp.com/farm3.static.flickr.com/2705/4462939520_26be3f6fa9_o.gif?resize=356%2C107&amp;#038;ssl=1" alt="feather" data-recalc-dims="1" /&gt;&lt;/a&gt; 之前介紹 &lt;a href="http://blog.wu-boy.com/2010/03/21/2054/"&gt;[FreeBSD]high performance caching reverse proxy: Varnish (安裝架設篇)&lt;/a&gt; 來當 Web 前端 &lt;a href="http://en.wikipedia.org/wiki/Reverse_proxy"&gt;Reverse Proxy&lt;/a&gt;，也有 &lt;a href="http://en.wikipedia.org/wiki/Load_balancing_(computing)"&gt;load balance&lt;/a&gt; 的功能，不過碰到這樣的環境，後端 &lt;a href="http://www.apache.org/"&gt;Apache&lt;/a&gt; Server 只會抓到 Reverse Proxy IP 來當作 log 紀錄，而無法正確取得 Client 端 IP，&lt;a href="http://varnish-cache.org/"&gt;Varnish&lt;/a&gt; 官網 &lt;a href="http://varnish-cache.org/wiki/FAQ"&gt;FAQ&lt;/a&gt; 有提到 log 檔案得的解決方法，不過在程式方面，要大量的修改，假設今天 Apache 跑10個 &lt;a href="http://httpd.apache.org/docs/2.0/vhosts/examples.html"&gt;Virtual Host&lt;/a&gt; ，不就要去改10個網站程式，背後或許是一些大型 open source 的 Project，改起來相當不容易，也很費工夫。&lt;a href="http://blog.darkhero.net/"&gt;Darkhero&lt;/a&gt; 提供了 &lt;a href="http://stderr.net/apache/rpaf/"&gt;reverse proxy add forward module for Apache (mod_rpaf)&lt;/a&gt; 模組，只要裝上這模組，Apache 就不必動到其它設定就可以正確紀錄 log 檔案，且程式都不必修改，就可以得到正確 IP 了。 FreeBSD Ports 安裝方式：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;cd /usr/ports/www/mod_rpaf2/
make install clean&lt;/pre&gt; 修改 httpd.conf (FreeBSD: /usr/local/etc/apache22/httpd.conf) 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;LoadModule rpaf_module libexec/apache22/mod_rpaf.so&lt;/pre&gt; 將上面 unmask，最後面加上： 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;RPAFenable On
RPAFsethostname On
RPAFproxy_ips xxx.xxx.xxx.xxx 127.0.0.1
RPAFheader X-Forwarded-For&lt;/pre&gt;</description></item><item><title>在 IE8 FireFox Chrome CSS 置中解決方法</title><link>https://blog.wu-boy.com/2010/03/%E5%9C%A8-ie8-firefox-chrome-css-%E7%BD%AE%E4%B8%AD%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95/</link><pubDate>Mon, 22 Mar 2010 13:40:54 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/03/%E5%9C%A8-ie8-firefox-chrome-css-%E7%BD%AE%E4%B8%AD%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;在 IE8 還沒出來之前，都是利用 margin: 0 auto; 的方式來解決 div 置中的問題，但是這在 IE8 並沒有發揮作用，無效了，底下在網路上發現兩種解法，分享給大家知道： &lt;strong&gt;&lt;span style="color:green;font-size:1.2em"&gt;1. Width:100%&lt;/span&gt;&lt;/strong&gt; 在最外層 div 加入 Width:100% 的屬性，程式碼如下：&lt;/p&gt;
&lt;pre class="brush: css; title: ; notranslate" title=""&gt;#container {width:100%;}
#centered {width:400px; margin:0 auto;}&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="color:green;font-size:1.2em"&gt;2. Text-Align:Center&lt;/span&gt;&lt;/strong&gt; 在 div tag 裡面加入 Text-Align:Center，這樣 IE8 會偵測到此語法，就會服從 margin:0 auto; 之屬性，不過這樣內容會被全部至中，如果您有需要將其 div 內容往左邊對齊，那就必須在加上語法 Text-Align:left，底下是範例程式碼：&lt;/p&gt;
&lt;pre class="brush: css; title: ; notranslate" title=""&gt;#container {text-align:center;}
#centered {width:400px; margin:0 auto;text-align:left;}&lt;/pre&gt; IE6，IE7 則是利用下面語法： 
&lt;pre class="brush: css; title: ; notranslate" title=""&gt;#wrap {
 margin: 0px auto; /* firefox */
 *margin: 0px auto; /* ie7 */
 _margin: 0px auto; /* ie6 */
 height:100px; 
 width:860px;
 border:5px solid red; 
}&lt;/pre&gt; reference: 
&lt;p&gt;&lt;a href="http://stever.ca/web-design/centering-a-div-in-ie8-using-marginauto/"&gt;Centering a Div in IE8 Using margin:auto&lt;/a&gt; &lt;a href="http://www.flycan.com/board/topic3374.html"&gt;【CSS 語法教學】區塊置中的三種寫法&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[FreeBSD]high performance caching reverse proxy: Varnish (安裝架設篇)</title><link>https://blog.wu-boy.com/2010/03/freebsdhigh-performance-caching-reverse-proxy-varnish-and-how-to-install-it/</link><pubDate>Sat, 20 Mar 2010 16:12:44 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/03/freebsdhigh-performance-caching-reverse-proxy-varnish-and-how-to-install-it/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/4445679996/" title="Flickr 上 appleboy46 的 varnish-logo-red-64"&gt;&lt;img src="https://i2.wp.com/farm3.static.flickr.com/2695/4445679996_0a9d597a94_o.gif?resize=235%2C64&amp;#038;ssl=1" alt="varnish-logo-red-64" data-recalc-dims="1" /&gt;&lt;/a&gt; 在上禮拜跟 &lt;a href="http://blog.darkhero.net"&gt;DarkHero&lt;/a&gt; 兄聊到 &lt;a href="http://blog.darkhero.net/?p=391"&gt;How To Build a Scalable Web Site (3/6)&lt;/a&gt; 的上課講義，互相討論了 MySQL Load balance 以及 http &lt;a href="http://en.wikipedia.org/wiki/Reverse_proxy"&gt;reverse proxy&lt;/a&gt; 的方式，以前自己有用 &lt;a href="http://haproxy.1wt.eu/"&gt;HAProxy&lt;/a&gt; 當作 Web 平衡負載，順便紀錄了 &lt;a href="http://blog.wu-boy.com/2008/06/23/283/"&gt;HAProxy FreeBSD 安裝方式&lt;/a&gt;，這次要來介紹今天重點：&lt;a href="http://varnish-cache.org/"&gt;Varnish Cache Server&lt;/a&gt;，在近幾年流行的 Caching 機制，大家會想到 Squid，只要您設定良好的 Squid 參數，它一定運作的非常穩定，然而它的核心依然是 forward proxy，要架設成 Reverse Proxy 還必需要設定一些參數才可以達到，是有一定的困難性，然而 Varnish Cache Server 底層就是高效能 caching reverse proxy，也因為 Squid 是 1980 年發展出來的，程式架構過於老舊，可以參考 &lt;a href="http://varnish-cache.org/wiki/ArchitectNotes"&gt;ArchitectNotes&lt;/a&gt; 瞭解這部份詳情。也許您會問到 Varnish 可以架設成 forward proxy 嗎？答案是可以的，但是您也許不會這麼做，因為它需要 DNS 技術，以及需要一個非常大且複雜的 Varnish VCL(Varnish Configuration Language) file。 1. 今天要介紹如何在 FreeBSD 系統安裝，在介紹之前，系統必須先安裝好 apache，這樣才可以正確啟動，利用 ports 安裝：&lt;/p&gt;</description></item><item><title>[Vim] 想套用 *.php syntax 顏色於 *.ros</title><link>https://blog.wu-boy.com/2010/03/vim-%E6%83%B3%E5%A5%97%E7%94%A8-php-syntax-%E9%A1%8F%E8%89%B2%E6%96%BC-ros/</link><pubDate>Tue, 16 Mar 2010 05:38:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/03/vim-%E6%83%B3%E5%A5%97%E7%94%A8-php-syntax-%E9%A1%8F%E8%89%B2%E6%96%BC-ros/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/4436671479/" title="Flickr 上 appleboy46 的 vim_header"&gt;&lt;img src="https://i2.wp.com/farm5.static.flickr.com/4018/4436671479_0596c469d4_o.gif?resize=180%2C45&amp;#038;ssl=1" alt="vim_header" data-recalc-dims="1" /&gt;&lt;/a&gt; &lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; 是一套強大的編輯器，它分佈於各大 UNIX systems，安裝好一套 UNIX 系統，預設就是 Vi 編輯器(&lt;a href="http://www.freebsd.org"&gt;FreeBSD&lt;/a&gt; 預設是 ee)，相當好用，他也支援各種語言的 syntax，讓您在編輯檔案能夠看到各種不同顏色，在 FreeBSD 底下可以去看 /usr/local/share/vim/vim64/syntax/ 該資料夾支援各種語言，例如 PHP、Ruby、css、html、java、C/C++…等，假設今天我們想要 .ros 的副檔名需要用 php.vim syntax 來開啟，就必須做底下設定： 執行底下：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;mkdri ~/.vim
vi ~/.vim/filetype.vim &lt;/pre&gt; 寫入 filetype.vim 資訊 if version &lt; 600 syntax clear elseif exists("b:current_syntax") finish endif augroup filetypedetect au! BufRead,BufNewFile *.ros setfiletype php augroup END[/code] ps. on freebsd 7.1-RELEASE-p11 vim version 6.4.9 reference: 
&lt;p&gt;&lt;a href="http://fourdollars.blogspot.com/2009/05/vim-markdown-syntax.html"&gt;Vim 套用 Markdown syntax&lt;/a&gt; &lt;a href="http://blog.longwin.com.tw/archives/000021.html"&gt;vi 設定&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[FreeBSD] DenyHosts 設定在 hosts.allow 注意事項</title><link>https://blog.wu-boy.com/2010/03/freebsd-denyhosts-%E8%A8%AD%E5%AE%9A%E5%9C%A8-hosts-allow-%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85/</link><pubDate>Thu, 11 Mar 2010 10:13:29 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/03/freebsd-denyhosts-%E8%A8%AD%E5%AE%9A%E5%9C%A8-hosts-allow-%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/4424616360/" title="Flickr 上 appleboy46 的 denyhosts"&gt;&lt;img src="https://i1.wp.com/farm5.static.flickr.com/4062/4424616360_8f2af7881e_o.png?resize=347%2C73&amp;#038;ssl=1" alt="denyhosts" data-recalc-dims="1" /&gt;&lt;/a&gt; &lt;a href="http://denyhosts.sourceforge.net/"&gt;DenyHosts&lt;/a&gt; 是一套用 &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; 跟 shell script 寫出來的 open source base on Linux or FreeBSD (/var/log/secure on Redhat, /var/log/auth.log on Mandrake, FreeBSD, etc&amp;hellip;)，用來阻擋 SSH Server 被攻擊，之前寫一篇 &lt;a href="http://blog.wu-boy.com/2008/12/26/663/" alt="[FreeBSD]利用 DenyHosts 軟體擋掉暴力破解 ssh 的使用者"&gt;FreeBSD 安裝設定教學&lt;/a&gt;，有一點沒有注意到，就是打開 /etc/hosts.allow，注意要把 ALL : ALL : allow 放到最後一行，跟 iptables 設定原理是一樣的，會從第一條規則開始比對，如果比對成功，下面的 rule 就會略過比對了，參考英文說明：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Start by allowing everything (this prevents the rest of the file from working, so remove it when you need protection). The rules here work on a &amp;ldquo;First match wins&amp;rdquo; basis. /etc/hosts.deny 已經被 FreeBSD 棄用，所以必須把 allow 跟 deny 的 rule 都寫到 hosts.allow 檔案裡面才是正確的&lt;/p&gt;</description></item><item><title>[C/C++] 計算二進位任意數含有多少個位元為1?</title><link>https://blog.wu-boy.com/2010/02/cc-%E8%A8%88%E7%AE%97%E4%BA%8C%E9%80%B2%E4%BD%8D%E4%BB%BB%E6%84%8F%E6%95%B8%E5%90%AB%E6%9C%89%E5%A4%9A%E5%B0%91%E5%80%8B%E4%BD%8D%E5%85%83%E7%82%BA1/</link><pubDate>Wed, 24 Feb 2010 15:17:17 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/02/cc-%E8%A8%88%E7%AE%97%E4%BA%8C%E9%80%B2%E4%BD%8D%E4%BB%BB%E6%84%8F%E6%95%B8%E5%90%AB%E6%9C%89%E5%A4%9A%E5%B0%91%E5%80%8B%E4%BD%8D%E5%85%83%E7%82%BA1/</guid><description>&lt;p&gt;今天看到一個有趣的題目，就是計算二進位任意數值，其中包含了幾個1，這非常有趣，利用每個 bit 做&amp;amp;就可以解出這個問題了:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-15"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-16"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-17"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-18"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-18"&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-19"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-19"&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-20"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-20"&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-21"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-21"&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-22"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-22"&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#include&lt;/span&gt; &lt;span style="color:#1e889b"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#1e889b"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#include&lt;/span&gt; &lt;span style="color:#1e889b"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span style="color:#1e889b"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; &lt;span style="color:#008b45"&gt;bitcount&lt;/span&gt;(&lt;span style="color:#00688b;font-weight:bold"&gt;unsigned&lt;/span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; &lt;span style="color:#008b45"&gt;main&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; count = &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;, a;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; a = &lt;span style="color:#b452cd"&gt;1023&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; count = &lt;span style="color:#008b45"&gt;bitcount&lt;/span&gt;(a);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;printf&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;%d有%d個位元為1&lt;/span&gt;&lt;span style="color:#cd5555"&gt;\n\n&lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;, a, count);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;system&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;pause&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; &lt;span style="color:#008b45"&gt;bitcount&lt;/span&gt;(&lt;span style="color:#00688b;font-weight:bold"&gt;unsigned&lt;/span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; n)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; count = &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;while&lt;/span&gt; (n)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; count++ ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; n &amp;amp;= (n - &lt;span style="color:#b452cd"&gt;1&lt;/span&gt;) ; &lt;span style="color:#228b22"&gt;//關鍵演算之處
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; count ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;關鍵解法是在 n &amp;amp;= (n - 1) ; 這個地方，為什麼會是這樣寫呢，大家可以想看看，為什麼要 (n-1)，其實可以帶數字進去跑看看就知道程式為什麼會這樣寫，這個 case 可以分作兩種，數值可能會有兩種狀況，一種是奇數，另一種就是偶數，8 代表 1000，9 代表 1001，最右邊 bit 是 1 代表奇數，剩下的都是偶數，拿9當例子帶入 while 迴圈試試看，首先將 count + 1，接下來 1001 會跟 1000 做相乘動作，就會變成 1000，接下來跑另一次 while 會變成 1000 &amp;amp; 0111 就會變成 0 了，退出 while 迴圈，所以結論是 (n -1) 的用意是去掉一個 1 位元 bit，就像 [xxxx10 &amp;hellip; 0] -1 = [xxxx01 &amp;hellip; 1] &amp;hellip;. 每運算一次相乘，就會少掉一個 1，原理就是這麼簡單。&lt;/p&gt;</description></item><item><title>製作 Windows XP USB 開機系統 (模擬光碟開機)</title><link>https://blog.wu-boy.com/2010/02/%E8%A3%BD%E4%BD%9C-windows-xp-usb-%E9%96%8B%E6%A9%9F%E7%B3%BB%E7%B5%B1-%E6%A8%A1%E6%93%AC%E5%85%89%E7%A2%9F%E9%96%8B%E6%A9%9F/</link><pubDate>Mon, 15 Feb 2010 08:37:03 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/02/%E8%A3%BD%E4%BD%9C-windows-xp-usb-%E9%96%8B%E6%A9%9F%E7%B3%BB%E7%B5%B1-%E6%A8%A1%E6%93%AC%E5%85%89%E7%A2%9F%E9%96%8B%E6%A9%9F/</guid><description>&lt;p&gt;最近幫朋友重灌一台電腦，發現他是 &lt;a href="http://h50178.www5.hp.com/support/NQ202PA/faqs/114163.html?jumpid=reg_R1002_TWZH"&gt;HP Mini 1109TU&lt;/a&gt;，沒有內建光碟機，然後朋友又沒買外接式光碟機，所以只好趕快上網找如何製作 Windows XP USB 系統，如果是 Linux 系列就好辦了，網路上找到&lt;a href="http://wiki.ubuntu-tw.org/index.php?title=UNetbootin%EF%BC%9A%E5%8F%AF%E8%A3%BD%E4%BD%9C_Linux_Live_USB_%E7%9A%84%E7%A8%8B%E5%BC%8F"&gt;一堆關於 Linux 教學文件&lt;/a&gt;，後來在 &lt;a href="http://www.mobile01.com"&gt;mobile01&lt;/a&gt; 找到一篇：『&lt;a href="http://www.mobile01.com/topicdetail.php?f=159&amp;amp;t=665722"&gt;[教學]將USB 隨身碟 製成 XP 的安裝碟 (模擬CD-ROM)&lt;/a&gt;』，裡面的安裝過程我全部測試過了，可以正常運作，利用 USB 安裝 XP 真的還蠻快的，少了 CD-Rom 的讀取，USB 真的安裝相當快速，不過大家在上面下載的安裝程式，它會先將您的 USB 進行 Fat32 格式化，然後複製 XP 光碟內容到 USB 隨身碟，在設定複製內容到 USB 的同時，請不要將 USB 掛載到 D 槽，因為看了一下程式碼 usb_prep8.cmd 裡面有一段設定 USB 開機選項：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;:_getusb
set _ok=
echo.
echo Please give Target USB-Drive Letter e.g type U
ECHO.
set /p _ok= Enter Target USB-Drive Letter: 
set _ok=!_ok:~0,1!
if not exist !_ok!:\nul (
 echo.
 echo ***** Target USB-Drive !_ok!: does NOT Exist *****
 echo.
 pause
 goto _main
)

FOR %%i IN (E F G H I J K L M N O P Q R S T U V W X Y e f g h i j k l m n o p q r s t u v w x y) DO IF "%%i" == "!_ok!" SET usbdrive=!_ok!:

if "%usbdrive%" == "" ( 
 echo.
 echo ***** !_ok!: is not a valid Drive *****
 echo.
	pause
	goto _main
)&lt;/pre&gt; 在 for 的迴圈裡面，並沒有寫到 D 這個代碼，所以自己把它補上去吧，這樣就可以正常複製光碟內容到 USB 裡面了。</description></item><item><title>[C/C++] 指標相加 = ？or 相減 = offset</title><link>https://blog.wu-boy.com/2010/02/cc-%E6%8C%87%E6%A8%99%E7%9B%B8%E5%8A%A0-%EF%BC%9For-%E7%9B%B8%E6%B8%9B-offset/</link><pubDate>Mon, 08 Feb 2010 06:50:16 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/02/cc-%E6%8C%87%E6%A8%99%E7%9B%B8%E5%8A%A0-%EF%BC%9For-%E7%9B%B8%E6%B8%9B-offset/</guid><description>&lt;p&gt;最近看到網路上討論 C/C++ 題目，某公司主管給新進人員面試的 C/C++ 考題，如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; &lt;span style="color:#008b45"&gt;main&lt;/span&gt;(&lt;span style="color:#00688b;font-weight:bold"&gt;void&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; *a,*b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; a=&lt;span style="color:#b452cd"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; b=&lt;span style="color:#b452cd"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;printf&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;%d&lt;/span&gt;&lt;span style="color:#cd5555"&gt;\n&lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;,a+b);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;請問上面這個題目，哪裡有出問題，這是面試官問新進人員的題目之一，看也知道這程式丟到 &lt;a href="http://www.bloodshed.net/index.html"&gt;Dev-C++&lt;/a&gt; 是不會過的，&lt;em&gt;a&lt;/em&gt; b 都是宣告為整數指標型態，可是在 a=1 或 b=1 在 Dev-C++ 裡面是編譯不過的，但是那寫法是沒有錯的，就像你設定 a=0 或者是 a=NULL 是一樣意思，不過最好是不要這樣寫，assignment 這樣寫不太好，可以改成 a = (int &lt;em&gt;)1; b = (int&lt;/em&gt; )1; 這樣就可以順利編譯通過，再來 printf(&amp;quot;%d\n&amp;quot;,a+b); 這行錯很大，指標相加會爆炸吧，如果程式這樣寫，不把 OS 搞掛，那我還會覺得懷疑呢，正確寫法是指標加上 offset(位移)，這樣才是可以正確執行的，所以我們把程式改成下面：&lt;/p&gt;</description></item><item><title>Google Chrome 支援超過 40,000 Extensions! with Greasemonkey</title><link>https://blog.wu-boy.com/2010/02/google-chrome-%E6%94%AF%E6%8F%B4%E8%B6%85%E9%81%8E-40000-extensions-with-greasemonkey/</link><pubDate>Wed, 03 Feb 2010 15:33:13 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/02/google-chrome-%E6%94%AF%E6%8F%B4%E8%B6%85%E9%81%8E-40000-extensions-with-greasemonkey/</guid><description>&lt;p&gt;看到 &lt;a href="http://blog.chromium.org/"&gt;Google Chrome Blo&lt;/a&gt;g 發表的&lt;a href="http://blog.chromium.org/2010/02/40000-more-extensions.html"&gt;Google Chrome 支援超過 40,000 Extensions!&lt;/a&gt;，當 &lt;a href="http://www.google.com/chrome"&gt;Google Chrome&lt;/a&gt; 瀏覽器剛出來的時候，造成 Web Developer 一些震撼，因為 Chrome 強調的是擁有快速的 Javascript 引擎，以及快速的啟動，Fast start-up、Fast loading、Fast search，也因此讓很多設計網站的工程師必須把 Chrome 的支援性考慮進去，但是由於剛推出的瀏覽器，沒有任何外掛功能，我本身用 &lt;a href="http://www.mozilla.com/en-US/firefox/upgrade.html"&gt;FireFox&lt;/a&gt; 瀏覽器很多年了，FireFox 的&lt;a href="https://addons.mozilla.org/zh-TW/firefox/"&gt;附加元件&lt;/a&gt;讓許多程式設計師投入開發，也製造出很多方便的附加元件來讓大家使用，例如：&lt;a href="https://addons.mozilla.org/zh-TW/firefox/addon/1843"&gt;FireBug&lt;/a&gt;、&lt;a href="https://addons.mozilla.org/zh-TW/firefox/addon/1320"&gt;Gmail Manager&lt;/a&gt;、&lt;a href="https://addons.mozilla.org/zh-TW/firefox/addon/748"&gt;Greasemonkey&lt;/a&gt;…，然而 FireFox 最方便的就是 &lt;a href="http://en.wikipedia.org/wiki/Greasemonkey"&gt;Greasemonkey&lt;/a&gt; 此附加元件，使用者可以撰寫簡單 Javascript 語言來跟指定網站進行元件控制，現在 Google 工程師聽到我們的聲音了，Google Chrome 4 加入 Greasemonkey user scripts 功能，大家可以到 &lt;a href="http://www.userscripts.org/"&gt;userscripts.org&lt;/a&gt; 下載超過 40,000 script 安裝到 Chrome 瀏覽器。您可以在 blogger 使用 &lt;a href="http://userscripts.org/scripts/show/67384"&gt;emoticons&lt;/a&gt;，大家可以去參考看看。 由於 Chrome 支援了 Greasemonkey，所以趕快把 FireFox 所安裝的 script，也安裝到 Chrome，可是我發現之前 &lt;a href="http://blog.gslin.org"&gt;DarkKiller&lt;/a&gt; 大神寫的 &lt;a href="http://userscripts.org/scripts/show/12267"&gt;Wretch Album Expander&lt;/a&gt; 已經不能用了，所以我將它實做到 Chrome，可以從這裡下載安裝：&lt;a href="http://userscripts.org/scripts/show/67929"&gt;Wretch Album Expander for Google Chrome or FireFox&lt;/a&gt;，平時自己偶而會看看&lt;a href="http://www.wretch.cc"&gt;無名小站&lt;/a&gt;，所以也是方便自己觀看照片，此 script 也可以安裝在 FireFox 喔。這樣大家就不用再看圖片還要一張一張慢慢點，只要負責按換頁就可以了 ^^。 來測試看看，隨便找一本無名相簿：&lt;a href="http://www.wretch.cc/album/album.php?id=lafiteho&amp;amp;book=53&amp;amp;page=2"&gt;馬甲‧小葵&lt;/a&gt; ，畫面：&lt;a href="https://farm3.static.flickr.com/2744/4327379085_f9a2834b1d_o.gif" title="馬甲‧小葵 - 2010-02-03 23 27 25 (by appleboy46)"&gt;點我觀看&lt;/a&gt;&lt;/p&gt;</description></item><item><title>phpBB 3.1 版本將不再支援 PHP4</title><link>https://blog.wu-boy.com/2010/02/phpbb-3-1-%E7%89%88%E6%9C%AC%E5%B0%87%E4%B8%8D%E5%86%8D%E6%94%AF%E6%8F%B4-php4/</link><pubDate>Sun, 31 Jan 2010 16:40:24 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/02/phpbb-3-1-%E7%89%88%E6%9C%AC%E5%B0%87%E4%B8%8D%E5%86%8D%E6%94%AF%E6%8F%B4-php4/</guid><description>&lt;p&gt;在 &lt;a href="http://www.phpbb.com/"&gt;phpBB&lt;/a&gt; 官方網站看到這篇：『&lt;a href="http://www.phpbb.com/community/viewtopic.php?f=14&amp;amp;t=1958605"&gt;phpBB 3.1 to discontinue support for PHP versions below 5.2&lt;/a&gt;』，內容大致上是說 phpBB 3.0 &amp;ldquo;Olympus&amp;rdquo; 系列的版本將是 phpBB 支援 php 4 最後一個版本，之後所推出的 phpBB 3.1 &amp;ldquo;Ascraeus&amp;rdquo; 版本，PHP 需要 5.2 或者是更高才可以正確執行。隨著 3.1 版本的推出，3.0 將會繼續維護 6~9 個月的時間，這版本將會繼續維持相容於 php 4 系統。 由於 phpBB 3.1 還處於開發的階段，尚未決定發佈日期，所以大家還是有很多時間可以將 php 升級到 5.2.0 或者是更高。看到 phpBB 可以捨棄 php 4 還蠻高興的，自己本身玩 phpBB 多年，看到 2.0 到 3.0 的變化蠻大的，php 4 安全姓做的非常不好，所以導致 code 非常隴長，希望 3.1 可以快點推出。&lt;/p&gt;</description></item><item><title>Google Chrome 推出 4.0 穩定版 &amp; Mozilla 推出 FireFox 3.6</title><link>https://blog.wu-boy.com/2010/01/google-chrome-%E6%8E%A8%E5%87%BA-4-0-%E7%A9%A9%E5%AE%9A%E7%89%88-mozilla-%E6%8E%A8%E5%87%BA-firefox-3-6/</link><pubDate>Fri, 29 Jan 2010 04:07:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/01/google-chrome-%E6%8E%A8%E5%87%BA-4-0-%E7%A9%A9%E5%AE%9A%E7%89%88-mozilla-%E6%8E%A8%E5%87%BA-firefox-3-6/</guid><description>&lt;p&gt;&lt;a href="http://www.mozilla.com/"&gt;Mozilla&lt;/a&gt; 在上禮拜 (2010.01.22) 推出了 &lt;a href="http://moztw.org/firefox/releases/3.6/"&gt;FireFox 3.6&lt;/a&gt;，大家可以下載測試效能如何，也可以 follow &lt;a href="http://www.plurk.com/foxmosa"&gt;狐耳摩莎的 Plurk&lt;/a&gt; 來收到 MozTW 的最新資訊，這篇重點不是在 FireFox，而是 &lt;a href="http://www.google.com"&gt;Google&lt;/a&gt; 正式推出 Windows 版本 &lt;a href="http://chrome.blogspot.com/2010/01/over-1500-new-features-for-google.html"&gt;new Chrome 4.0 stable release&lt;/a&gt;，4.0 版本已經可以正式使用 &lt;a href="http://code.google.com/chrome/extensions/"&gt;Google Extensions&lt;/a&gt;，之前在3.0版本，只能安裝 &lt;a href="http://www.google.com/landing/chrome/beta/"&gt;Chrome Beta&lt;/a&gt; 版本才可以使用 extension，現在只要將 Windows Google Chrome 升級成 Stable 版本，就可以全面使用 Extensions，可以使用&lt;a href="http://www.google.com/support/chrome/bin/answer.py?hl=en&amp;amp;answer=95414"&gt;手動升級&lt;/a&gt;，或者是在下禮拜就會自動 update 到最新版本。 &lt;a href="https://www.flickr.com/photos/appleboy/4305644720/" title="Google Chrome 4.0 (by appleboy46)"&gt;&lt;img src="https://i0.wp.com/farm3.static.flickr.com/2710/4305644720_fde6433a9c.jpg?resize=500%2C249&amp;#038;ssl=1" title="Google Chrome 4.0 (by appleboy46)" alt="Google Chrome 4.0 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 最後可以參考 &lt;a href="http://blog.ericsk.org/"&gt;ericsk&lt;/a&gt; 大大所寫的&lt;a href="http://blog.ericsk.org/archives/1389"&gt;從開發者角度看 Chrome 4 的推出&lt;/a&gt; Reference: &lt;a href="http://googlecode.blogspot.com/2010/01/extensibility-new-html-and-javascript.html"&gt;Extensibility + new HTML and JavaScript APIs for Google Chrome&lt;/a&gt; &lt;a href="http://blog.chromium.org/2010/01/more-resources-for-developers.html"&gt;More Resources for Developers&lt;/a&gt;&lt;/p&gt;</description></item><item><title>How to change run levels and init.d scripts in Ubuntu &amp; Debian</title><link>https://blog.wu-boy.com/2010/01/how-to-change-run-levels-and-init-d-scripts-in-ubuntu-debian/</link><pubDate>Thu, 28 Jan 2010 02:15:27 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/01/how-to-change-run-levels-and-init-d-scripts-in-ubuntu-debian/</guid><description>&lt;p&gt;&lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Ubuntu_%28operating_system%29#Releases"&gt;6.10 (Edgy Eft)&lt;/a&gt; 之後使用 &lt;a href="http://en.wikipedia.org/wiki/Upstart"&gt;Upstart&lt;/a&gt; 代替原來的 sysinit，而 init 是用來管理 Upstart 的 Daemon，本來系統預設的 runlevel 可以在 /boot/menu.list 或者是 /etc/inittab，可是現在這檔案已經移除了，取而代之的就是 Upstart 管理，可以利用 &lt;a href="http://wiki.linuxquestions.org/wiki/Telinit"&gt;telinit&lt;/a&gt; 來改變系統 runlevel，然而現在 runlevel 的定義跟以前不太一樣了，原先 Ubuntu 跟 Fedora 系列 runlevel 代表意義如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;0:系統關機 (to halt the system) 1:單一使用者模式 (single-user mode) 2:尚未使用（可由使用者定義） 3:多使用者模式 (文字介面登入) 4:尚未使用 (可由使用者定義) 5:多使用者模式 (含有一個X介面的登入畫面) 6:重新開機 (reboot the system) 轉換成 Upstart 的話，就會變成底下&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;0:系統關機 (to halt the system) 1:單一使用者模式 (single-user mode) 2:多使用者模式 (含有一個X介面的登入畫面) 3:多使用者模式 (含有一個X介面的登入畫面) 4:多使用者模式 (含有一個X介面的登入畫面) 5:多使用者模式 (含有一個X介面的登入畫面) 6:重新開機(reboot the system) 上面資訊可以在 man telinit 裡面找到，寫得很詳細，現在 Ubuntu 9.10 系統，預設啟用是在 runlevel 2，只要執行 runlevle 指令，就可以查出先前跟目前所設定的 runlevel 值，這些數值是存放在 /var/run/utmp，這是一個 &lt;a href="http://en.wikipedia.org/wiki/Utmp"&gt;UTMP File&lt;/a&gt;，你會發現，現在只要安裝好 Ubuntu Desktop 系統，就會自動啟動，所以常常會看到 Linux 使用者會來詢問如何關閉 gdm 桌面程式，其實有很多手動的方式，init 也管理了開機所需執行的程式，如果是跑 runlevel 2，就會去執行 /etc/rc2.d/* 底下所有的 script 檔案，所以大家可以發現會有 /etc/rcX.d/ (X:0,1,2,3,4,5,6,S)，其中的 S 代表 single user mode，我們用 rc2.d 底下的檔案來說明： &lt;a href="https://www.flickr.com/photos/appleboy/4310037627/" title="/ect/rcX.d/ all script (by appleboy46)"&gt;&lt;img src="https://i1.wp.com/farm5.static.flickr.com/4028/4310037627_a22f2ec884.jpg?resize=500%2C254&amp;#038;ssl=1" title="/ect/rcX.d/ all script (by appleboy46)" alt="/ect/rcX.d/ all script (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 大家可以看到，每個檔案命名方式：[S|K]\d{2}script_name，S 代表開機會啟動，K 代表開機不啟動，後面接兩位數字，代表開機優先權順序，這些檔案都是利用 Soft link 方式連接到 /etc/init.d/ 底下，所以修改 /etc/init.d/ 資料夾檔案內容，就可以自動更新 /etc/rc[0-6].d/ 檔案，相當方便吧，那該如何產生對應檔案到 /etc/rc[0-6].d/ 資料夾底下，可以利用 &lt;a href="http://wiki.linuxquestions.org/wiki/Update-rc.d"&gt;update-rc.d&lt;/a&gt; 這指令，update-rc.d 是用來產生或移除 init script links，可以參考 &lt;a href="http://www.debian.org/doc/debian-policy/#contents"&gt;Debian Policy Manual&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>遲來的 jQuery 1.4 Released</title><link>https://blog.wu-boy.com/2010/01/%E9%81%B2%E4%BE%86%E7%9A%84-jquery-1-4-released/</link><pubDate>Thu, 21 Jan 2010 09:37:07 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/01/%E9%81%B2%E4%BE%86%E7%9A%84-jquery-1-4-released/</guid><description>&lt;p&gt;為了慶祝 &lt;a href="http://jquery14.com/day-01"&gt;jQuery&lt;/a&gt; 四週年慶，官方網站終於 Release 1.4 版本了，也大幅度修改了 &lt;a href="http://api.jquery.com/"&gt;jQuery API 網站&lt;/a&gt;，跟以往一樣，jQuery 提供兩種版本讓大家測試跟下載：&lt;a href="http://code.jquery.com/jquery-1.4.min.js"&gt;jQuery Minified&lt;/a&gt; (23kb Gzipped)，這版本是利用 &lt;a href="http://code.google.com/closure/compiler/"&gt;Google Closure Compiler&lt;/a&gt; 去壓縮，以往好像是用 &lt;a href="http://developer.yahoo.com/yui/compressor/"&gt;YUI Compressor&lt;/a&gt;，另一版本就是沒經過壓縮：&lt;a href="http://code.jquery.com/jquery-1.4.js"&gt;jQuery Regular&lt;/a&gt; (154kb)，當然 Google 也提供了 host 來讓 jQuery 有 cache 檔案作用，增加網站速度： &lt;a href="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"&gt;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&lt;/a&gt; 1.4 版本的出來，最主要就是效能的改善，以及整個 Code Base 翻修，可以參考 &lt;a href="http://ejohn.org/blog/"&gt;John Resig&lt;/a&gt; 寫的 &lt;a href="http://ejohn.org/blog/function-call-profiling/"&gt;JavaScript Function Call Profiling&lt;/a&gt;，看到底下的圖，就大致上知道 1.4 的效能改善 &lt;a href="https://www.flickr.com/photos/appleboy/4292816426/" title="4271690739_f0bced3a78 (by appleboy46)"&gt;&lt;img src="https://i2.wp.com/farm3.static.flickr.com/2771/4292816426_9fb5cb331a_o.jpg?resize=500%2C375&amp;#038;ssl=1" title="4271690739_f0bced3a78 (by appleboy46)" alt="4271690739_f0bced3a78 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; &lt;a href="http://api.jquery.com/css/"&gt;.css()&lt;/a&gt; and &lt;a href="http://api.jquery.com/attr/"&gt;.attr()&lt;/a&gt; 效能改善圖： &lt;a href="https://www.flickr.com/photos/appleboy/4292818140/" title="4271691147_fd72853fa4 (by appleboy46)"&gt;&lt;img src="https://i2.wp.com/farm5.static.flickr.com/4037/4292818140_753f22920f_o.jpg?resize=500%2C375&amp;#038;ssl=1" title="4271691147_fd72853fa4 (by appleboy46)" alt="4271691147_fd72853fa4 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 整篇都在說明 jQuery 效能的部份，真的是改善很多，&lt;a href="http://mediatemple.net/"&gt;Media Temple&lt;/a&gt; 主機商也贊助 jQuery 14天的徵文活動，大家可以上去看看有很多影片都是在介紹 jQuery，最後得獎的人可以獲得 13&amp;quot; MacBook Pro，真是太吸引人了。 最後可以參考 &lt;a href="http://blog.darkthread.net/blogs/"&gt;黑暗執行緒&lt;/a&gt;大大寫的：&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/01/16/jquery-1-4.aspx"&gt;jQuery 1.4 小閱兵&lt;/a&gt;&lt;/p&gt;</description></item><item><title>How to install Google Web Toolkit with Eclipse</title><link>https://blog.wu-boy.com/2010/01/how-to-install-google-web-toolkit-with-eclipse/</link><pubDate>Sun, 17 Jan 2010 11:27:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/01/how-to-install-google-web-toolkit-with-eclipse/</guid><description>&lt;p&gt;&lt;a href="http://code.google.com/webtoolkit/"&gt;Google Web Toolkit&lt;/a&gt; (簡稱：GWT)是先以 Java 語言編寫 AJAX 應用程式網頁，然後在編譯成最佳化 Javascript，不但幫助了剛入門 Javascrit，然後又需要撰寫 AJAX 應用程式的工程師很大的幫助，不僅如此，&lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt; 也提供了 Java 跟 Python 環境，整合了 GWT，讓您可以上傳到 GAE 的空間進行測試，GWT 目的是產生具有高效能性的 Web 應用程式，您不需要是 Javascript 專家也可以做到，GWT 用在 Google 相當多的服務，例如 &lt;a href="https://wave.google.com/"&gt;Google Wave&lt;/a&gt;, 新版的 &lt;a href="https://adwords.google.com/"&gt;Google AdWords&lt;/a&gt; 可以參考&lt;a href="http://code.google.com/webtoolkit/examples/#real-world-projects" target="_blank"&gt;這裡&lt;/a&gt;更多實際範例。它是開放姓原始碼(open source)，完全免費，您也可以參與 GWT 的開發。 &lt;a href="http://code.google.com/intl/en/eclipse/index.html"&gt;Google Plugin for Eclipse&lt;/a&gt; 支援 &lt;a href="http://code.google.com/webtoolkit"&gt;Google Web Toolkit&lt;/a&gt; 跟 &lt;a href="http://code.google.com/appengine"&gt;Google App Engine&lt;/a&gt; 開發，我們可以直接安裝此 Plugin 就可以開始上手 GWT，當製作完成之後，就可以上傳到 GAE，直接打開提供的網址就可以看到成果了。 首先安裝 &lt;a href="http://code.google.com/intl/en/eclipse/index.html"&gt;Google Plugin for Eclipse&lt;/a&gt;，先去下載 Eclipse 3.5 (Galileo) 最新版，打開 Eclipse 1. 選擇 Help -&amp;gt; Install New Software &lt;a href="https://www.flickr.com/photos/appleboy/4279125424/" title="Google Web Toolkit (by appleboy46)"&gt;&lt;img title="Google Web Toolkit (by appleboy46)" src="https://i0.wp.com/farm5.static.flickr.com/4006/4279125424_e4a129185e.jpg?resize=500%2C281&amp;#038;ssl=1" alt="Google Web Toolkit (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 2. 在 Work With: 填入 &lt;a href="http://dl.google.com/eclipse/plugin/3.5"&gt;http://dl.google.com/eclipse/plugin/3.5&lt;/a&gt; &lt;a href="https://www.flickr.com/photos/appleboy/4278377917/" title="Google Web Toolkit (by appleboy46)"&gt;&lt;img title="Google Web Toolkit (by appleboy46)" src="https://i2.wp.com/farm3.static.flickr.com/2683/4278377917_2d4dbd0a4c.jpg?resize=500%2C428&amp;#038;ssl=1" alt="Google Web Toolkit (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 3. 將 Plugin 跟 SDKS 全部選取，接下來按下一步就可以完成&lt;/p&gt;</description></item><item><title>[FreeBSD] Fanout and Fanterm Tool to run commands on multiple machines</title><link>https://blog.wu-boy.com/2010/01/freebsd-fanout-and-fanterm-tool-to-run-commands-on-multiple-machines/</link><pubDate>Fri, 08 Jan 2010 07:44:10 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/01/freebsd-fanout-and-fanterm-tool-to-run-commands-on-multiple-machines/</guid><description>&lt;p&gt;在 Linux 或 &lt;a href="http://www.freebsd.org"&gt;FreeBSD&lt;/a&gt; 系統底下，如何下達 command 來達到多方控管機器，在網路上找到 &lt;a href="http://www.stearns.org/fanout/README.html#fanout"&gt;Fanout&lt;/a&gt; and &lt;a href="http://www.stearns.org/fanout/README.html#fanterm"&gt;fanterm&lt;/a&gt; 這兩套軟體，可以實現我想要的目的，在 FreeBSD 有把 &lt;a href="http://www.freshports.org/sysutils/fanout/"&gt;sysutils/fanout&lt;/a&gt; 進到 ports 裡面，安裝方式很簡單，就直接 make install clean 就可以了，用法也很簡易：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;Usage:
 /usr/local/bin/fanout "MACHINES" "commands and parameters to run on each machine"
 /usr/local/bin/fanout -h #Show this help
 /usr/local/bin/fanout --noping # Do not ping before running command&lt;/pre&gt; 當然事情沒有這麼簡單，因為是透過 SSH 方式去對其他機器下 command，所以作者都把預設 port 設定成 22，沒有完整考慮到其他環境，管理重要的 Server 怎麼會設定 22 阿，一定會改掉的阿，後來檢查一下 /usr/local/bin/fanout 這隻程式，並非編譯過的 binary 檔案，所以打開來看，就是利用 bash shell script 所寫的程式，網路上 Google 也找到一篇 
&lt;p&gt;&lt;a href="http://www.linuxquestions.org/questions/linux-software-2/does-anyone-know-how-to-specify-a-ssh-port-number-with-fanout-776895/"&gt;Does anyone know how to specify a ssh port number with fanout?&lt;/a&gt; 文章，但是最後我是自己把 bash 改成支援可調整 port，也就是 MACHINES 可以放入：ip:portt or hostname:port patch 檔案：需要的就拿去 patch 就可以用了&lt;/p&gt;</description></item><item><title>Using firebug for firefox 除錯 javascript</title><link>https://blog.wu-boy.com/2010/01/using-firebug-for-firefox-%E9%99%A4%E9%8C%AF-javascript/</link><pubDate>Tue, 05 Jan 2010 15:57:34 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2010/01/using-firebug-for-firefox-%E9%99%A4%E9%8C%AF-javascript/</guid><description>&lt;p&gt;在 Web 程式設計，不管是 html 或者是 CSS、甚至 javascript，都可以利用 &lt;a href="https://addons.mozilla.org/en-US/firefox/"&gt;FireFox Plugin&lt;/a&gt;: &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1843"&gt;firebug&lt;/a&gt; 來除錯，順便推薦另一套 Web Develper 工具：&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/60"&gt;Web Developer 1.1.8&lt;/a&gt;，這兩套都可以玩看看，在網路看自己&lt;a href="http://www.ee.ndhu.edu.tw"&gt;東華電機&lt;/a&gt;學長 &lt;a href="http://inet6.blogspot.com/"&gt;gasolin&lt;/a&gt; 寫過一篇：&lt;a href="http://inet6.blogspot.com/2007/02/3-firebug.html?obref=obinsite"&gt;3 分鐘學會用 firebug 除錯&lt;/a&gt; ，裡面有一個影片，建議大家看看：&lt;a href="http://www.digitalmediaminute.com/screencast/firebug-js/"&gt;影片&lt;/a&gt;，如何利用 firebug 來對 javaascript 除錯，介紹了 firebug 優點。底下整理我看到的內容&lt;/p&gt;
&lt;h2 id="1-利用-consolelog-來針對變數除錯-以往都是利用-windowalert-的方式來看看變數是否正確現在只要在-javascript-裡面加入-consolelog-針對不同變數取值出來觀看"&gt;1. 利用 console.log() 來針對變數除錯 以往都是利用 window.alert() 的方式來看看變數是否正確，現在只要在 javascript 裡面加入 console.log() 針對不同變數取值出來觀看&lt;/h2&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;&lt;/pre&gt; 輸出會顯示： 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;a is test
[1, 2, 3, 4]&lt;/pre&gt;
&lt;h2 id="2-印出有圖示的訊息-consoleinfoconsolewarnconsoleerror"&gt;2. 印出有圖示的訊息 console.info/console.warn/console.error&lt;/h2&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;&lt;/pre&gt; 這功能跟 console.log 差不多，只有差在前面有圖示符號，請看下圖： 
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/4247585921/" title="firebug_01 (by appleboy46)"&gt;&lt;img src="https://i2.wp.com/farm5.static.flickr.com/4039/4247585921_8063dedd60.jpg?resize=500%2C126&amp;#038;ssl=1" title="firebug_01 (by appleboy46)" alt="firebug_01 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[PHP Framework] How to implement Plurk API in CodeIgniter</title><link>https://blog.wu-boy.com/2009/12/php-framework-how-to-implement-plurk-api-in-codeigniter/</link><pubDate>Wed, 30 Dec 2009 12:58:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/12/php-framework-how-to-implement-plurk-api-in-codeigniter/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/4228352638/" title="ci_logo2 (by appleboy46)"&gt;&lt;img src="https://i2.wp.com/farm3.static.flickr.com/2519/4228352638_19b13306d3_o.gif?resize=170%2C73&amp;#038;ssl=1" title="ci_logo2 (by appleboy46)" alt="ci_logo2 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 很開心在12月看到 &lt;a href="http://www.plurk.com/API"&gt;Plurk Release API&lt;/a&gt; 出來，而自己也跟網路上一些朋友合作開發 &lt;a href="http://code.google.com/p/php-plurk-api/"&gt;PHP implementation of Plurk API&lt;/a&gt;，Plurk (簡稱噗浪)在台灣這一兩年紅了起來，網路高手分別針對噗浪研究產生非官方的 API，現在官網 Release 出來，提供了 &lt;a href="http://en.wikipedia.org/wiki/Java_(programming_language)"&gt;Java&lt;/a&gt; 跟 &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; 的 Example，我想因為 Plurk 是用 Python 寫出來的，所以提供了範例，但是 API 出來沒多久，&lt;a href="http://blog.roga.tw/"&gt;roga&lt;/a&gt; 就集合了網路一些強者，一起開發了 PHP Plurk API，我也拿了此 API 在實作到 &lt;a href="http://codeigniter.com"&gt;CodeIgniter Framework&lt;/a&gt;，讓在使用此套 open source 的使用者可以享用 Plurk API。不過從2009.12.29日之後，Plurk 官網有限制每天只能 call 50.000 次，已經蠻多了，不要操掛 Plurk 的機器阿。&lt;/p&gt;</description></item><item><title>[Git] how to remove file and commit from history(如何移除 commit 歷史紀錄)</title><link>https://blog.wu-boy.com/2009/12/git-how-to-remove-file-and-commit-from-history%E5%A6%82%E4%BD%95%E7%A7%BB%E9%99%A4-commit-%E6%AD%B7%E5%8F%B2%E7%B4%80%E9%8C%84/</link><pubDate>Tue, 29 Dec 2009 12:59:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/12/git-how-to-remove-file-and-commit-from-history%E5%A6%82%E4%BD%95%E7%A7%BB%E9%99%A4-commit-%E6%AD%B7%E5%8F%B2%E7%B4%80%E9%8C%84/</guid><description>&lt;p&gt;今天在 commit 程式碼到 &lt;a href="http://github.com/"&gt;github&lt;/a&gt; 網站，不小心把 Plurk 帳號密碼給 commit 上去，發生這種事情，所以趕快上網查了一下如何移除 commit 歷史紀錄： 假設我們的 commit tree 如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;R&amp;ndash;A&amp;ndash;B&amp;ndash;C&amp;ndash;D&amp;ndash;E&amp;ndash;HEAD 接下來要移除 B 跟 C 的 commit tree，變成&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;R&amp;ndash;A&amp;ndash;D&amp;rsquo;&amp;ndash;E&amp;ndash;HEAD 有兩種方式可以移除 B &amp;amp; C&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# detach head and move to D commit
git checkout &lt;SHA1-for-D&gt;

# move HEAD to A, but leave the index and working tree as for D
git reset --soft &lt;SHA1-for-A&gt;

# Redo the D commit re-using the commit message, but now on top of A
git commit -C &lt;SHA1-for-D&gt;

# Re-apply everything from the old D onwards onto this new place 
git rebase --onto HEAD &lt;SHA1-for-D&gt; master

# push it
git push --force
&lt;/pre&gt; 另一種方法是利用 cherry-pick 方式 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;git rebase --hard &lt;SHA1 of A&gt;
git cherry-pick &lt;SHA1 of D&gt;
git cherry-pick &lt;SHA1 of E&gt;&lt;/pre&gt; 這會直接忽略 B 跟 C 的 history，詳細資料可以查詢 git help cherry-pick 或者是 git help rebase 參考： 
&lt;p&gt;&lt;a href="http://stackoverflow.com/questions/495345/git-removing-selected-commits-from-repository"&gt;Git: removing selected commits from repository&lt;/a&gt; &lt;a href="http://bogdan.org.ua/2009/02/13/git-how-to-remove-file-commit-from-history.html"&gt;Git: how to remove file and commit from history&lt;/a&gt; &lt;a href="http://kerneltrap.org/mailarchive/git/2007/11/18/425729"&gt;Re: ! [rejected] master -&amp;gt; master (non-fast forward)&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[PHP] Release 噗浪 php-plurk-api 1.2 Beta.</title><link>https://blog.wu-boy.com/2009/12/php-release-%E5%99%97%E6%B5%AA-php-plurk-api-1-2-beta/</link><pubDate>Thu, 24 Dec 2009 14:32:15 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/12/php-release-%E5%99%97%E6%B5%AA-php-plurk-api-1-2-beta/</guid><description>&lt;p&gt;&lt;a href="http://www.plurk.com"&gt;Plurk&lt;/a&gt; 官網在2009年12月4日提供了 &lt;a href="http://www.plurk.com/API"&gt;API platform&lt;/a&gt;，這是大家所期待很久的，裡面只有提供 &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; 跟 &lt;a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29"&gt;Java&lt;/a&gt; 的 example 範例，所以強者我朋友 &lt;a href="http://blog.roga.tw/"&gt;roga&lt;/a&gt; 發起了 &lt;a href="https://code.google.com/p/php-plurk-api/"&gt;php-plurk-api&lt;/a&gt; 架構，來造福 PHP 使用者，當初在 roga 在 plurk 上面徵求是否有人想要一起開發程式，我就當場報名了，後來也陸續多了很多強者好友：&lt;a href="http://blog.twkang.net/"&gt;Whatup&lt;/a&gt;、&lt;a href="http://chrisliu.net/"&gt;ChrisLiu&lt;/a&gt;、&lt;a href="http://bigair.pixnet.net/blog"&gt;Limit&lt;/a&gt;…等加入進行模組撰寫，很快的就產出了 php-plurk-api 1.2 Beta，也利用官方網站 API 來撰寫註解，然後搭配 &lt;a href="http://www.phpdoc.org/"&gt;phpDocumentor&lt;/a&gt; 產出文件，這一切都集結了很多人的努力，也讓官方網站放上了大家共同結晶。 如果大家想使用，可以從 &lt;a title="php-plurk-api source code" onclick="javascript:pageTracker._trackPageview('/outgoing/code.google.com/p/php-plurk-api/');" href="https://code.google.com/p/php-plurk-api/"&gt;php-plurk-api source code&lt;/a&gt;. 下載。^^ 其他延伸： &lt;a title="Permalink to: Release: php-plurk-api 1.2 Beta." rel="bookmark" href="http://blog.roga.tw/2009/12/18/2341"&gt;Release: php-plurk-api 1.2 Beta.&lt;/a&gt; &lt;a title="php-plurk-api" onclick="javascript:pageTracker._trackPageview('/outgoing/plurk.lab3.tw');" href="http://plurk.lab3.tw/"&gt;php-plurk-api website.&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[UNIX] Vim 命令圖解說明</title><link>https://blog.wu-boy.com/2009/12/unix-vim-%E5%91%BD%E4%BB%A4%E5%9C%96%E8%A7%A3%E8%AA%AA%E6%98%8E/</link><pubDate>Sat, 12 Dec 2009 11:04:27 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/12/unix-vim-%E5%91%BD%E4%BB%A4%E5%9C%96%E8%A7%A3%E8%AA%AA%E6%98%8E/</guid><description>&lt;p&gt;&lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; 是一套在 Windows 或者是 UNIX 系統上面非常強大的編輯器，在 &lt;a href="http://blog.vgod.tw/"&gt;vgod’s blog&lt;/a&gt; 看到一篇：『&lt;a href="http://blog.vgod.tw/2009/12/08/vim-cheat-sheet-for-programmers/"&gt;給程式設計師的Vim入門圖解說明&lt;/a&gt;』，原作者提供了 &lt;a href="http://blog.vgod.tw/go.php?http://people.csail.mit.edu/vgod/vim/vim-cheat-sheet-en.pdf"&gt;pdf&lt;/a&gt; 以及 &lt;a href="http://blog.vgod.tw/go.php?http://people.csail.mit.edu/vgod/vim/vim-cheat-sheet-en.png"&gt;png&lt;/a&gt; 檔案讓大家下載阿，相當方便，看到這篇就馬上印出來貼在自己的桌子前面，圖解內容也相當清楚，很適合剛學習 UNIX 系統所需要的一些基本 Vim 指令，如何分割視窗，刪除行…等，另外在 &lt;a href="http://plog.longwin.com.tw"&gt;Tsung&amp;rsquo;s Blog&lt;/a&gt; 看到 好文: &lt;a href="http://plog.longwin.com.tw/document-ebook/2009/12/03/vim-recipes-cookbook-ebook-2009"&gt;Vim 食譜(CookBook、Recipes)&lt;/a&gt;，提供了兩個好用連結：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://vim.runpaint.org/" target="_blank"&gt;Vim Recipes&lt;/a&gt; - Vim 由淺入深, 每篇都很短, 非常推薦此書~ (可線上看, 也可免費下載)&lt;/li&gt;
&lt;li&gt;&lt;a title="Vim Cookbook" href="http://www.oualline.com/vim-cook.html" target="_blank"&gt;Vim Cookbook&lt;/a&gt; - Vim 食譜, 這篇專門紀錄常用、好用的密技. 都可以參考看看喔，對於學習&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; 會有相當大的幫助，底下兩張是從 &lt;a href="http://blog.vgod.tw/"&gt;vgod’s blog&lt;/a&gt; 轉錄過來的。 &lt;a href="https://www.flickr.com/photos/appleboy/4178373148/" title="Flickr 上 appleboy46 的 vim-cheat-sheet-full"&gt;&lt;img src="https://i2.wp.com/farm3.static.flickr.com/2598/4178373148_b39a3131ff.jpg?resize=500%2C294&amp;#038;ssl=1" alt="vim-cheat-sheet-full" data-recalc-dims="1" /&gt;&lt;/a&gt; &lt;a href="https://www.flickr.com/photos/appleboy/4177612069/" title="Flickr 上 appleboy46 的 vim-cheat-sheet-diagram"&gt;&lt;img src="https://i0.wp.com/farm3.static.flickr.com/2511/4177612069_bcb9ebc3f7.jpg?resize=500%2C438&amp;#038;ssl=1" alt="vim-cheat-sheet-diagram" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[FreeBSD] freebsd kernel: fxp0: link state changed to DOWN / UP</title><link>https://blog.wu-boy.com/2009/12/freebsd-freebsd-kernel-fxp0-link-state-changed-to-down-up/</link><pubDate>Thu, 10 Dec 2009 03:00:15 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/12/freebsd-freebsd-kernel-fxp0-link-state-changed-to-down-up/</guid><description>&lt;p&gt;這一個禮拜被機器弄的頭昏腦脹，突然網路斷掉，然後不知不覺中又好了，接下來是斷斷續續，時好時壞，所以去檢查看一下 /var/log/message 訊息，log 檔案吐出很多底下的資訊：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dec 9 21:17:02 freebsd kernel: fxp0: link state changed to DOWN Dec 9 21:17:03 freebsd kernel: fxp0: link state changed to UP Dec 9 21:17:10 freebsd kernel: fxp0: link state changed to DOWN Dec 9 21:17:12 freebsd kernel: fxp0: link state changed to UP 在網路上 &lt;a href="http://www.freebsd.org"&gt;FreeBSD&lt;/a&gt; mail list 查到一篇：『&lt;a href="http://lists.freebsd.org/pipermail/freebsd-net/2007-September/015237.html"&gt;Interface Status changes to UP and Down&lt;/a&gt;』，裡面提到通常是硬體的問題，換過 switch 以及網路線，測試還是有問題，網路會斷斷續續，後來就用主機板上面另外兩個網孔測試，網路就不會時好時壞了，由於時常更改 /etc/rc.conf 裡面的 ip 設定，要重新啟動網路卡介面，這樣會造成遠端 ssh 斷線，解決方式請用下面指令： &lt;strong&gt;How do I restart network service over ssh session?&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>PHP+MySQL 環境下 SQL Injection 攻防戰</title><link>https://blog.wu-boy.com/2009/12/phpmysql-%E7%92%B0%E5%A2%83%E4%B8%8B-sql-injection-%E6%94%BB%E9%98%B2%E6%88%B0/</link><pubDate>Sun, 06 Dec 2009 05:11:25 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/12/phpmysql-%E7%92%B0%E5%A2%83%E4%B8%8B-sql-injection-%E6%94%BB%E9%98%B2%E6%88%B0/</guid><description>&lt;p&gt;在 &lt;a href="http://www.ourmysql.com/"&gt;OurMySQL Blog&lt;/a&gt; 看到這篇：『&lt;a href="http://www.ourmysql.com/archives/791"&gt;PHP+MySQL环境下SQL Injection攻防总结&lt;/a&gt;』寫的相當不錯，裡面有一些觀念，可以讓初學 PHP &amp;amp; MySQL 的使用者知道如何防護 &lt;a href="http://en.wikipedia.org/wiki/SQL_injection"&gt;SQL Injection (資料隱碼)&lt;/a&gt;，內容提到 &lt;a href="http://tw2.php.net/manual/en/info.configuration.php#ini.magic-quotes-gpc"&gt;magic_quotes_gpc&lt;/a&gt; 在 on 跟 off 的狀況如何防護，但是可以清楚看到 &lt;a href="http://tw2.php.net/"&gt;PHP&lt;/a&gt; 官方文件提到在 PHP 5.3.0 magic_quotes_gpc 預設已經是關閉，在 PHP 6.0 之後正式移除，所以內容寫的 magic_quotes_gpc 狀況，可以大致上瞭解就好，真正防護 SQL Injection 是需要寫程式或者是考慮很多方式去防護。 一般在做文章查詢，都會使用 &lt;span style="color: #008000;"&gt;/articles.php?id=123&lt;/span&gt; 網址傳送方式，以 $_GET[&amp;lsquo;id&amp;rsquo;] 送到 PHP 頁面去做處理，如果駭客想要測試是否可以利用 SQL Injection 做攻擊，可以在網址列加上 &lt;span style="color: #008000;"&gt;/articles.php?id=123&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&amp;rsquo;&lt;/span&gt;，請注意網址後面多出 &lt;span style="font-size:11pt;color: #ff0000;"&gt;&amp;rsquo;&lt;/span&gt;，如果沒有把 $_GET[&amp;lsquo;id&amp;rsquo;] 做處理的話，就會出現底下錯誤訊息：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;supplied argument is not a valid MySQL result resource in&lt;/span&gt; 這是因為平常在寫 SQL 語法，會是底下這種寫法：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;$sql = "SELECT id, title, content FROM articles WHERE id = '".$_GET['id']."'";
$result = mysq_query($sql);&lt;/pre&gt; 因為沒有處理跳脫字元 '，所以造成 SQL 語法錯誤，才會出現該錯誤訊息，但是如果又針對跳脫字元做防護得時候，還有另一種攻擊方式： 
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="color: #008000;"&gt;/articles.php?id=0 union select 1,2,load_file(char(47,101,116,99,47,112,97,115,115,119,100))&lt;/span&gt; 其中的數字就是/etc/passwd 字符串的ASCII，除此之外，還可以使用字串 16 進位方式：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="color: #008000;"&gt;/articles.php?id=0 union select 1,2,load_file(0×2f6574632f706173737764)&lt;/span&gt; 可以參考一下 &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_load-file"&gt;MySQL LOAD_FILE(file_name)&lt;/a&gt;，底下文章提到了很多方式解決。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>國外 VPS 虛擬主機效能比較</title><link>https://blog.wu-boy.com/2009/12/%E5%9C%8B%E5%A4%96-vps-%E8%99%9B%E6%93%AC%E4%B8%BB%E6%A9%9F%E6%95%88%E8%83%BD%E6%AF%94%E8%BC%83/</link><pubDate>Tue, 01 Dec 2009 02:45:53 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/12/%E5%9C%8B%E5%A4%96-vps-%E8%99%9B%E6%93%AC%E4%B8%BB%E6%A9%9F%E6%95%88%E8%83%BD%E6%AF%94%E8%BC%83/</guid><description>&lt;p&gt;在 &lt;a href="http://blog.gslin.org"&gt;Dk 大神&lt;/a&gt;那邊看到國外一篇 VPS 效能比較：『&lt;a href="http://journal.uggedal.com/vps-performance-comparison"&gt;VPS Performance Comparison&lt;/a&gt;』，DK 對於這篇也寫了一些&lt;a href="http://blog.gslin.org/archives/2009/11/30/2173/"&gt;心得&lt;/a&gt;，&lt;a href="http://journal.uggedal.com/"&gt;Eivind Uggedal&lt;/a&gt; 針對國外比較有名的虛擬主機(包含 &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt;、&lt;a href="http://www.linode.com/"&gt;Linode&lt;/a&gt;、&lt;a href="http://prgmr.com/xen/"&gt;Prgmr&lt;/a&gt;、&lt;a href="http://www.rackspacecloud.com/"&gt;Rackspace&lt;/a&gt;、&lt;a href="http://www.slicehost.com/"&gt;Slicehost&lt;/a&gt; )進行了效能測試，原作者寫了一些測試效能的 &lt;a href="http://zh.wikipedia.org/wiki/Python"&gt;Python&lt;/a&gt; 程式，也公開程式碼在 &lt;a href="http://github.com/uggedal/vpsbench"&gt;GitHub repository&lt;/a&gt;，底下就來看看幾張作者測試效能產生的圖表。 &lt;a href="https://www.flickr.com/photos/appleboy/4148337783/" title="Flickr 上 appleboy46 的 Journal of Eivind Uggedal- VPS Performance Comparison_1259631315742"&gt;&lt;img src="https://i2.wp.com/farm3.static.flickr.com/2614/4148337783_bf25c7df56.jpg?resize=500%2C144&amp;#038;ssl=1" alt="Journal of Eivind Uggedal- VPS Performance Comparison_1259631315742" data-recalc-dims="1" /&gt;&lt;/a&gt; 針對虛擬主機的 Memory、Monthly cost、Storage、Transfer，價格方面大家都差不多，Linode 贏在每個月給的流量，Amazon 雖然記憶體給的很高，但是相對的價格很貴，在流量($0.17/$0.10 out/inn per GB of bandwidth)也是另外計費的，所以比較起來 Linode 大勝。 &lt;a href="https://www.flickr.com/photos/appleboy/4148337917/" title="Flickr 上 appleboy46 的 Journal of Eivind Uggedal- VPS Performance Comparison_1259631363322"&gt;&lt;img src="https://i2.wp.com/farm3.static.flickr.com/2623/4148337917_3b1e425fed_o.png?resize=462%2C176&amp;#038;ssl=1" alt="Journal of Eivind Uggedal- VPS Performance Comparison_1259631363322" data-recalc-dims="1" /&gt;&lt;/a&gt; 比較 CPU 方面，Linode 提供了 32/64 位元的 CPU 架構讓您使用，Linode、Slicehost、Rackspace 提供四個虛擬 CPU，相對於 Amazon 只提供 32位元架構以及單顆 CPU，比較下來，還是 Linode 大勝。 &lt;a href="https://www.flickr.com/photos/appleboy/4148338025/" title="Journal of Eivind Uggedal- VPS Performance Comparison_1259632886853 (by appleboy46)"&gt;&lt;img title="Journal of Eivind Uggedal- VPS Performance Comparison_1259632886853 (by appleboy46)" src="https://i1.wp.com/farm3.static.flickr.com/2713/4148338025_0c39573b01.jpg?resize=500%2C323&amp;#038;ssl=1" alt="Journal of Eivind Uggedal- VPS Performance Comparison_1259632886853 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; &lt;a href="https://www.flickr.com/photos/appleboy/4149097680/" title="Journal of Eivind Uggedal- VPS Performance Comparison_1259632896568 (by appleboy46)"&gt;&lt;img title="Journal of Eivind Uggedal- VPS Performance Comparison_1259632896568 (by appleboy46)" src="https://i0.wp.com/farm3.static.flickr.com/2527/4149097680_e2d265a856.jpg?resize=500%2C333&amp;#038;ssl=1" alt="Journal of Eivind Uggedal- VPS Performance Comparison_1259632896568 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 這兩張效能圖，很顯然的都是 Linode 大勝，所以本篇報導結論：買 Linode 就是對的，便宜又可以得到好的虛擬主機(VPS)效能。 延伸閱讀：&lt;a href="http://journal.uggedal.com/vps-comparison-between-slicehost-and-prgmr"&gt;VPS Comparison between Slicehost and Prgmr&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Javascript] 在函數裡設定參數預設值</title><link>https://blog.wu-boy.com/2009/11/javascript-%E5%9C%A8%E5%87%BD%E6%95%B8%E8%A3%A1%E8%A8%AD%E5%AE%9A%E5%8F%83%E6%95%B8%E9%A0%90%E8%A8%AD%E5%80%BC/</link><pubDate>Wed, 25 Nov 2009 03:56:13 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/11/javascript-%E5%9C%A8%E5%87%BD%E6%95%B8%E8%A3%A1%E8%A8%AD%E5%AE%9A%E5%8F%83%E6%95%B8%E9%A0%90%E8%A8%AD%E5%80%BC/</guid><description>&lt;p&gt;在網路上看到一篇：『&lt;a href="http://www.electrictoolbox.com/default-values-missing-parameters-javascript/"&gt;Setting default values for missing parameters in a Javascript function&lt;/a&gt;』，提到在 Javascript 函式參數如果未定義，就會出現 undefine 的錯誤訊息，請看底下範例：&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;function foo(a, b, c) {
 document.write('a: ' + a + ' ');
 document.write('b: ' + b + ' ');
 document.write('c: ' + c + ' ');
 document.write('&lt;br /&gt;');
}&lt;/pre&gt; 測試函數： 
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;foo();
foo(1);
foo(1, 2);
foo(1, 2, 3);&lt;/pre&gt; 輸出結果： 
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;a: undefined b: undefined c: undefined
a: 1 b: undefined c: undefined
a: 1 b: 2 c: undefined
a: 1 b: 2 c: 3&lt;/pre&gt; 底下有兩種方式可以解決此問題： 1. 加入 if 判斷： 
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;function foo(a, b, c) {

 if(typeof a == 'undefined') {
 a = 'AAA';
 }
 if(typeof b == 'undefined') {
 b = 'BBB';
 }
 if(typeof c == 'undefined') {
 c = 'CCC';
 }

 document.write('a: ' + a + ' ');
 document.write('b: ' + b + ' ');
 document.write('c: ' + c + ' ');
 document.write('&lt;br /&gt;');

}&lt;/pre&gt; 測試： 
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;foo();
foo(1);
foo(1, 2);
foo(1, 2, 3);&lt;/pre&gt; 結果輸出： 
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;a: AAA b: BBB c: CCC
a: 1 b: BBB c: CCC
a: 1 b: 2 c: CCC
a: 1 b: 2 c: 3&lt;/pre&gt; 2. 網友提供的最佳解法： 
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;function foo(a, b, c) {

 a = a || "AAA";
 b = b || "BBB";
 c = c || "CCC";

 document.write('a: ' + a + ' ');
 document.write('b: ' + b + ' ');
 document.write('c: ' + c + ' ');
 document.write('&lt;br /&gt;');

}&lt;/pre&gt; 假設 a 尚未被定義，就會以 AAA 預設值顯示，程式碼也相當好閱讀。</description></item><item><title>[MySQL] 必要修正一些預設值 (performance tunning)</title><link>https://blog.wu-boy.com/2009/11/mysql-%E5%BF%85%E8%A6%81%E4%BF%AE%E6%AD%A3%E4%B8%80%E4%BA%9B%E9%A0%90%E8%A8%AD%E5%80%BC-performance-tunning/</link><pubDate>Fri, 20 Nov 2009 04:47:06 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/11/mysql-%E5%BF%85%E8%A6%81%E4%BF%AE%E6%AD%A3%E4%B8%80%E4%BA%9B%E9%A0%90%E8%A8%AD%E5%80%BC-performance-tunning/</guid><description>&lt;p&gt;參考了一篇：『&lt;a href="http://jeremy.zawodny.com/blog/archives/011421.html"&gt;Fixing Poor MySQL Default Configuration Values&lt;/a&gt;』，裡面提到了四個 &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt; 預設值相當沒有意義，所以 &lt;a href="http://jeremy.zawodny.com"&gt;Jeremy Zawodny&lt;/a&gt; 提出了修改，也解釋了為什麼這四個會降低 MySQL 的效能。 1. max_connect_errors: 當使用者連接 MySQL 出現錯誤，伺服器就會根據 connect_timeout 所設定時間之後，而放棄等待，放棄之後會有 counter 來紀錄連接失敗的次數，當達到 &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_max_connect_errors"&gt;max_connect_errors&lt;/a&gt; 設定值，伺服器就會 locked out client 端，這會衍生一個問題，那就是可以惡搞同一台網站，把 MySQL 搞爛，造成封鎖，不過解決方法就是把 max_connect_errors 設定成 (max_connect_errors=1844674407370954751) 2. connect_timeout: 這跟上面 max_connect_errors 是有相當大的關係，MySQL 預設 connect_timeout 是五秒，可是在網路繁忙的時候，也許需要花費比較多的時間來做連接， 但是預設值是五秒的話，這樣會一直 time out，造成 counter 持續增加，屆時會超過 max_connect_errors 設定值，所以必須把 connect_timeout 設定提高到 15 or 20，這樣就可以了 (connect_timeout = 20) 3. skip-name-resolve: 在每次的 MySQL 連線，伺服器端會偵測 Client 的 DNS 反解，這步驟真的有點多餘 綜合上面結論，請加入 my.cnf 一些設定&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;max_connect_errors = 1844674407370954751
connect_timeout = 20
skip-name-resolve
slave_net_timeout = 30&lt;/pre&gt; Reference: 
&lt;p&gt;&lt;a href="http://blog.gslin.org/archives/2009/11/10/2154/"&gt;無論如何都應該修改的 MySQL 預設值&lt;/a&gt; &lt;a href="http://plog.longwin.com.tw/my_note-unix/2009/11/17/mysql-default-value-modify-by-jeremy-2009"&gt;線上環境的 MySQL 預設值修改(Jeremy 建議)&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[FreeBSD] port committer 快速建立 pkg-plist</title><link>https://blog.wu-boy.com/2009/11/freebsd-port-committer-%E5%BF%AB%E9%80%9F%E5%BB%BA%E7%AB%8B-pkg-plist/</link><pubDate>Wed, 18 Nov 2009 08:51:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/11/freebsd-port-committer-%E5%BF%AB%E9%80%9F%E5%BB%BA%E7%AB%8B-pkg-plist/</guid><description>&lt;p&gt;在 &lt;a href="http://www.freebsd.org/"&gt;FreeBSD&lt;/a&gt; 系統裡，最常使用就是管理安裝 ports，之前寫過一篇如何 commit update ports :『&lt;a href="http://blog.wu-boy.com/2009/09/22/1670/"&gt;[FreeBSD] send-pr porter committer 需要注意事項&lt;/a&gt;』，根據 &lt;a href="http://www.freebsd.org/doc/en/books/porters-handbook/"&gt;FreeBSD Porter&amp;rsquo;s Handbook&lt;/a&gt; 裡頭，寫到 &lt;a href="http://www.freebsd.org/doc/en/books/porters-handbook/porting-desc.html#AEN100"&gt;pkg-plist&lt;/a&gt; 檔案內容是根據 ports 所產生的檔案列表，可以參考 &lt;a href="http://www.freebsd.org/doc/en/books/porters-handbook/plist-autoplist.html"&gt;Automated package list creation&lt;/a&gt; 這篇來快速產生，而我自己把該篇寫成 shell script 來直接產生，再來利用 diff 的方式來看看有無需要修改或者是增加，底下就是 shell script 內容：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#!/usr/local/bin/bash
###############################################
#
# Date:	 2009.11.18
# Author: appleboy ( appleboy.tw AT gmail.com)
# Web:	 http://blog.wu-boy.com
# Ref:	 http://www.freebsd.org/doc/en/books/porters-handbook/plist-autoplist.html
#
###############################################

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin
export PATH

if [ "$#" -lt "2" ]; then
 echo "please give two argument"
 echo "example $0 /tmp/dir1 /tmp/dir2"
 exit
fi

#
# configure system parameters

HOME=$1
TARGET=$2
TMPDIR="/var/tmp"

#
# configure end

if [ ! -d "$HOME" ]; then
 echo "${HOME} is not directory"
 exit
fi

if [ "$TARGET" != "" ] &amp;&amp; [ ! -d "$TARGET" ]; then
 echo "$TARGET will be created"
 mkdir -p $TARGET
fi

#
# clean ports file

cd $HOME &amp;&amp; make clean

#
# get port name 

PORTNAME=$(make -V PORTNAME)

#
# Before create port directory, please delete it.
# Next, create a temporary directory tree into which your port can be installed, and install any dependencies.
rm -rf ${TMPDIR}/${PORTNAME}
if [ ! -d "${TMPDIR}/${PORTNAME}" ]; then
 echo "${TMPDIR}/${PORTNAME} will be created"
 mkdir -p ${TMPDIR}/${PORTNAME}
fi

mtree -U -f $(make -V MTREE_FILE) -d -e -p ${TMPDIR}/${PORTNAME}
make depends PREFIX=${TMPDIR}/$PORTNAME

#
# Store the directory structure in a new file.

cd ${TMPDIR}/${PORTNAME} &amp;&amp; find -d * -type d | sort &gt; ${TARGET}/OLD-DIRS

#
# If your port honors PREFIX (which it should) you can then install the port and create the package list.

cd $HOME &amp;&amp; make install PREFIX=${TMPDIR}/${PORTNAME}
cd ${TMPDIR}/${PORTNAME} &amp;&amp; find -d * \! -type d | sort &gt; ${TARGET}/pkg-plist

#
# You must also add any newly created directories to the packing list.

cd ${TMPDIR}/${PORTNAME} &amp;&amp; find -d * -type d | sort | comm -13 ${TARGET}/OLD-DIRS - | sort -r | sed -e 's#^#@dirrm #' &gt;&gt; ${TARGET}/pkg-plist

echo "Please check ${TARGET}/pkg-plist file"
&lt;/pre&gt; 用法大概是： ./create_pkg.sh /root/phpbb3 /root/test /root/phpbb3 是你修改 ports 的資料夾 /root/test 是 pkg-plist 新的資料夾</description></item><item><title>[Gmail] offline Gmail 根據 Labels 自訂選擇下載郵件備份</title><link>https://blog.wu-boy.com/2009/11/gmail-offline-gmail-%E6%A0%B9%E6%93%9A-labels-%E8%87%AA%E8%A8%82%E9%81%B8%E6%93%87%E4%B8%8B%E8%BC%89%E9%83%B5%E4%BB%B6%E5%82%99%E4%BB%BD/</link><pubDate>Tue, 17 Nov 2009 03:08:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/11/gmail-offline-gmail-%E6%A0%B9%E6%93%9A-labels-%E8%87%AA%E8%A8%82%E9%81%B8%E6%93%87%E4%B8%8B%E8%BC%89%E9%83%B5%E4%BB%B6%E5%82%99%E4%BB%BD/</guid><description>&lt;p&gt;在 &lt;a href="http://gmailblog.blogspot.com/"&gt;Gmail Lab&lt;/a&gt; 裡面講到這篇：『&lt;a href="http://gmailblog.blogspot.com/2009/11/choose-which-messages-get-downloaded.html"&gt;Choose which messages get downloaded for offline use&lt;/a&gt;』，內容是說之前 &lt;a href="https://mail.google.com/"&gt;Gmail&lt;/a&gt; 開發出來可以離線瀏覽 Email 信件的 &lt;a href="http://gmailblog.blogspot.com/2009/01/new-in-labs-offline-gmail.html"&gt;Offline Gmail&lt;/a&gt; 功能，不管你在任何地方您都可以任意去瀏覽之前收過的 mail 郵件，我想這功能相當方便，但是如果您的信件如果很多，有些不想同步到自己私人電腦，是不是覺得有些不方便，而想根據 Gmail 設定的 Label 來同步郵件呢，所以 Gmail 幫您考慮到的此點，也針對 Offline 做了設定改善。首先你必須先啟動 Offline Gmail 的功能，接下來在 Settings 的 Offline tab 裡面進行設定您想要下載同步的 Labels 郵件，畫面大致上如下，我想非常容易設定。 &lt;a href="https://www.flickr.com/photos/appleboy/4110524433/" title="Settings - appleboy.tw@gmail.com - Gmail_1258426240802 (by appleboy46)"&gt;&lt;img src="https://i0.wp.com/farm3.static.flickr.com/2563/4110524433_ee951dbb88.jpg?resize=500%2C483&amp;#038;ssl=1" title="Settings - appleboy.tw@gmail.com - Gmail_1258426240802 (by appleboy46)" alt="Settings - appleboy.tw@gmail.com - Gmail_1258426240802 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Linux] VirtuBox ssh 遠端控制，Windows 資料夾分享 [On Ubuntu]</title><link>https://blog.wu-boy.com/2009/11/linux-virtubox-ssh-%E9%81%A0%E7%AB%AF%E6%8E%A7%E5%88%B6%EF%BC%8Cwindows-%E8%B3%87%E6%96%99%E5%A4%BE%E5%88%86%E4%BA%AB-on-ubuntu/</link><pubDate>Sun, 15 Nov 2009 14:21:10 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/11/linux-virtubox-ssh-%E9%81%A0%E7%AB%AF%E6%8E%A7%E5%88%B6%EF%BC%8Cwindows-%E8%B3%87%E6%96%99%E5%A4%BE%E5%88%86%E4%BA%AB-on-ubuntu/</guid><description>&lt;div style="float:left;margin-right:25px"&gt;
 &lt;a href="https://www.flickr.com/photos/appleboy/4105985126/" title="vbox_logo2_gradient (by appleboy46)"&gt;&lt;img src="https://i1.wp.com/farm3.static.flickr.com/2522/4105985126_591a664ca4_o.png?resize=140%2C180&amp;#038;ssl=1" title="vbox_logo2_gradient (by appleboy46)" alt="vbox_logo2_gradient (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; 是一套可以模擬虛擬作業系統的軟體，目前 Release 到 3.0.10 版本，可以去官網查看 &lt;a href="http://www.virtualbox.org/wiki/Changelog"&gt;Changelog&lt;/a&gt;，它可以 run 在各種不同的作業系統，例如：Windows, Linux, Macintosh and OpenSolaris etc. 可以看 &lt;a href="http://www.virtualbox.org/wiki/Guest_OSes"&gt;guest operating systems&lt;/a&gt;，每次只要新的 OS Release 出來，就要先用 VirtualBox 模擬一下，還有如果需要 IE6，也是需要另一套 Windows XP，在教學方面也是相當方便的，底下紀錄一下如何 &lt;a href="http://www.csie.ntu.edu.tw/~piaip/pietty/"&gt;pietty&lt;/a&gt; 去連接 VirtuBox 裡面的 &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; Server。&lt;/p&gt;</description></item><item><title>[SQL] Microsoft SQL Server 2008 Management Studio 防止儲存需要資料表重建的變更</title><link>https://blog.wu-boy.com/2009/11/sql-microsoft-sql-server-2008-management-studio-%E9%98%B2%E6%AD%A2%E5%84%B2%E5%AD%98%E9%9C%80%E8%A6%81%E8%B3%87%E6%96%99%E8%A1%A8%E9%87%8D%E5%BB%BA%E7%9A%84%E8%AE%8A%E6%9B%B4/</link><pubDate>Wed, 11 Nov 2009 15:45:31 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/11/sql-microsoft-sql-server-2008-management-studio-%E9%98%B2%E6%AD%A2%E5%84%B2%E5%AD%98%E9%9C%80%E8%A6%81%E8%B3%87%E6%96%99%E8%A1%A8%E9%87%8D%E5%BB%BA%E7%9A%84%E8%AE%8A%E6%9B%B4/</guid><description>&lt;p&gt;最近要寫 ASP.Net 專案，弄 &lt;a href="http://www.microsoft.com/taiwan/sql/default.mspx"&gt;MSSQL&lt;/a&gt; Server 2008 當作 Database，利用 &lt;a href="http://msdn.microsoft.com/zh-tw/library/ms174173.aspx"&gt;SQL 2008 SQL Server Management Studio&lt;/a&gt; 管理資料庫，有點類似 &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt; &lt;a href="http://www.navicat.com/"&gt;Navicat Lite&lt;/a&gt; 軟體，或者是 Web 介面的 &lt;a href="http://www.phpmyadmin.net/"&gt;phpMyAdmin&lt;/a&gt;，在資料表填入欄位新增第一次之後，接下來要去修改資料表，發現會出現錯誤訊息：『&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;防止儲存需要資料表重建的變更&lt;/span&gt;&lt;/strong&gt;』 &lt;a href="https://www.flickr.com/photos/appleboy/4093213252/" title="MSSQL2008_01 (by appleboy46)"&gt;&lt;img src="https://i0.wp.com/farm3.static.flickr.com/2716/4093213252_7dba49bc8d.jpg?resize=455%2C339&amp;#038;ssl=1" title="MSSQL2008_01 (by appleboy46)" alt="MSSQL2008_01 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 解決方法其實很簡單：工具-&amp;gt;選項-&amp;gt;左邊選單 Designers，裡面把**&lt;span style="color: #ff0000;"&gt;防止儲存需要資料表重建的變更&lt;/span&gt;**，取消掉，就可以了 &lt;a href="https://www.flickr.com/photos/appleboy/4093213314/" title="MSSQL2008_02 (by appleboy46)"&gt;&lt;img title="MSSQL2008_02 (by appleboy46)" src="https://i1.wp.com/farm3.static.flickr.com/2743/4093213314_8c537177c1.jpg?resize=500%2C271&amp;#038;ssl=1" alt="MSSQL2008_02 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 參考資料：&lt;a href="http://www.dotblogs.com.tw/dotjum/archive/2009/09/11/10572.aspx"&gt;[SQL]使用SQL 2008 SQL Server Management Studio 更改資料表結構 出現錯誤訊息不允許儲存變更&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[網站] 好站連結 (六)</title><link>https://blog.wu-boy.com/2009/11/%E7%B6%B2%E7%AB%99-%E5%A5%BD%E7%AB%99%E9%80%A3%E7%B5%90-%E5%85%AD/</link><pubDate>Thu, 05 Nov 2009 06:21:50 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/11/%E7%B6%B2%E7%AB%99-%E5%A5%BD%E7%AB%99%E9%80%A3%E7%B5%90-%E5%85%AD/</guid><description>&lt;p&gt;C#&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://dotnetperls.com/datagridview-tips"&gt;C# DataGridView Tips and Secrets&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.dotblogs.com.tw/puma/archive/2008/08/20/4955.aspx" title="Title of this entry."&gt;[C#]WinForm解決ComboBox在下拉選單Width的AutoSize&lt;/a&gt;{#viewpost_ascx_TitleUrl} javascript&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.electrictoolbox.com/jquery-select-function/"&gt;Use jQuery&amp;rsquo;s select() function to automatically select text in an input field&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.electrictoolbox.com/jquery-get-set-form-values/"&gt;How to get and set form element values with jQuery&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.electrictoolbox.com/check-uncheck-checkbox-jquery/" target="_blank"&gt;How to check and uncheck a checkbox with jQuery&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.electrictoolbox.com/jquery-animated-information-box/" target="_blank"&gt;jQuery Animated Information Box&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.electrictoolbox.com/jquery-facebox-opaque-background/" target="_blank"&gt;jQuery Facebox dialog with opaque background&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://davidwalsh.name/control-save"&gt;Save Web Form Content Using Control + S&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="entry-title-link" href="http://feedproxy.google.com/%7Er/Bludice/%7E3/w8CGcDIGyco/clipboard" target="_blank"&gt;Javascript Copy to Clipboard&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="entry-title-link" href="http://feedproxy.google.com/%7Er/Bludice/%7E3/qB581aEWmpg/milkchart" target="_blank"&gt;Dynamically Create Charts Using MooTools MilkChart and Google Analytics&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Perl&amp;PHP] time() and Class::Date 日期轉換運算</title><link>https://blog.wu-boy.com/2009/11/perlphp-time-and-classdate-%E6%97%A5%E6%9C%9F%E8%BD%89%E6%8F%9B%E9%81%8B%E7%AE%97/</link><pubDate>Tue, 03 Nov 2009 15:28:56 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/11/perlphp-time-and-classdate-%E6%97%A5%E6%9C%9F%E8%BD%89%E6%8F%9B%E9%81%8B%E7%AE%97/</guid><description>&lt;p&gt;為了看個 &lt;a href="http://mlb.mlb.com/index.jsp"&gt;MLB&lt;/a&gt; 美國職棒，寫了一個網站：&lt;a href="http://mimi.twgg.org/"&gt;美國職棒影片收集站&lt;/a&gt;，裡面的內容影片連結，以及連結說明，都是利用 &lt;a href="http://www.perl.org/"&gt;Perl&lt;/a&gt; 搭配 &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt; 資料庫，以及 &lt;a href="http://codeigniter.com/"&gt;CodeIgniter PHP Framework&lt;/a&gt; 寫出來的，美國 MLB 開打時間，會比台灣晚一天的時差，所以在 &lt;a href="http://www.php.net"&gt;PHP&lt;/a&gt; 跟 Perl 都要針對時間作修改以及轉換運算，那底下會寫 PHP 跟 Perl 如何控制時間，還有資料庫如何設計，會比較適當。&lt;/p&gt;
&lt;h2 id="php-日期轉換-mysql-在資料庫時間格式方面最主要常見的兩種儲存方式一種就是-mysql-預設-datetime顯示的格式就會像是"&gt;&lt;span style="color: #008000;"&gt;PHP 日期轉換&lt;/span&gt; MySQL 在資料庫時間格式方面，最主要常見的兩種儲存方式，一種就是 MySQL 預設 datetime，顯示的格式就會像是&lt;/h2&gt;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;2009-11-03 20:10:43&lt;/span&gt;，另一種就是存成 &lt;a href="http://en.wikipedia.org/wiki/Unix_time"&gt;UNIX time&lt;/a&gt; 格式，可以設定為 int(11)，這兩種其實都可以使用，在 &lt;a href="http://www.phpbb.com/"&gt;phpBB2&lt;/a&gt; 是採用後者的方式，因為 open source 要支援多種資料庫，但是又要統一程式碼，所以乾脆用 UNIX 的時間標記，這樣比較好轉換時區，如果使用 UNIX 格式，可以利用 &lt;a href="http://php.net/manual/en/function.time.php"&gt;time()&lt;/a&gt; 函式來取的。&lt;/p&gt;</description></item><item><title>[高雄美食] 高雄-TON 卡茲日歐風尚食堂</title><link>https://blog.wu-boy.com/2009/10/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F-%E9%AB%98%E9%9B%84-ton-%E5%8D%A1%E8%8C%B2%E6%97%A5%E6%AD%90%E9%A2%A8%E5%B0%9A%E9%A3%9F%E5%A0%82/</link><pubDate>Sat, 31 Oct 2009 09:15:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/10/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F-%E9%AB%98%E9%9B%84-ton-%E5%8D%A1%E8%8C%B2%E6%97%A5%E6%AD%90%E9%A2%A8%E5%B0%9A%E9%A3%9F%E5%A0%82/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/4044435351/" title="DSC03303"&gt;&lt;img src='https://i2.wp.com/farm3.static.flickr.com/2779/4044435351_abd3af4e51.jpg?w=840&amp;#038;ssl=1' hspace='0' vspace='0' border='0' alt='DSC03303' data-recalc-dims="1" /&gt;&lt;/a&gt; 在&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.mobile01.com/"&gt;mobile01&lt;/a&gt; 發現&lt;a href="http://www.mobile01.com/waypointdetail.php?id=8478"&gt;【Catanna食記】高雄-TON 卡茲日歐風尚食堂&lt;/a&gt; 這篇文章，之前答應&lt;a href="http://kileleu.pixnet.net/blog"&gt;宗翰&lt;/a&gt;要請他吃一次飯，原因是我找到了第一份工作，所以凹了我一頓飯，這次也拖了很久，從我畢業到現在都半年超過了，才一起出來吃飯，宗翰也寫了一篇食記：&lt;a href="http://kileleu.pixnet.net/blog/post/24485166"&gt;[Food]TON 卡茲日歐風尚食堂 - 高雄&lt;/a&gt;，先不多說，來介紹一下美食吧，我跟宗翰還有他高中同學總共一起吃了 693 元(炸豆腐 炸野菇 藍帶雙起士豬排 雙人海陸稱霸餐)，吃到我們快撐死了，其實點餐點就會附上白飯跟高麗蔡絲，很大一盤，請看底下的圖:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/4044387899/" title="DSC03289"&gt;&lt;img src='https://i0.wp.com/farm3.static.flickr.com/2487/4044387899_c84cde6193.jpg?w=840&amp;#038;ssl=1' hspace='0' vspace='0' border='0' alt='DSC03289' data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/4044391311/" title="DSC03290"&gt;&lt;img src='https://i1.wp.com/farm3.static.flickr.com/2472/4044391311_60897c1c03.jpg?w=840&amp;#038;ssl=1' hspace='0' vspace='0' border='0' alt='DSC03290' data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[CodeIgniter] 解決 CI 下載函數 force_download 在 IE 底下檔案標題亂碼</title><link>https://blog.wu-boy.com/2009/10/codeigniter-%E8%A7%A3%E6%B1%BA-ci-%E4%B8%8B%E8%BC%89%E5%87%BD%E6%95%B8-force_download-%E5%9C%A8-ie-%E5%BA%95%E4%B8%8B%E6%AA%94%E6%A1%88%E6%A8%99%E9%A1%8C%E4%BA%82%E7%A2%BC/</link><pubDate>Mon, 26 Oct 2009 06:21:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/10/codeigniter-%E8%A7%A3%E6%B1%BA-ci-%E4%B8%8B%E8%BC%89%E5%87%BD%E6%95%B8-force_download-%E5%9C%A8-ie-%E5%BA%95%E4%B8%8B%E6%AA%94%E6%A1%88%E6%A8%99%E9%A1%8C%E4%BA%82%E7%A2%BC/</guid><description>&lt;p&gt;&lt;img src="https://i2.wp.com/codeigniter.com/images/design/ci_logo2.gif?w=840" alt="CodeIgniter" data-recalc-dims="1" /&gt; &lt;a href="http://codeigniter.com/"&gt;CodeIgniter&lt;/a&gt; 底下提供了 &lt;a href="http://codeigniter.com/user_guide/helpers/download_helper.html"&gt;force_download&lt;/a&gt; 函數，讓使用者可以直接下載檔案，但是會遇到中文的問題，&lt;a href="http://www.microsoft.com/taiwan/windows/internet-explorer/"&gt;IE&lt;/a&gt; 底下開起來檔名會是亂碼，force_download(&amp;lsquo;filename&amp;rsquo;, &amp;lsquo;data&amp;rsquo;) 如果 filename 使用中文，測試 &lt;a href="http://moztw.org/firefox/"&gt;FireFox&lt;/a&gt; 跟 &lt;a href="http://www.google.com/chrome/"&gt;Chrome&lt;/a&gt; 都是沒問題的，唯獨 IE 開起來就是有問題，所以麻煩請修改 &lt;span style="color: #008000;"&gt;&lt;strong&gt;helpers/download_helper.php &lt;/strong&gt;&lt;/span&gt; 這隻程式。&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;if ( ! function_exists('force_download'))
{
	function force_download($filename = '', $data = '')
	{
		if ($filename == '' OR $data == '')
		{
			return FALSE;
		}

		// Try to determine if the filename includes a file extension.
		// We need it in order to set the MIME type
		if (FALSE === strpos($filename, '.'))
		{
			return FALSE;
		}
	
		// Grab the file extension
		$x = explode('.', $filename);
		$extension = end($x);

		// Load the mime types
		@include(APPPATH.'config/mimes'.EXT);
	
		// Set a default mime if we can't find it
		if ( ! isset($mimes[$extension]))
		{
			$mime = 'application/octet-stream';
		}
		else
		{
			$mime = (is_array($mimes[$extension])) ? $mimes[$extension][0] : $mimes[$extension];
		}
	
		// Generate the server headers
		if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
		{
			header('Content-Type: "'.$mime.'"');
			header('Content-Disposition: attachment; filename="'.iconv('utf-8', 'big5', $filename).'"');
			header('Expires: 0');
			header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
			header("Content-Transfer-Encoding: binary");
			header('Pragma: public');
			header("Content-Length: ".strlen($data));
		}
		else
		{
			header('Content-Type: "'.$mime.'"');
			header('Content-Disposition: attachment; filename="'.$filename.'"');
			header("Content-Transfer-Encoding: binary");
			header('Expires: 0');
			header('Pragma: no-cache');
			header("Content-Length: ".strlen($data));
		}
	
		exit($data);
	}
}&lt;/pre&gt; 裡面利用了 iconv 把 utf-8 編碼，改成 big5，這樣在 IE 底下就不會出現問題了 
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;header('Content-Disposition: attachment; filename="'.iconv('utf-8', 'big5', $filename).'"');&lt;/pre&gt;</description></item><item><title>WordPress 2.8.5 Hardening Release</title><link>https://blog.wu-boy.com/2009/10/wordpress-2-8-5-hardening-release/</link><pubDate>Thu, 22 Oct 2009 12:37:16 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/10/wordpress-2-8-5-hardening-release/</guid><description>&lt;p&gt;&lt;img src="https://i2.wp.com/s.wordpress.org/about/images/buttons/buttonw-blue.png?w=840" alt="wordpress logo" data-recalc-dims="1" /&gt; &lt;a href="http://wordpress.org/"&gt;WordPress&lt;/a&gt; 在10月20號發出安全性的更新，大家快把 2.8.4 升級到 2.8.5，可以參考 &lt;a href="http://wordpress.org/development/2009/10/wordpress-2-8-5-hardening-release/"&gt;WordPress 2.8.5: Hardening Release&lt;/a&gt;，這次更新最主要是在安全性的議題，Wordpress 團隊在過去幾個月已經開始針對 2.9 進行新功能上的開發，但是在 2.8 branch 的版本如果有安全性的漏洞，官方網站還是會提出修正的，以增加網站的安全。 底下是一些 Release 的安全性改良：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;A fix for the Trackback Denial-of-Service attack that is currently being seen.&lt;/li&gt;
&lt;li&gt;Removal of areas within the code where php code in variables was evaluated.&lt;/li&gt;
&lt;li&gt;Switched the file upload functionality to be whitelisted for all users including Admins.&lt;/li&gt;
&lt;li&gt;Retiring of the two importers of Tag data from old plugins 假如您的網站最近有受到攻擊，那可以利用官網提供的弱點掃描工具
&lt;a href="http://wordpress.org/extend/plugins/exploit-scanner/"&gt;WordPress Exploit Scanner&lt;/a&gt; 來針對網站檔案以及資料庫內容文章，還有 comment 的資料表，以及所裝的 plugin 檔案進行漏洞檢查。 升級方式很容易，可以參考之前寫的 &lt;a href="http://blog.wu-boy.com/2008/04/27/192/"&gt;[wordpress] 快速升級 Upgrade 2.5.0 -&amp;gt; 2.5.1 for Linux &amp;amp; FreeBSD&lt;/a&gt; ps. &lt;a href="http://www.freebsd.org"&gt;FreeBSD&lt;/a&gt; commit 到 ports 裡面了，參考：&lt;a href="http://www.freebsd.org/cgi/query-pr.cgi?pr=139812"&gt;ports/139812&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</description></item><item><title>[jQuery] ThickBox 3.1 無限期停止支援維護</title><link>https://blog.wu-boy.com/2009/10/jquery-thickbox-31-%E7%84%A1%E9%99%90%E6%9C%9F%E5%81%9C%E6%AD%A2%E6%94%AF%E6%8F%B4%E7%B6%AD%E8%AD%B7/</link><pubDate>Wed, 21 Oct 2009 09:00:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/10/jquery-thickbox-31-%E7%84%A1%E9%99%90%E6%9C%9F%E5%81%9C%E6%AD%A2%E6%94%AF%E6%8F%B4%E7%B6%AD%E8%AD%B7/</guid><description>&lt;p&gt;在 &lt;a href="http://tzangms.com"&gt;Oceanic / 人生海海&lt;/a&gt; 看到這篇 &lt;a href="http://tzangms.com/programming/2496"&gt;thickbox 停止維護&lt;/a&gt;，&lt;a href="http://jquery.com/demo/thickbox/"&gt;ThickBox&lt;/a&gt; &lt;a href="http://jquery.com"&gt;jQuery&lt;/a&gt; plugin 裡面算是不錯用的工具，在網路上常常會聽到這個名詞，thickbox 作者也推薦了底下類似套件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://colorpowered.com/colorbox/"&gt;colorbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jqueryui.com/demos/dialog/"&gt;jQueryUI Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fancybox.net/"&gt;fancybox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://swip.codylindley.com/DOMWindowDemo.html"&gt;DOM window&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.shadowbox-js.com/index.html"&gt;shadowbox.js&lt;/a&gt; 上面我還蠻推薦 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://fancybox.net/"&gt;fancybox&lt;/a&gt; 的，目前開發專案都以它為主，因為在瀏覽整頁圖片，我覺得效果不錯，剛剛去 try 了一下 &lt;a href="http://colorpowered.com/colorbox/"&gt;colorbox&lt;/a&gt;，發覺這套也不錯用。在 fancybox 裡面設定 zoomSpeedIn 或者是 frameWidth 的值，就直接設定數字，不用在加上引號，不然會沒出現效果。&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;$(document).ready(function() {
	$("a.group").fancybox({
		'zoomSpeedIn': 300, 
		'zoomSpeedOut': 300
	});
});&lt;/pre&gt;</description></item><item><title>[講義]屏科大 PHP &amp; MySQL 基礎教學投影片</title><link>https://blog.wu-boy.com/2009/10/%E8%AC%9B%E7%BE%A9%E5%B1%8F%E7%A7%91%E5%A4%A7-php-mysql-%E5%9F%BA%E7%A4%8E%E6%95%99%E5%AD%B8%E6%8A%95%E5%BD%B1%E7%89%87/</link><pubDate>Sat, 17 Oct 2009 17:10:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/10/%E8%AC%9B%E7%BE%A9%E5%B1%8F%E7%A7%91%E5%A4%A7-php-mysql-%E5%9F%BA%E7%A4%8E%E6%95%99%E5%AD%B8%E6%8A%95%E5%BD%B1%E7%89%87/</guid><description>&lt;p&gt;這次非常開心受到&lt;a href="http://www.mis.npust.edu.tw/index.jsp"&gt;國立屏東科技大學資管系&lt;/a&gt;邀請講課，主題是 PHP &amp;amp; MySQL 基礎介紹，來聽課的學生，就是資管系大三跟碩一的新生，第一次到屏科大，沒想到學校大到很誇張阿，在校園裡面都是騎機車上課，不像在&lt;a href="http://www.ndhu.edu.tw"&gt;東華大學&lt;/a&gt;，只能騎外環道，剩下的只能騎腳踏車，屏科大其實蠻偏僻的，離屏東市有一段距離，大概騎摩托車要 20 分鐘，至少今天回家是被用摩托車送到屏東火車站，感覺屏東還蠻熱鬧的。&lt;/p&gt;
&lt;p&gt;這些資管的學生還蠻認真的，基礎實力還不錯，不過還是要在加強一下，看屏科大資管都在學 &lt;a href="http://www.asp.net/"&gt;ASP.net&lt;/a&gt;，對於 html 有些基礎，大家好像都蠻喜歡拉物件，說這樣寫程式還蠻快的，不過 PHP 好像沒有類似工具，今天上課蠻順利的，至少大家都聽的懂，課堂作業都有寫出來，還蠻開心的，想聽聽大家對我上課的意見，看來只好等下次上課在問問看他們。&lt;/p&gt;</description></item><item><title>[美食] 高雄樹太老 成功路上新分店 10/10 開幕</title><link>https://blog.wu-boy.com/2009/10/%E7%BE%8E%E9%A3%9F-%E9%AB%98%E9%9B%84%E6%A8%B9%E5%A4%AA%E8%80%81-%E6%88%90%E5%8A%9F%E8%B7%AF%E4%B8%8A%E6%96%B0%E5%88%86%E5%BA%97-1010-%E9%96%8B%E5%B9%95/</link><pubDate>Fri, 16 Oct 2009 03:33:18 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/10/%E7%BE%8E%E9%A3%9F-%E9%AB%98%E9%9B%84%E6%A8%B9%E5%A4%AA%E8%80%81-%E6%88%90%E5%8A%9F%E8%B7%AF%E4%B8%8A%E6%96%B0%E5%88%86%E5%BA%97-1010-%E9%96%8B%E5%B9%95/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/4010730373/" title="1014193958 (by appleboy46)"&gt;&lt;img src="https://i1.wp.com/farm3.static.flickr.com/2641/4010730373_88a2dc9b93.jpg?resize=500%2C375&amp;#038;ssl=1" title="1014193958 (by appleboy46)" alt="1014193958 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 這次跟同事跑去吃成功路跟青年路交叉口的&lt;a href="http://www.kitaro.tw/index.html"&gt;樹太老日本定食&lt;/a&gt;，高雄還有另外一間在左營區裕誠路上面，但是我想說明一下這新開的這家分店，不知道是不是剛開幕還是員工沒有熟悉環境的關係，剛開始點菜，我們才六個人，結果服務人員幫我們點了7份套餐，真的是另我傻眼了，然後飲料還弄錯送上來給我們，奇怪，這些不是基本的功夫嗎？還是太緊張了阿，五個同事都是點蓋飯，可是蓋飯送來，感覺都乾乾的，味道跟醬汁都沒有融入到米飯裡面，醬汁也沒有什麼味道，所以在想是不是也是請新廚師的關係，好險我點的是綜合炸物，這一份要 220 元，這個還不錯吃&lt;/p&gt;</description></item><item><title>利用 PHP MySQL Quota-Tool 來限制 MySQL 存取空間大小</title><link>https://blog.wu-boy.com/2009/10/%E5%88%A9%E7%94%A8-php-mysql-quota-tool-%E4%BE%86%E9%99%90%E5%88%B6-mysql-%E5%AD%98%E5%8F%96%E7%A9%BA%E9%96%93%E5%A4%A7%E5%B0%8F/</link><pubDate>Fri, 09 Oct 2009 04:17:37 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/10/%E5%88%A9%E7%94%A8-php-mysql-quota-tool-%E4%BE%86%E9%99%90%E5%88%B6-mysql-%E5%AD%98%E5%8F%96%E7%A9%BA%E9%96%93%E5%A4%A7%E5%B0%8F/</guid><description>&lt;p&gt;在&lt;a href="http://phorum.study-area.org"&gt;酷！學園&lt;/a&gt;發現&lt;a href="http://phorum.study-area.org/index.php/topic,58445.0.html"&gt;這篇&lt;/a&gt;，有人問到如何限制 MySQL 的使用空間大小，我第一個想到的就是 &lt;a href="http://linux.vbird.org/linux_basic/0420quota.php"&gt;Linux quota&lt;/a&gt; 指令限制大小，看回文有一篇利用 MySQL 來解決此問題：&lt;a href="http://projects.marsching.org/mysql_quota/"&gt;MySQL Quota-Tool&lt;/a&gt;，它利用了 MySQL INSERT 跟 CREATE 的權限控管，來達成限制，當資料庫大小超過您所設定的限制，系統就會拔除您的 INSERT 跟 CREATE 權限，如果沒有超過，就會將權限設定回去，基本上非常簡單，首先要先建立一個專屬控管每個資料庫的 database&lt;/p&gt;
&lt;pre class="brush: sql; title: ; notranslate" title=""&gt;CREATE TABLE `Quota` (`Db` CHAR(64) NOT NULL, 
`Limit` BIGINT NOT NULL,
`Exceeded` ENUM('Y','N') DEFAULT 'N' NOT NULL,
PRIMARY KEY (`Db`), UNIQUE (`Db`));&lt;/pre&gt;</description></item><item><title>[FreeBSD] 簡易架設 git Server，git 使用教學</title><link>https://blog.wu-boy.com/2009/10/freebsd-%E7%B0%A1%E6%98%93%E6%9E%B6%E8%A8%AD-git-server%EF%BC%8Cgit-%E4%BD%BF%E7%94%A8%E6%95%99%E5%AD%B8/</link><pubDate>Mon, 05 Oct 2009 06:18:51 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/10/freebsd-%E7%B0%A1%E6%98%93%E6%9E%B6%E8%A8%AD-git-server%EF%BC%8Cgit-%E4%BD%BF%E7%94%A8%E6%95%99%E5%AD%B8/</guid><description>&lt;p&gt;&lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; 是一套免費 open source 的版本控制軟體，另外還有很多套版本控制軟體，如：&lt;a href="http://mercurial.selenic.com/wiki/"&gt;Mercurial&lt;/a&gt;, &lt;a href="http://bazaar-vcs.org/"&gt;Bazaar&lt;/a&gt;, &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt;, &lt;a href="http://www.nongnu.org/cvs/"&gt;CVS&lt;/a&gt;, &lt;a href="http://www.perforce.com/"&gt;Perforce&lt;/a&gt;, and &lt;a href="http://msdn.microsoft.com/en-us/vstudio/aa718670.aspx"&gt;Visual SourceSafe&lt;/a&gt;，其中 Mercurial 又是 &lt;a href="http://googlecode.blogspot.com/2009/04/mercurial-support-for-project-hosting.html"&gt;Google Code Project Hosting 採用的版本控制系統&lt;/a&gt;，當然 google 也支援原本的 &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt;，Git 為現在很紅的一套版本控制 Software，底下紀錄在 &lt;a href="http://www.freebsd.org/"&gt;FreeBSD&lt;/a&gt; 如何架設簡易 Git Server。 1. 利用 FreeBSD ports 安裝：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;cd /usr/ports/devel/git; make install clean&lt;/pre&gt; 2. 修改 /etc/rc.conf 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;git_daemon_enable="YES"
git_daemon_directory="/path/git/repo"
git_daemon_flags="--export-all --syslog --enable=receive-pack --listen=192.168.1.1"&lt;/pre&gt; 注意 git\_daemon\_flags 可以加入 --verbose 參數，以方便 debug 3. 新增使用者 git 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;pw user add git&lt;/pre&gt; 4. 啟動 git daemon 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;/usr/local/etc/rc.d/git_daemon start&lt;/pre&gt; 您會發現多出 9418 連接埠，就是成功了</description></item><item><title>[網站] 好站連結 (五)</title><link>https://blog.wu-boy.com/2009/09/%E7%B6%B2%E7%AB%99-%E5%A5%BD%E7%AB%99%E9%80%A3%E7%B5%90-%E4%BA%94/</link><pubDate>Tue, 29 Sep 2009 06:58:09 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/09/%E7%B6%B2%E7%AB%99-%E5%A5%BD%E7%AB%99%E9%80%A3%E7%B5%90-%E4%BA%94/</guid><description>&lt;p&gt;C#&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.akadia.com/services/dotnet_databinding.html#Binding%20to%20a%20Combobox"&gt;Data Binding in .NET / C# Windows Forms&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://dotnetperls.com/datasource-array"&gt;DataSource Array in C#&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://dotnetperls.com/datatable-use"&gt;DataTable Examples, Columns and Rows in C#&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://m955.com/wp/archives/111"&gt;ComboBox 的資料繫結合傳遞參數&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://topic.csdn.net/t/20030901/09/2209143.html"&gt;怎么取comboBox的ValueMember里面的值&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://topic.csdn.net/t/20050708/13/4131532.html"&gt;有dataset, 怎样绑定到combobox?&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://stackoverflow.com/questions/256832/c-fill-a-combo-box-with-a-datatable"&gt;C# - Fill a combo box with a DataTable&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.dotblogs.com.tw/chou/archive/2009/02/16/7189.aspx" title="Title of this entry."&gt;[C#]DataGridView欄位驗證只能是數字且不能為空白&lt;/a&gt;{#viewpost_ascx_TitleUrl}&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.java2s.com/Code/CSharp/GUI-Windows-Form/Formwindowclosingevent.htm"&gt;Form window closing event&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/zh-tw/library/system.windows.forms.form.closing%28VS.80%29.aspx"&gt;Form.Closing 事件&lt;/a&gt; PHP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a title="Permanent Link: PHP Performance tip: require versus require_once" rel="bookmark" href="http://www.techyouruniverse.com/software/php-performance-tip-require-versus-require_once"&gt;PHP Performance tip: require versus require_once&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.virtuosimedia.com/tutorials/37-tested-php-perl-and-javascript-regular-expressions"&gt;37 Tested PHP, Perl, and JavaScript Regular Expressions&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="entry-title-link" href="http://feedproxy.google.com/%7Er/ElectricToolboxBlog/%7E3/GXrqP1oBk5c/" target="_blank"&gt;Extract domain, path etc from a full url with PHP&lt;/a&gt; FreeBSD&lt;/p&gt;</description></item><item><title>[FreeBSD] send-pr porter committer 需要注意事項</title><link>https://blog.wu-boy.com/2009/09/freebsd-send-pr-committer-%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85/</link><pubDate>Tue, 22 Sep 2009 14:03:56 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/09/freebsd-send-pr-committer-%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/3944776064/" title="logo-red (by appleboy46)"&gt;&lt;img src="https://i2.wp.com/farm3.static.flickr.com/2495/3944776064_38690ab101.jpg?resize=457%2C75&amp;#038;ssl=1" title="logo-red (by appleboy46)" alt="logo-red (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 來紀錄一下最近使用 &lt;a href="http://www.freebsd.org/cgi/man.cgi?query=send-pr&amp;amp;sektion=1"&gt;send-pr&lt;/a&gt; 的心得，send-pr 就是提交問題 problem report (PR) 到 &lt;a href="http://www.freebsd.org"&gt;FreeBSD&lt;/a&gt; Support 中心，您也可以透過 send-pr 發送新的 ports 給 FreeBSD 中心，最近 &lt;a href="http://codeIgniter.com"&gt;CodeIgniter&lt;/a&gt; V1.7.2 的 Release，所以把 CI 的 patch 送給中心並且 CC 給 maintainer，/usr/bin/send-pr 這支 shell script 在 FreeBSD 用處可多了，不單只是 ports 的問題，也有 www, i386, ia64 的問題，都可以透過它回報給總部喔。 要瞭解 ports 怎麼產生，或者是怎麼製作 patch 都可以參考 &lt;a href="http://www.freebsd.org/doc/en/books/porters-handbook/"&gt;FreeBSD Porter&amp;rsquo;s Handbook&lt;/a&gt;，文件是英文的，請大家多多包含，不過還是有&lt;a href="http://www.freebsd.org/doc/zh_TW/books/porters-handbook/"&gt;中文的文件&lt;/a&gt;，通常 patch 是還蠻簡單的，底下紀錄我做的步驟，以及如何測試 ports 正確性。其實步驟不難啦。&lt;/p&gt;</description></item><item><title>[生活] 2009.09.18 剪了短頭髮 …. 輕鬆多了</title><link>https://blog.wu-boy.com/2009/09/%E7%94%9F%E6%B4%BB-%E5%89%AA%E4%BA%86%E7%9F%AD%E9%A0%AD%E9%AB%AE-%E8%BC%95%E9%AC%86%E5%A4%9A%E4%BA%86/</link><pubDate>Fri, 18 Sep 2009 14:30:37 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/09/%E7%94%9F%E6%B4%BB-%E5%89%AA%E4%BA%86%E7%9F%AD%E9%A0%AD%E9%AB%AE-%E8%BC%95%E9%AC%86%E5%A4%9A%E4%BA%86/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/3931716190/" title="0918213624"&gt;&lt;img src='https://i0.wp.com/farm4.static.flickr.com/3472/3931716190_0b5956ec84.jpg?w=840&amp;#038;ssl=1' border='0' alt='0918213624' data-recalc-dims="1" /&gt;&lt;/a&gt; 今天跑去剪了短頭髮，上次好像沒有剪這麼短，小姐看到我說，怎麼頭髮長這麼快阿，所以他就幫我剪了超短，哈哈，不過沒關係，我喜歡短髮，畢竟夏天阿，超熱的，下次我要來換個髮型了，有一個月的時間可以想一想。&lt;/p&gt;</description></item><item><title>[新聞] CodeIgniter v1.7.2 Released</title><link>https://blog.wu-boy.com/2009/09/%E6%96%B0%E8%81%9E-codeigniter-v172-released/</link><pubDate>Wed, 16 Sep 2009 14:10:03 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/09/%E6%96%B0%E8%81%9E-codeigniter-v172-released/</guid><description>&lt;p&gt;&lt;a href="http://codeigniter.com/"&gt;CodeIgniter&lt;/a&gt; 終於 Release V1.7.2 版本了，官方網站也公佈了此&lt;a href="http://codeigniter.com/news/codeigniter_v1.7.2_released/"&gt;消息&lt;/a&gt;，那這次跟 v1.7.2 版本有哪些不一樣呢，我想最主要應該是支援 PHP 5.3.0 了&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;相容於 PHP 5.3.0&lt;/li&gt;
&lt;li&gt;新增 &lt;a href="http://codeigniter.com/user_guide/libraries/cart.html"&gt;Cart Class&lt;/a&gt; 類別&lt;/li&gt;
&lt;li&gt;改善 &lt;a href="http://codeigniter.com/user_guide/helpers/form_helper.html"&gt;Form helper&lt;/a&gt; 函數&lt;/li&gt;
&lt;li&gt;新增 is_php() 到 &lt;a href="http://codeigniter.com/user_guide/general/common_functions.html"&gt;Common functions&lt;/a&gt; 來更有善的比較 PHP 版本&lt;/li&gt;
&lt;li&gt;無數個 bug 修正&lt;/li&gt;
&lt;li&gt;修改 show_error() 函數功能 更多的 bug 修正，可以觀看&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://codeigniter.com/user_guide/changelog.html"&gt;change log&lt;/a&gt;，我也順便了 send-pr 給 FreeBSD ports maintainer 請他 update 到 1.7.2：&lt;a href="http://www.freebsd.org/cgi/query-pr.cgi?pr=138848"&gt;ports/138848&lt;/a&gt;，台灣的官網也需要來修正了，已經更新了 v1.7.2 上去，至於&lt;a href="http://www.codeigniter.org.tw/user_guide/"&gt;繁體中文文件&lt;/a&gt;方面還沒更新，有時間會把它更新，如果有任何問題，可以先到&lt;a href="http://www.codeigniter.org.tw/forum/"&gt;論壇&lt;/a&gt;留言找我。&lt;/p&gt;</description></item><item><title>[RHEL]Installing PHP 5.1.x 5.2.x or 5.3.x on RedHat ES5, CentOS 5</title><link>https://blog.wu-boy.com/2009/09/rhelinstalling-php-52x-or-53x-on-redhat-es5-centos-5/</link><pubDate>Tue, 08 Sep 2009 02:34:10 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/09/rhelinstalling-php-52x-or-53x-on-redhat-es5-centos-5/</guid><description>&lt;p&gt;最近幫公司處理一台 RHEL 機器，把原本的 PHP 版本 5.1.6 升級到 5.3.0，不過因為 5.3.0 把很多支援的函數都拿掉了，造成很 open source 套件都沒辦法支援，&lt;a href="http://www.phpmyadmin.net/home_page/index.php"&gt;phpMyAdmin&lt;/a&gt; 也要換成 3 版以上才可以運作，PHP 5.3.0 已經不支援很多函數，可以參考 &lt;a href="http://tw.php.net/manual/en/migration53.deprecated.php"&gt;Deprecated features in PHP 5.3.x&lt;/a&gt;，有用到 &lt;a href="http://tw.php.net/manual/en/function.ereg.php"&gt;ereg()&lt;/a&gt; 或者是 &lt;a href="http://tw.php.net/manual/en/function.eregi.php"&gt;eregi()&lt;/a&gt; 都必須統統換成 &lt;a href="http://tw.php.net/manual/en/function.preg-match.php"&gt;preg_match()&lt;/a&gt;，最後終究因為 json 的關係，把 PHP 升級到 5.2 以上才有支援，參考了一篇 &lt;a href="http://bluhaloit.wordpress.com/2008/03/13/installing-php-52x-on-redhat-es5-centos-5-etc/"&gt;Installing PHP 5.2.x or 5.3.x on RedHat ES5, CentOS 5, etc&lt;/a&gt;，作法其實很容易，不用幾個指令就可以完成了&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
rpm -Uvh remi-release-5*.rpm epel-release-5*.rpm&lt;/pre&gt; 如果是 X86_64 的，請自行更換網址，這裡有些注意的是，你要升級 PHP 請利用下面： 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;yum --enablerepo=remi update php&lt;/pre&gt; 不過升級的時候，必須把 MySQL 也一併升級，不然會出現錯誤，原本的 MySQL 套件用 yum remove 移除掉，在利用 yum --enablerepo=remi 方式升級 MySQL 跟 PHP 套件，就可以了。 在 RHEL 裡面，PHP 5.1.6 也是可以支援 pecl-json 的，利用 yum search 然後安裝就ok了 
&lt;blockquote&gt;
&lt;p&gt;php-pecl-json.x86_64 : PECL library to implement JSON in PHP&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;yum install php-pecl-json&lt;/pre&gt;&lt;/p&gt;</description></item><item><title>[高雄美食] 夢時代村上屋日式歐風咖哩 + 高雄巨蛋 cosplay 照片</title><link>https://blog.wu-boy.com/2009/09/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F-%E5%A4%A2%E6%99%82%E4%BB%A3%E6%9D%91%E4%B8%8A%E5%B1%8B%E6%97%A5%E5%BC%8F%E6%AD%90%E9%A2%A8%E5%92%96%E5%93%A9-%E9%AB%98%E9%9B%84%E5%B7%A8%E8%9B%8B-cosplay/</link><pubDate>Wed, 02 Sep 2009 01:14:52 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/09/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F-%E5%A4%A2%E6%99%82%E4%BB%A3%E6%9D%91%E4%B8%8A%E5%B1%8B%E6%97%A5%E5%BC%8F%E6%AD%90%E9%A2%A8%E5%92%96%E5%93%A9-%E9%AB%98%E9%9B%84%E5%B7%A8%E8%9B%8B-cosplay/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/3876680576/" title="SDC10737 (by appleboy46)"&gt;&lt;img src="https://i1.wp.com/farm3.static.flickr.com/2663/3876680576_7d87e50d85.jpg?resize=500%2C375&amp;#038;ssl=1" title="SDC10737 (by appleboy46)" alt="SDC10737 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 來介紹上禮拜天(2009/08/30)去夢時代七樓吃村上屋日式歐風咖哩，這家評價好像不是很好，因為吃完晚上回家看一下 ptt，好像不怎麼推薦，但是朋友說之前工作有來吃過，還蠻好吃的，所以就推薦我來吃看看，進去呢，我看了一下菜單，還蠻平價的，基本上吃套餐大概就是 250 ~ 350 之間，主推咖哩系列，我點的是歐風炸蝦天婦羅咖哩蛋包飯，還蠻好吃的，朋友點布根地紅酒牛肉蛋包飯，有一點紅酒的味道，底下是價目表菜單。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/3876681388/" title="SDC10739"&gt;&lt;img src='https://i2.wp.com/farm3.static.flickr.com/2659/3876681388_63759c533e.jpg?w=840&amp;#038;ssl=1' hspace='0' vspace='0' border='0' alt='SDC10739' data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[FreeBSD] 取得 FreeBSD CVSUP 的更新狀態</title><link>https://blog.wu-boy.com/2009/08/freebsd-%E5%8F%96%E5%BE%97-freebsd-cvsup-%E7%9A%84%E6%9B%B4%E6%96%B0%E7%8B%80%E6%85%8B/</link><pubDate>Mon, 31 Aug 2009 06:30:01 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/08/freebsd-%E5%8F%96%E5%BE%97-freebsd-cvsup-%E7%9A%84%E6%9B%B4%E6%96%B0%E7%8B%80%E6%85%8B/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/3873839724/" title="FreeBSD CVS Site_1251699923593 (by appleboy46)"&gt;&lt;img src="https://i1.wp.com/farm3.static.flickr.com/2548/3873839724_f8dbe78179.jpg?resize=500%2C306&amp;#038;ssl=1" title="FreeBSD CVS Site_1251699923593 (by appleboy46)" alt="FreeBSD CVS Site_1251699923593 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 在 Sayya Joehorn 個人版看到有人實做出偵測台灣 CVSUP Server 更新狀態，以及更新的時間，也有程式碼的釋出，參考這篇：&lt;a href="http://blog.urdada.net/2007/12/24/69/"&gt;Script: 取得 FreeBSD CVSUP 的更新狀態&lt;/a&gt;，這篇寫的蠻清楚的，只需要 perl 跟 php 就可以完成，不過在使用過程有些事項必須要注意，在 FreeBSD 6.2 R 之後，已經內建了 &lt;a href="http://www.freshports.org/net/csup/"&gt;csup&lt;/a&gt; 指令來更新 ports 或者是核心，所以要在另外安裝上 &lt;a href="http://www.freshports.org/net/cvsup/"&gt;cvsup&lt;/a&gt; ports 套件，在 Perl 方面，也先裝 &lt;a href="http://www.freshports.org/net/p5-Net-Rendezvous/"&gt;net/p5-Net-Rendezvous&lt;/a&gt; 才可以正確使用。&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# 安裝必備軟體
cd /usr/ports/net/p5-Net-Rendezvous/ &amp;&amp; make install clean
cd /usr/ports/net/cvsup-without-gui &amp;&amp; make install clean&lt;/pre&gt;</description></item><item><title>[轉錄] 高雄市十大伴手禮、特色餐廳</title><link>https://blog.wu-boy.com/2009/08/%E8%BD%89%E9%8C%84-%E9%AB%98%E9%9B%84%E5%B8%82%E5%8D%81%E5%A4%A7%E4%BC%B4%E6%89%8B%E7%A6%AE%E3%80%81%E7%89%B9%E8%89%B2%E9%A4%90%E5%BB%B3/</link><pubDate>Sat, 29 Aug 2009 04:38:31 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/08/%E8%BD%89%E9%8C%84-%E9%AB%98%E9%9B%84%E5%B8%82%E5%8D%81%E5%A4%A7%E4%BC%B4%E6%89%8B%E7%A6%AE%E3%80%81%E7%89%B9%E8%89%B2%E9%A4%90%E5%BB%B3/</guid><description>&lt;p&gt;說到高雄的伴手禮，還真的不知道有什麼，結果看到其他網站有介紹，就順便轉貼過來了，看完內容，發現高雄很多好吃的特色餐廳都沒去吃過，如果有機會，再去吃吧，先紀錄一下。 底下內容轉錄自：&lt;a href="http://plog.longwin.com.tw/my-life/2009/08/25/kaohsiung-top10-gift-restaurant-2009"&gt;http://plog.longwin.com.tw/my-life/2009/08/25/kaohsiung-top10-gift-restaurant-2009&lt;/a&gt; 餐廳名稱 摘錄自: &lt;a title="高雄市十大伴手禮、特色餐廳出爐" href="http://news.epochtimes.com.tw/7/11/24/71258.htm" target="_blank"&gt;高雄市十大伴手禮、特色餐廳出爐&lt;/a&gt; (地址電話另外靠 Google 找)&lt;/p&gt;</description></item><item><title>[CodeIgniter] 分享中文官方網站範例程式碼</title><link>https://blog.wu-boy.com/2009/08/codeigniter-%E5%88%86%E4%BA%AB%E4%B8%AD%E6%96%87%E5%AE%98%E6%96%B9%E7%B6%B2%E7%AB%99%E7%AF%84%E4%BE%8B%E7%A8%8B%E5%BC%8F%E7%A2%BC/</link><pubDate>Tue, 18 Aug 2009 16:04:18 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/08/codeigniter-%E5%88%86%E4%BA%AB%E4%B8%AD%E6%96%87%E5%AE%98%E6%96%B9%E7%B6%B2%E7%AB%99%E7%AF%84%E4%BE%8B%E7%A8%8B%E5%BC%8F%E7%A2%BC/</guid><description>&lt;p&gt;之前在高雄開了一堂：&lt;a title="Permanent Link to [CodeIgniter] Open Source PHP Web Framework 系列講座" rel="bookmark" href="http://blog.wu-boy.com/2009/07/20/1511/"&gt;[CodeIgniter] Open Source PHP Web Framework 系列講座&lt;/a&gt;，在上課過程，我很強調大家可以多多參考網路上的範例來學習，所以找了官方網站的程式碼想分享給大家，希望大家看完程式碼，可以針對 &lt;a href="http://codeigniter.com/"&gt;CodeIgniter&lt;/a&gt; 的 Model Views Controller 有比較深入的瞭解，如果有不懂的地方，可以來&lt;a href="http://www.codeigniter.org.tw/forum/"&gt;論壇&lt;/a&gt;這邊提出問題，我會儘快回答大家，底下是程式碼的下載網址，包含論壇程式 PHPBB3，以及所有影片程式碼，大家可以參考看看： &lt;a href="http://www.codeigniter.org.tw/download_files/CodeIgniter.tar.gz"&gt;檔案下載&lt;/a&gt; 裡面有需要注意的，就是 .htaccess 檔案：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;RewriteEngine on
RewriteBase /
RewriteCond $1 !^(videos|download_files|user_guide|forum|index\.php|admin|css|flash|images|img|includes|js|language|captcha|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L,QSA]&lt;/pre&gt; 裡面會附上 db.sql 檔案，這是資料庫檔案，請麻煩匯入到您的資料庫，然後修改 
&lt;p&gt;&lt;span style="color:green"&gt;system/application/config/database.php&lt;/span&gt; 內容的資料庫相關資訊，這樣就可以了。&lt;/p&gt;</description></item><item><title>中正大學通訊系網路組謝師宴-侯老師(二) Charlene 筱琳相機</title><link>https://blog.wu-boy.com/2009/08/%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E9%80%9A%E8%A8%8A%E7%B3%BB%E7%B6%B2%E8%B7%AF%E7%B5%84%E8%AC%9D%E5%B8%AB%E5%AE%B4-%E4%BE%AF%E8%80%81%E5%B8%AB%E4%BA%8C-charlene-%E7%AD%B1%E7%90%B3%E7%9B%B8/</link><pubDate>Fri, 14 Aug 2009 12:48:20 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/08/%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E9%80%9A%E8%A8%8A%E7%B3%BB%E7%B6%B2%E8%B7%AF%E7%B5%84%E8%AC%9D%E5%B8%AB%E5%AE%B4-%E4%BE%AF%E8%80%81%E5%B8%AB%E4%BA%8C-charlene-%E7%AD%B1%E7%90%B3%E7%9B%B8/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/3820296756/" title="__ 033"&gt;&lt;img src='https://i1.wp.com/farm4.static.flickr.com/3576/3820296756_1861c0d5b9.jpg?w=840&amp;#038;ssl=1' border='0' alt='__ 033' data-recalc-dims="1" /&gt;&lt;/a&gt; 今天來分享筱琳的相機照片，跟她凹了好久才給我，筱琳有把照片傳給怡欣，不過怡欣竟然沒有分享，真是太過分了，這張照片是謝師宴的兩大主角，侯老師跟筱琳，希望這次的謝師宴有讓老師跟筱琳滿意啦。&lt;/p&gt;</description></item><item><title>中正大學通訊系網路組謝師宴-侯老師</title><link>https://blog.wu-boy.com/2009/08/%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E9%80%9A%E8%A8%8A%E7%B3%BB%E7%B6%B2%E8%B7%AF%E7%B5%84%E8%AC%9D%E5%B8%AB%E5%AE%B4-%E4%BE%AF%E8%80%81%E5%B8%AB/</link><pubDate>Mon, 10 Aug 2009 16:44:38 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/08/%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E9%80%9A%E8%A8%8A%E7%B3%BB%E7%B6%B2%E8%B7%AF%E7%B5%84%E8%AC%9D%E5%B8%AB%E5%AE%B4-%E4%BE%AF%E8%80%81%E5%B8%AB/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/3785081142/" title="DSC02995"&gt;&lt;img src='https://i0.wp.com/farm4.static.flickr.com/3498/3785081142_18ce1b1503.jpg?w=840&amp;#038;ssl=1' hspace='0' vspace='0' border='0' alt='DSC02995' data-recalc-dims="1" /&gt;&lt;/a&gt; 很高興可以參加第二次謝師宴，在今年一月畢業，參加了95級謝師宴，然而現在是參加96級，原本我希望林玲玉跟林君名可以下來一起參加，晚上就住在我家就可以了，可惜真的太晚講了，不然這天應該可以玩得更開心，行程我跟宗翰大部份都有討論過了，大致上是ok，當天我先到火車站等老師們從嘉義坐火車下來，來的有佩甄、怡欣、宗翰、侯老師以及老師的女兒，早上起床什麼都沒吃，最主要就是因為這天要吃很多很多東西，中餐時間宗翰選擇了一間日本料理：&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.wretch.cc/blog/bo2/16052008"&gt;義郎創作壽司&lt;/a&gt;，這間的食材用的實在非常高檔，跟嘉義的鄉情比起來真的差很多，當然價位上面也差距很大，不過真的非常好吃，我看老師非常的滿意，如果多人一起去的話，這樣平均下來會比較便宜，感覺越少人去越不划算，在吃壽司過程，當然我又變成主角了，大家都希望我趕快講一下發生什麼事情，就簡略講了一堆事情，我看現場只有老師的女兒聽不太懂，可能是因為中文不太懂，用太多關鍵字，以及大家共同的術語，哈哈，不過感覺老師的女兒講話還蠻好玩的，有大陸的味道，超會捲舌，Orz，我的愛情觀念願意跟大家分享，但是在此篇沒辦法在多描述這個了，因為重點是我們這群畢業的學生幫老師謝師宴，將來有機會演講，或者是聚在一起，再講也都是來得及的，我一生中總是過的多采多姿，因為有大家的相遇，帶給我快樂，讓我變成這世界上最幸福的人 ^^。&lt;/p&gt;</description></item><item><title>[網站] 好站連結 (四)</title><link>https://blog.wu-boy.com/2009/07/%E7%B6%B2%E7%AB%99-%E5%A5%BD%E7%AB%99%E9%80%A3%E7%B5%90-%E5%9B%9B/</link><pubDate>Tue, 28 Jul 2009 07:00:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/07/%E7%B6%B2%E7%AB%99-%E5%A5%BD%E7%AB%99%E9%80%A3%E7%B5%90-%E5%9B%9B/</guid><description>&lt;p&gt;PHP&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a title="Permanent Link to How to create Microsoft Office Documents with PHP" rel="bookmark" href="http://www.rawseo.com/news/2009/06/11/how-to-create-microsoft-office-documents-with-php/"&gt;How to create Microsoft Office Documents with PHP&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="entry-title-link" href="http://feedproxy.google.com/%7Er/roga/%7E3/qw67nsa3mMI/2226" target="_blank"&gt;IP 判斷方式&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.electrictoolbox.com/php-get-available-constants/"&gt;Get a list of all available constants with PHP&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.electrictoolbox.com/php-get-available-classes/"&gt;Get a list of all available classes with PHP&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.electrictoolbox.com/php-get-available-functions/"&gt;Get a list of all available functions with PHP&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.electrictoolbox.com/google-analytics-api-and-php/"&gt;The Google Analytics API and PHP: A series&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="entry-title-link" href="http://feedproxy.google.com/%7Er/ElectricToolboxBlog/%7E3/oAS2MTwW7vI/" target="_blank"&gt;Google Analytics API PHP Class data method parameters&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.phpro.org/tutorials/Dynamically-Create-Menu-With-PHP-DOM.html"&gt;Dynamically Create Menu With PHP DOM&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[教學] 加入 Sphinx 繁體中文全文檢索 on CodeIgniter</title><link>https://blog.wu-boy.com/2009/07/%E6%95%99%E5%AD%B8-%E5%8A%A0%E5%85%A5-sphinx-%E7%B9%81%E9%AB%94%E4%B8%AD%E6%96%87%E5%85%A8%E6%96%87%E6%AA%A2%E7%B4%A2-on-codeigniter/</link><pubDate>Sun, 26 Jul 2009 03:40:26 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/07/%E6%95%99%E5%AD%B8-%E5%8A%A0%E5%85%A5-sphinx-%E7%B9%81%E9%AB%94%E4%B8%AD%E6%96%87%E5%85%A8%E6%96%87%E6%AA%A2%E7%B4%A2-on-codeigniter/</guid><description>&lt;p&gt;&lt;a href="http://sphinxsearch.com/"&gt;&lt;img class="alignleft size-full wp-image-1467" title="sphinx" src="https://i0.wp.com/blog.wu-boy.com/wp-content/uploads/2009/06/sphinx.jpg?resize=200%2C51" alt="sphinx" data-recalc-dims="1" /&gt;&lt;/a&gt; 在寫這篇之前，有介紹過了 &lt;a href="http://sphinxsearch.com/"&gt;Sphinx&lt;/a&gt; 一篇針對繁體中文檢索的&lt;a href="http://blog.wu-boy.com/2009/06/20/1466/"&gt;教學&lt;/a&gt;，大家可以先去參考看看，把 Sphinx 服務架設起來，在搭配 CodeIgniter MVC Framework 使用，把 Sphinx 提供的 PHP API 放到 CI 的 Library 裡面就可以運作了，首先去官網下載套件，然後參考&lt;a href="http://www.sphinxsearch.com/docs/current.html#installation"&gt;官方的安裝文件&lt;/a&gt;，大致上就差不多了，下載的檔案裡面會有 api 資料夾，裡面提供了 python, ruby, java, php 的 client 端檔案，讓您去自由呼叫，PHP 部份可以看 sphinxapi.php 這個檔案，我們也只需要把這個檔案放入 CI 的 Library 裡面，不過寫法有些改變，請看底下&lt;/p&gt;</description></item><item><title>[CodeIgniter] Open Source PHP Web Framework 系列講座</title><link>https://blog.wu-boy.com/2009/07/codeigniter-open-source-php-web-framework-%E7%B3%BB%E5%88%97%E8%AC%9B%E5%BA%A7/</link><pubDate>Mon, 20 Jul 2009 07:28:14 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/07/codeigniter-open-source-php-web-framework-%E7%B3%BB%E5%88%97%E8%AC%9B%E5%BA%A7/</guid><description>&lt;p&gt;&lt;strong&gt;update 2009.07.23&lt;/strong&gt;: 有影音檔可以看了，&lt;a href="http://whoswho.openfoundry.org/workshop/details/43-open-source-php-web-framework-codeigniter-.html"&gt;請點選這裡&lt;/a&gt; 7月18日受到 &lt;a href="http://www.openfoundry.org/"&gt;OSSF::自由軟體鑄造場(Open Source Software Foundry)&lt;/a&gt;的邀請，在高雄講一場 &lt;a href="http://whoswho.openfoundry.org/workshop/details/43-open-source-php-web-framework-codeigniter-.html"&gt;Open Source PHP Web Framework系列講座 - CodeIgniter (高雄場次)&lt;/a&gt; ，我準備了 87 張投影片，包含介紹了 &lt;a href="http://codeigniter.com/"&gt;CodeIgniter&lt;/a&gt; 目前台灣官方網站的狀況，以及流行 PHP MVC Framework 的比較，大部分時間花在 Controller, Views 身上，還有 helper function, Library Class 教學使用，沒有把 Model 精華部份教完有點可惜，內容可能有點多，一整天六小時的課程把教學消化，好像有點困難了，這也是給我一點警惕，下次教學這部份內容要在改變一下，這樣對於來上課的學員，才不會感到排斥，最後非常感謝&lt;a href="http://phorum.study-area.org/index.php"&gt;酷學園&lt;/a&gt;的阿民來幫忙錄影，以及飛亨現場支援，以及讓我有這次機會可以上台分享這幾個月在 CI 上面的使用心得，底下是我這次的上課投影片，如果大家有問題可以到&lt;a href="http://www.codeigniter.org.tw/forum/"&gt;論壇&lt;/a&gt;討論，或者是看看&lt;a href="http://www.codeigniter.org.tw/user_guide/"&gt;繁體中文教學文件&lt;/a&gt;，如果對於翻譯教學文件有興趣，可以再跟我聯絡喔。&lt;/p&gt;
&lt;div id="__ss_1742355" style="width: 425px; text-align: left;"&gt;
&lt;/div&gt;</description></item><item><title>[SQL] MySQL ROW_NUMBER Simulation</title><link>https://blog.wu-boy.com/2009/07/sql-mysql-row_number-simulation/</link><pubDate>Wed, 15 Jul 2009 02:48:34 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/07/sql-mysql-row_number-simulation/</guid><description>&lt;p&gt;在台大 &lt;a href="http://www.ptt.cc/bbs/Database/index.html"&gt;PTT Database&lt;/a&gt; 版看到有人問一個問題，我覺得還不錯，問題如下：&lt;a href="http://www.ptt.cc/bbs/Database/M.1247394036.A.A50.html"&gt;網頁版&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;小弟在練習做一個系統遇到以下問題 志願 | 系所 | 功能 1 | a | 退選 2 | b | 退選 3 | c | 退選 4 | d | 退選 5 | e | 退選 網頁介面如上(用for迴圈+mysql_fetch_object抓出資料) 報名序號 | 姓名 | 志願1 | 志願2 | 志願3 | 志願4 | 志願5 1001 小王 a b c d e 資料庫欄位內容如上 想請問&lt;del&gt;若使用者想退選志願3~~照理說用update把志願3欄位清掉 網頁再一次抓資料會變成志願3的系所變空的&lt;/del&gt;(如下表) 志願 | 系所 | 功能 1 | a | 退選 2 | b | 退選 3 | | 退選 4 | d | 退選 5 | e | 退選 有沒有辦法在select的時候排除空的那欄 也就是說抓資料的時候，以上述為例，只抓出4筆，變成下表 志願 | 系所 | 功能 1 | a | 退選 2 | b | 退選 3 | d | 退選 4 | e | 退選&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[CodeIgniter] lighttpd rewrite rule &amp;&amp; apache mod_rewrite</title><link>https://blog.wu-boy.com/2009/07/codeigniter-lighttpd-rewrite-rule-apache-mod_rewrite/</link><pubDate>Thu, 09 Jul 2009 04:05:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/07/codeigniter-lighttpd-rewrite-rule-apache-mod_rewrite/</guid><description>&lt;p&gt;&lt;a href="http://codeigniter.com"&gt;CodeIgniter&lt;/a&gt; 要移除網址列存在的 index.php，&lt;a href="http://www.apache.org/"&gt;apache&lt;/a&gt; 必須使用 &lt;a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html"&gt;mod_rewrite&lt;/a&gt; 寫入 .htaccess 的方式來達成，&lt;a href="http://www.lighttpd.net/"&gt;lighttpd&lt;/a&gt; 也是有支援 rewrite，可以參考官方文件：&lt;a href="http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModRewrite"&gt;Module: mod_rewrite&lt;/a&gt;，設定方法很容易。&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$HTTP["host"] == "mimi.twgg.org" {
 server.document-root = "/var/www/html/MLB/"
 url.rewrite = (
 "^/images/.*$" =&gt; "$0",
 "^/includes/.*$" =&gt; "$0",
 "^/(.*)$" =&gt; "index.php/$1"

 )
 accesslog.filename = "/var/log/lighttpd/mimi.twgg.org-access_log"
}&lt;/pre&gt;</description></item><item><title>[Perl] 解決 Wide character in print with UTF-8 mode</title><link>https://blog.wu-boy.com/2009/07/perl-with-utf-8-mode/</link><pubDate>Wed, 01 Jul 2009 08:30:03 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/07/perl-with-utf-8-mode/</guid><description>&lt;p&gt;最近在寫 Perl 的程式，發現在正規比對的時候，print 出中文資料會出現 &amp;ldquo;&lt;span style="color: #ff0000;"&gt;Wide character in print at&lt;/span&gt;&amp;rdquo; 的 warning 訊息，在 google 找到一篇解決方法：&lt;a href="http://www.jeffhung.net/blog/articles/jeffhung/417/"&gt;Perl with UTF-8 mode&lt;/a&gt;，這篇提出的解決方法有很多種，comment 留言也有提供解法，可以去看一下，還蠻不錯的，那底下是我參考的解法： 只要在表頭加上：&lt;/p&gt;
&lt;pre class="brush: perl; title: ; notranslate" title=""&gt;use utf8;
binmode(STDIN, ':encoding(utf8)');
binmode(STDOUT, ':encoding(utf8)');
binmode(STDERR, ':encoding(utf8)');&lt;/pre&gt; 完整的檔案如下： 
&lt;pre class="brush: perl; title: ; notranslate" title=""&gt;#! /usr/bin/perl -w
use Carp;
use File::Basename;
use LWP::Simple;
use WWW::Mechanize;
use LWP::UserAgent;
use WWW::Shorten '0rz';
use Getopt::Std;
use DBI;
use utf8;
binmode(STDIN, ':encoding(utf8)');
binmode(STDOUT, ':encoding(utf8)');
binmode(STDERR, ':encoding(utf8)');
if($_ =~ m/\s*&lt;div\s*class="title"&gt;&lt;a\s*href=".+"&gt;(.+)&lt;\/a&gt;&lt;\/div&gt;\s*/)
{
 $pic_desc = $1;
 print "desc: " . $1 . " \n" if $verbose;
} &lt;/pre&gt;</description></item><item><title>[PHP] Gallery 3.0 Beta 1 使用 Kohana MVC Framework</title><link>https://blog.wu-boy.com/2009/06/php-gallery-30-beta-1-%E4%BD%BF%E7%94%A8-kohana-mvc-framework/</link><pubDate>Fri, 26 Jun 2009 02:35:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/06/php-gallery-30-beta-1-%E4%BD%BF%E7%94%A8-kohana-mvc-framework/</guid><description>&lt;p&gt;&lt;img src="https://i0.wp.com/blog.wu-boy.com/wp-content/uploads/2009/06/logo.png?resize=329%2C131" alt="Gallery" title="Gallery" class="alignleft size-full wp-image-1487" srcset="https://i0.wp.com/blog.wu-boy.com/wp-content/uploads/2009/06/logo.png?w=329&amp;ssl=1 329w, https://i0.wp.com/blog.wu-boy.com/wp-content/uploads/2009/06/logo.png?resize=300%2C119&amp;ssl=1 300w" sizes="(max-width: 329px) 85vw, 329px" data-recalc-dims="1" /&gt; &lt;a href="http://gallery.menalto.com/"&gt;Gallery&lt;/a&gt; 3.0 Beta 1 出來了，在 &lt;a href="http://blog.roga.tw/2009/06/10/2222"&gt;roga’s blog&lt;/a&gt;，看到這篇訊息，gallery 3 捨去 php smaty template engine，而改用 &lt;a href="http://www.kohanaphp.com/"&gt;Kohana MVC Framework&lt;/a&gt; 這套 base on &lt;a href="http://codeigniter.com"&gt;CodeIgniter&lt;/a&gt; 的 Framework，在 &lt;a href="http://codex.gallery2.org/Gallery3:FAQ#Why_did_you_choose_Kohana.3F"&gt;Gallery3:FAQ&lt;/a&gt; 裡面有提到為什麼會使用 Kohana 這套 MVC，gallery 團隊找尋了許多 MVC 的架構來幫助開發整個相簿系統，包含了 &lt;a href="http://cakephp.org/"&gt;CakePHP&lt;/a&gt;、&lt;a href="http://framework.zend.com/"&gt;Zend Framework&lt;/a&gt;、&lt;a href="http://www.xisc.com/"&gt;Prado&lt;/a&gt;、&lt;a href="http://www.symfony-project.org/"&gt;Symfony&lt;/a&gt;、&lt;a href="http://codeigniter.com/"&gt;CodeIgniter&lt;/a&gt;，最後經過許多人的討論，選用了 Kohana 這套 MVC，原本打算考慮 CI 的，雖然 CI 支援 PHP4 跟 PHP5，以及它非常的小，對於效能方面也非常的好，但是並不支援 PHP5 的 exception，畢且有些少數的 Structure 只有支援 PHP4，所以就不被他們採納了，再來 Zend Framework 因為包含了 1705 個檔案，相當龐大，效能比 CI 少了 200-300%，雖然 ZF 文件相當豐富，不過沒有良好的 example 範例，所以導致 gallery 團隊遇到很多挫折，XDD。 最後選擇了 Kohana，雖然 Kohana 效能輸給 CI，不過這之間的差異極小，Kohana 也有 support PHP5 的 exception，Kohana 文件比 CI 還要少了些，不過對 gallery 團隊已經相當足夠了。底下有一篇各大 Framework 的效能比較：&lt;a href="http://www.avnetlabs.com/php/php-framework-comparison-benchmarks"&gt;PHP framework comparison benchmarks&lt;/a&gt;，還有另一篇：&lt;a href="http://www.beyondcoding.com/2008/03/25/kohana-vs-codeigniter-speed-and-memory-usage-performance-benchmark/"&gt;Kohana vs CodeIgniter: Speed and Memory Usage Performance Benchmark&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[PHP] FreeBSD Sphinx 繁體中文全文檢索 on PHP</title><link>https://blog.wu-boy.com/2009/06/php-freebsd-sphinx-%E7%B9%81%E9%AB%94%E4%B8%AD%E6%96%87%E5%85%A8%E6%96%87%E6%AA%A2%E7%B4%A2-on-php/</link><pubDate>Sat, 20 Jun 2009 05:10:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/06/php-freebsd-sphinx-%E7%B9%81%E9%AB%94%E4%B8%AD%E6%96%87%E5%85%A8%E6%96%87%E6%AA%A2%E7%B4%A2-on-php/</guid><description>&lt;p&gt;&lt;a href="http://sphinxsearch.com/"&gt;&lt;img class="alignleft size-full wp-image-1467" title="sphinx" src="https://i0.wp.com/blog.wu-boy.com/wp-content/uploads/2009/06/sphinx.jpg?resize=200%2C51" alt="sphinx" data-recalc-dims="1" /&gt;&lt;/a&gt; 最近想說幫之前替代役單位來把全文檢索的中文部份搞定，所以找了一些全文檢索的 open source，挑了這套網路上評價還不錯的 &lt;a href="http://sphinxsearch.com/"&gt;Sphinx&lt;/a&gt;，目前 Sphinx 支援的作業系統如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linux 2.4.x, 2.6.x (various distributions)&lt;/li&gt;
&lt;li&gt;Windows 2000, XP&lt;/li&gt;
&lt;li&gt;FreeBSD 4.x, 5.x, 6.x&lt;/li&gt;
&lt;li&gt;NetBSD 1.6, 3.0&lt;/li&gt;
&lt;li&gt;Solaris 9, 11&lt;/li&gt;
&lt;li&gt;Mac OS X 雖然上面寫 FreeBSD 只支援到 6.X，但是我測試是在 FreeBSD 7.1-RELEASE-p6 的環境，所以相當 ok 的，底下是我安裝在 FreeBSD 的心得筆記，PHP 官網上面有支援&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://tw.php.net/manual/en/refs.search.php"&gt;Search Engine Extensions&lt;/a&gt; 的介紹，包含了 &lt;a href="http://tw.php.net/manual/en/book.mnogosearch.php"&gt;mnoGoSearch&lt;/a&gt;、&lt;a href="http://tw.php.net/manual/en/book.sphinx.php"&gt;Sphinx&lt;/a&gt; — Sphinx Client、&lt;a href="http://tw.php.net/manual/en/book.swish.php"&gt;Swish&lt;/a&gt; — Swish Indexing，可以利用 pecl 來安裝 Sphinx，目前版本：0.9.9-rc1。&lt;/p&gt;</description></item><item><title>[MySQL] 利用 perl 單行印出 my.cnf</title><link>https://blog.wu-boy.com/2009/06/mysql-%E5%88%A9%E7%94%A8-perl-%E5%96%AE%E8%A1%8C%E5%8D%B0%E5%87%BA-mycnf/</link><pubDate>Wed, 17 Jun 2009 13:36:21 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/06/mysql-%E5%88%A9%E7%94%A8-perl-%E5%96%AE%E8%A1%8C%E5%8D%B0%E5%87%BA-mycnf/</guid><description>&lt;p&gt;在 &lt;a href="http://www.mysqlperformanceblog.com/"&gt;MySQL Performance Blog&lt;/a&gt; 裡面發現這篇：&lt;a href="http://www.mysqlperformanceblog.com/2009/06/15/how-to-pretty-print-mycnf-with-a-one-liner/"&gt;How to pretty-print my.cnf with a one-liner&lt;/a&gt;，利用一行 perl 指令把 my.cnf 的註解拿掉：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;perl -ne 'm/^([^#][^\s=]+)\s*(=.*|)/ &amp;&amp; printf("%-35s%s\n", $1, $2)' /etc/my.cnf&lt;/pre&gt; 輸出為： 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-locking
key_buffer = 256M
max_allowed_packet = 1M
table_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 16M
thread_concurrency = 8
log-slow-queries = /var/log/mysql/mysql-slow.log&lt;/pre&gt; 當然同樣的，你也可以利用在 php.ini 或者是其他設定檔上面，提供我平常用 bash 指令來做的，只是沒有經過排版： 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;cat /usr/local/etc/php.ini | grep -v '^$' | grep -v '^[;]'&lt;/pre&gt; 上面同樣的把空白行，以及開頭為 ; 的註解拿掉，同樣是可以做到。</description></item><item><title>[jQuery] 驗證表單實作筆記 API/1.3/Selectors</title><link>https://blog.wu-boy.com/2009/06/jquery-%E9%A9%97%E8%AD%89%E8%A1%A8%E5%96%AE%E5%AF%A6%E4%BD%9C%E7%AD%86%E8%A8%98-api13selectors/</link><pubDate>Tue, 16 Jun 2009 11:51:24 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/06/jquery-%E9%A9%97%E8%AD%89%E8%A1%A8%E5%96%AE%E5%AF%A6%E4%BD%9C%E7%AD%86%E8%A8%98-api13selectors/</guid><description>&lt;p&gt;驗證 form 表單屬於前端的工作，非常重要，避免使用者填錯格式，當然在 jQuery Plugin 可以找到專門驗證表單的外掛：&lt;a href="http://bassistance.de/jquery-plugins/jquery-plugin-validation/"&gt;jQuery plugin: Validation&lt;/a&gt;，此外掛不能相容於 IE 6，會沒辦法呈現效果，google 到一篇解決方法：&lt;a href="http://groups.google.com/group/jquery-en/browse_thread/thread/843bc94ffef99250"&gt;Validating not happening in IE6 &amp;amp; no error removal on keyup&lt;/a&gt;，這篇裡面提到，必須使用 un-packed and un-minified 的版本，也就是沒有壓縮過的 javascript 檔案，不過我自己沒有試過就是了，底下針對表單的 checkbox select input radio 欄位做檢查的筆記，可以讓大家參考看看。 在 jQuery 1.3 裡面正式拿掉 [@attr] 的寫法，所以以前寫 &lt;span style="color: #ff6600;"&gt;$(&amp;ldquo;input:radio[@name=reg_sex]&amp;rdquo;)&lt;/span&gt; 都要改成 &lt;span style="color: #008000;"&gt;$(&amp;ldquo;input:radio[name=reg_sex]&amp;rdquo;)&lt;/span&gt;，這樣才是正確的，可以參考 &lt;a href="http://docs.jquery.com/Selectors"&gt;jQuery Selector&lt;/a&gt; 這篇的 Attribute Filters 部份，先來一篇網路上實做提示說明在 text 來未：&lt;a href="http://www.electrictoolbox.com/jquery-toggle-between-password-text-field/"&gt;jQuery: show plain text in a password field and then make it a regular password field on focus&lt;/a&gt; 作法很簡單：建立兩個輸入 password 的 text input 欄位：&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate" title=""&gt;&lt;/pre&gt;</description></item><item><title>[宣傳] 安妮朵拉創作歌曲：人生最大的意義</title><link>https://blog.wu-boy.com/2009/06/%E5%AE%A3%E5%82%B3-%E5%AE%89%E5%A6%AE%E6%9C%B5%E6%8B%89%E5%89%B5%E4%BD%9C%E6%AD%8C%E6%9B%B2%EF%BC%9A%E4%BA%BA%E7%94%9F%E6%9C%80%E5%A4%A7%E7%9A%84%E6%84%8F%E7%BE%A9/</link><pubDate>Sun, 14 Jun 2009 02:12:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/06/%E5%AE%A3%E5%82%B3-%E5%AE%89%E5%A6%AE%E6%9C%B5%E6%8B%89%E5%89%B5%E4%BD%9C%E6%AD%8C%E6%9B%B2%EF%BC%9A%E4%BA%BA%E7%94%9F%E6%9C%80%E5%A4%A7%E7%9A%84%E6%84%8F%E7%BE%A9/</guid><description>&lt;p&gt;在 ptt 看到創作曲，還蠻好聽的，替他們宣傳一下，聲音不輸給台灣的明星阿 安妮朵拉 人生最大的意義 地下絲絨live 官方網站：&lt;a href="http://tw.streetvoice.com/music/user-song.asp?au=60700"&gt;人生最大的意義&lt;/a&gt;&lt;/p&gt;
&lt;embed src="http://tw.streetvoice.com/music/embedMusic.swf?srv=tw.streetvoice.com&amp;ph=music&amp;getv=musicconf.asp&amp;skinID=0&amp;au=60700&amp;listtype=1&amp;listsd=388492&amp;autoStart=false&amp;autoPlay=false" allowFullScreen="false" allowScriptAccess="always" scale="noscale" type="application/x-shockwave-flash" width="330" height="100"&gt;
&lt;/embed&gt;
&lt;p&gt;&lt;a target="_blank" href="http://tw.streetvoice.com/article/user-article.asp?dn=248858"&gt; &lt;img border="0" src="https://i0.wp.com/tw.streetvoice.com/zyfile/diarylib/388492/PLIB_388492_9D66F42656E949AE90D70D97D88FD964.gif?w=260" alt="安妮朵拉" hight="80" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[網站] 好站連結 (三)</title><link>https://blog.wu-boy.com/2009/06/%E7%B6%B2%E7%AB%99-%E5%A5%BD%E7%AB%99%E9%80%A3%E7%B5%90-%E4%B8%89/</link><pubDate>Thu, 11 Jun 2009 03:01:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/06/%E7%B6%B2%E7%AB%99-%E5%A5%BD%E7%AB%99%E9%80%A3%E7%B5%90-%E4%B8%89/</guid><description/></item><item><title>[CodeIgniter] 使用者註冊 auth code 亂數認證碼圖片</title><link>https://blog.wu-boy.com/2009/06/codeigniter-%E4%BD%BF%E7%94%A8%E8%80%85%E8%A8%BB%E5%86%8A-auth-code-%E8%AA%8D%E8%AD%89%E7%A2%BC/</link><pubDate>Tue, 09 Jun 2009 14:38:39 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/06/codeigniter-%E4%BD%BF%E7%94%A8%E8%80%85%E8%A8%BB%E5%86%8A-auth-code-%E8%AA%8D%E8%AD%89%E7%A2%BC/</guid><description>&lt;p&gt;我想這已經是網站最基本的技術，防止機器人大量註冊，或者是灌爆留言板，之前寫了兩篇製作認證碼的教學：&lt;a href="http://blog.wu-boy.com/2009/01/05/701/"&gt;[PHP]製作類似 google 網頁認證碼&lt;/a&gt;，&lt;a href="http://blog.wu-boy.com/2008/10/28/572/"&gt;[PHP] 好用的留言板 驗證碼 功能&lt;/a&gt;，這篇是要寫如何實做把&lt;a href="http://blog.wu-boy.com/2009/01/05/701/"&gt;第一篇教學&lt;/a&gt;整合到 &lt;a href="http://www.codeigniter.com.tw/"&gt;CodeIgniter&lt;/a&gt; 系統裡面，來筆記一下，以後用到就相當方便了，CodeIgniter 在 path 路徑上面有小 bug，查了國外討論區發現了這篇 &lt;a href="http://codeigniter.com/forums/viewthread/63915/"&gt;Path to CSS doesn’t work a second time&lt;/a&gt;，不過這並沒有解決我的問題，主機的網址是 &lt;span style="color: #0000ff;"&gt;&lt;a href="http://xxxxx.xxx/path/"&gt;http://xxxxx.xxx/path/&lt;/a&gt;&lt;/span&gt;，所有的 CI 檔案都是放在 path 目錄底下，包含圖片是 &lt;span style="color: #0000ff;"&gt;&lt;a href="http://xxxxx.xxx/path/images/"&gt;http://xxxxx.xxx/path/images/&lt;/a&gt;&lt;/span&gt;，在 View 裡面基本上只要寫 &lt;span style="color: #008000;"&gt;&lt;img src='https://blog.wu-boy.com/images/xx.gif'&gt;&lt;/span&gt; 這樣就可以顯示圖片了，但是要改成 &lt;span style="color: #008000;"&gt;&lt;img src='https://blog.wu-boy.com/path/images/xx.gif'&gt;&lt;/span&gt; 才能，但是我的 index.php 是放在 /path/ 裡面，以絕對路徑跟相對路徑來想，都是不太合理的，所以後來用 &lt;span style="color: #ff0000;"&gt;&lt;img src="&lt;?=base_url();?&gt;public/images/find.png" alt="" /&gt;&lt;/span&gt; 來解決，不過這是暫時的問題，我比較龜毛，喜歡寫短一點的 code。 如何裝上類似 google 的認證碼呢，首先打開 index.php 檔案&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;/* 算出 index.php 根目錄 */
define('Document_root',dirname(__FILE__));
&lt;/pre&gt;</description></item><item><title>[Gmail] 最近發布的功能：進階搜尋，預覽收件夾，郵件內容語言轉換</title><link>https://blog.wu-boy.com/2009/06/gmail-%E6%9C%80%E8%BF%91%E7%99%BC%E5%B8%83%E7%9A%84%E5%8A%9F%E8%83%BD%EF%BC%9A%E9%80%B2%E9%9A%8E%E6%90%9C%E5%B0%8B%EF%BC%8C%E9%A0%90%E8%A6%BD%E6%94%B6%E4%BB%B6%E5%A4%BE%EF%BC%8C%E9%83%B5%E4%BB%B6/</link><pubDate>Sat, 06 Jun 2009 03:08:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/06/gmail-%E6%9C%80%E8%BF%91%E7%99%BC%E5%B8%83%E7%9A%84%E5%8A%9F%E8%83%BD%EF%BC%9A%E9%80%B2%E9%9A%8E%E6%90%9C%E5%B0%8B%EF%BC%8C%E9%A0%90%E8%A6%BD%E6%94%B6%E4%BB%B6%E5%A4%BE%EF%BC%8C%E9%83%B5%E4%BB%B6/</guid><description>&lt;p&gt;最近在 &lt;a href="http://gmailblog.blogspot.com/"&gt;Gmail Lab&lt;/a&gt; 看到發布了許多新功能，都蠻好用的，加速搜尋郵件內容，收件者，寄件者，郵件內容語言轉換，匯入其他郵件的通訊名單…等，進階搜尋是這之前就開發好得功能，可以在 &lt;a href="http://mail.google.com/support/bin/answer.py?hl=en&amp;amp;answer=7190"&gt;search operators&lt;/a&gt; 這篇裡面找到相關的用法，簡單來說底下有個例子：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;&lt;em&gt;to:me is:starred&lt;/em&gt;&amp;rdquo; 搜尋寄信給您所標記的郵件&lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;em&gt;is:chat from:heather&lt;/em&gt;&amp;rdquo; 搜尋與heather使用者對話的內容&lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;em&gt;is:starred -in:inbox&lt;/em&gt;&amp;rdquo; 搜尋所有信件夾內未標記郵件&lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;em&gt;from:elliot filename:pdf&lt;/em&gt;&amp;rdquo; 搜尋 &lt;em&gt;elliot&lt;/em&gt; 寄來信件附件檔帶有 pdf 檔案 上面例子看了很複雜吧，因為你還要記的很多相關的語法，才可以正確搜尋到，所以 google 很貼心的設計了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://gmailblog.blogspot.com/2009/04/new-in-labs-gmail-search-made-easier.html"&gt;Search Autocomplete&lt;/a&gt;，之前我有寫一篇：&lt;a title="Permanent Link to New in Labs:Gmail search autocomplete 快速找尋使用者 email 跟附件檔案" rel="bookmark" href="../2009/04/05/1129/"&gt;New in Labs:Gmail search autocomplete 快速找尋使用者 email 跟附件檔案&lt;/a&gt;，造福了使用 Gmail 的大眾。 預覽收件夾這功能可以參考：&lt;a href="http://gmailblog.blogspot.com/2009/05/new-in-labs-inbox-preview.html"&gt;New in Labs: Inbox preview&lt;/a&gt;，這功能用在當開啟 gmail 網頁時，會有 loading 的畫面，那針對速度慢得使用者，可以預先看到新的郵件標題，而不需要整個載入之後才看的到，目前還沒有遇到這種狀況，不過大家可以試試看。 郵件內容語言轉換(&lt;a href="http://gmailblog.blogspot.com/2009/05/new-in-labs-automatic-message.html"&gt;New in Labs: Automatic message translation&lt;/a&gt;)，這功能相當不錯，可以利用 google translate tool 進行轉換您所想要的語言，如下圖： &lt;a href="https://www.flickr.com/photos/appleboy/3599768514/" title="Gmail (by appleboy46)"&gt;&lt;img title="Gmail (by appleboy46)" src="https://i1.wp.com/farm3.static.flickr.com/2478/3599768514_7771513234_o.png?w=600&amp;#038;ssl=1" alt="Gmail (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 蠻多好玩的功能，都可以去 Gmail Lab 去開起來喔，大家試試看吧&lt;/p&gt;</description></item><item><title>[高雄美食] 拉斐爾廚房焗烤飯</title><link>https://blog.wu-boy.com/2009/06/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F-%E6%8B%89%E6%96%90%E7%88%BE%E5%BB%9A%E6%88%BF%E7%84%97%E7%83%A4%E9%A3%AF/</link><pubDate>Tue, 02 Jun 2009 02:04:01 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/06/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F-%E6%8B%89%E6%96%90%E7%88%BE%E5%BB%9A%E6%88%BF%E7%84%97%E7%83%A4%E9%A3%AF/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/3586947717/" title="0524185739 (by appleboy46)"&gt;&lt;img src="https://i2.wp.com/farm4.static.flickr.com/3629/3586947717_2dbbf9a093.jpg?resize=500%2C375&amp;#038;ssl=1" title="0524185739 (by appleboy46)" alt="0524185739 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 好久沒來寫篇美食了，最近吃了一家還不錯的焗烤飯，那就是在高雄市文化中心附近的拉斐爾，這間價位真的算可以投資的喔，還蠻便宜的，焗烤飯價位都介於 100~150 元之間，義大利麵也都在100元以下，加上 39 元就可以享用套餐系列喔，有烤麵包，飲料，濃湯。大家可以來這裡吃看看，除了一樓之外還有地下室可以用餐，地下室還蠻適合開同學會的，上面那張圖就是地下室的照片。 &lt;a href="https://www.flickr.com/photos/appleboy/3586952533/" title="0524190141 (by appleboy46)"&gt;&lt;img src="https://i2.wp.com/farm4.static.flickr.com/3364/3586952533_007c6c735c.jpg?resize=375%2C500&amp;#038;ssl=1" title="0524190141 (by appleboy46)" alt="0524190141 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[CodeIgniter] Text 補助函數 character_limiter 不適用於中文字</title><link>https://blog.wu-boy.com/2009/05/codeigniter-text-%E8%A3%9C%E5%8A%A9%E5%87%BD%E6%95%B8-character_limiter-%E4%B8%8D%E9%81%A9%E7%94%A8%E6%96%BC%E4%B8%AD%E6%96%87%E5%AD%97/</link><pubDate>Fri, 29 May 2009 07:43:11 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/05/codeigniter-text-%E8%A3%9C%E5%8A%A9%E5%87%BD%E6%95%B8-character_limiter-%E4%B8%8D%E9%81%A9%E7%94%A8%E6%96%BC%E4%B8%AD%E6%96%87%E5%AD%97/</guid><description>&lt;p&gt;在 &lt;a href="http://www.codeigniter.com.tw/"&gt;CodeIgniter&lt;/a&gt; 裡面的 &lt;a href="http://www.codeigniter.com.tw/user_guide/helpers/text_helper.html"&gt;Text 補助函數&lt;/a&gt;，目前只適用於英文字體，不支援 utf-8 或者是簡體字體，bite 數超過2的都會出問題，當然是因為這是國外的 mvc 所以也沒有考慮到這麼週到就是了，也不是沒有辦法解決，之前就用了PHP官方網站所提供的一個函式來正確切割中文字串，就是要利用 &lt;a href="http://tw.php.net/ord"&gt;ord&lt;/a&gt; 判斷 ASCII 編碼範圍，或者是可以使用 &lt;a href="http://tw.php.net/mb_substr"&gt;mb_substr&lt;/a&gt; 函式正確切割，之前寫一篇可以參考看看：&lt;a href="http://blog.wu-boy.com/2007/05/18/104/"&gt;[PHP] 如何切割中文標題&lt;/a&gt;。 底下是原本 CodeIgniter 所提供的 Text 函數&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;if ( ! function_exists('character_limiter'))
{
	function character_limiter($str, $n = 500, $end_char = '&amp;#8230;')
	{
		if (strlen($str) &lt; $n)
		{
			return $str;
		}
		
		$str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));
 
		if (strlen($str) &lt;= $n)
		{
			return $str;
		}
 
		$out = "";
		foreach (explode(' ', trim($str)) as $val)
		{
			$out .= $val.' ';
			
			if (strlen($out) &gt;= $n)
			{
				$out = trim($out);
				return (strlen($out) == strlen($str)) ? $out : $out.$end_char;
			}		
		}
	}
}&lt;/pre&gt;</description></item><item><title>[網站] 好站連結 (二)</title><link>https://blog.wu-boy.com/2009/05/%E7%B6%B2%E7%AB%99-%E5%A5%BD%E7%AB%99%E9%80%A3%E7%B5%90-%E4%BA%8C/</link><pubDate>Thu, 28 May 2009 05:29:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/05/%E7%B6%B2%E7%AB%99-%E5%A5%BD%E7%AB%99%E9%80%A3%E7%B5%90-%E4%BA%8C/</guid><description/></item><item><title>[FreeBSD] 小技巧：防止 user 查詢觀看其他 user Processes</title><link>https://blog.wu-boy.com/2009/05/freebsd-%E5%B0%8F%E6%8A%80%E5%B7%A7%EF%BC%9A%E9%98%B2%E6%AD%A2-user-%E6%9F%A5%E8%A9%A2%E8%A7%80%E7%9C%8B%E5%85%B6%E4%BB%96-user-processes/</link><pubDate>Tue, 26 May 2009 07:48:49 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/05/freebsd-%E5%B0%8F%E6%8A%80%E5%B7%A7%EF%BC%9A%E9%98%B2%E6%AD%A2-user-%E6%9F%A5%E8%A9%A2%E8%A7%80%E7%9C%8B%E5%85%B6%E4%BB%96-user-processes/</guid><description>&lt;p&gt;看了這篇：&lt;a href="http://www.cyberciti.biz/faq/freebsd-disable-ps-sockstat-command-information-leakage/"&gt;FreeBSD Prevent Users From Seeing Information About Processes Owned by Other Users&lt;/a&gt;，裡面寫到如何防止其他使用者登入 ssh 觀看到其他使用者的一些動作，平常一般使用者可以利用 ps aux 指令關看到所有 Processes 的狀況，包含了系統所有使用者，這篇就是介紹如何關閉使用者查看其他不屬於自己的 Processes，作法有兩種，底下分別介紹，效果是一樣的： 1. 寫入 /etc/sysctl.conf&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;echo 'security.bsd.see_other_uids=0' &gt;&gt; /etc/sysctl.conf
echo 'security.bsd.see_other_gids=0' &gt;&gt; /etc/sysctl.conf&lt;/pre&gt; 2. 直接在 command line 執行 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;sysctl security.bsd.see_other_uids=0
sysctl security.bsd.see_other_gids=0&lt;/pre&gt; 兩種效果是一樣的，當然可以查詢目前的系統狀況 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;sysctl -a | grep security&lt;/pre&gt;</description></item><item><title>[CodeIgniter] 多國語言網站製作，重複 load 相同 language?</title><link>https://blog.wu-boy.com/2009/05/codeigniter-%E5%A4%9A%E5%9C%8B%E8%AA%9E%E8%A8%80%E7%B6%B2%E7%AB%99%E8%A3%BD%E4%BD%9C%EF%BC%8C%E9%87%8D%E8%A4%87-load-%E7%9B%B8%E5%90%8C-language/</link><pubDate>Sat, 23 May 2009 13:43:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/05/codeigniter-%E5%A4%9A%E5%9C%8B%E8%AA%9E%E8%A8%80%E7%B6%B2%E7%AB%99%E8%A3%BD%E4%BD%9C%EF%BC%8C%E9%87%8D%E8%A4%87-load-%E7%9B%B8%E5%90%8C-language/</guid><description>&lt;p&gt;目前正在研究網站的多國語系寫法，研究了 &lt;a href="http://www.codeigniter.com.tw"&gt;CodeIgniter&lt;/a&gt; 的 Language class 用法，可以看線上中文文件：&lt;a href="http://www.codeigniter.com.tw/user_guide/libraries/language.html"&gt;Language 類別&lt;/a&gt;，目前遇到一個疑問，在單一 PHP 檔案讀取，不可以同時讀取相同的 Language file 檔案，這樣是完全沒有作用的，以底下的例子來說，我在 &lt;span style="color: #008000;"&gt;application/language&lt;/span&gt; 目錄底下放了三個語系資料夾，English、zh-TW、zh-CN 這三個資料夾，裡面分別放路 &lt;span style="color: #ff0000;"&gt;vbs_lang.php&lt;/span&gt; 檔案，為了要區別各國的語系檔案，要分別開資料夾放入，在 CI 文件裡面都寫的很清楚，架構如下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;application/language/English&lt;/li&gt;
&lt;li&gt;application/language/zh-TW&lt;/li&gt;
&lt;li&gt;application/language/zh-CN&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[VPS] 虛擬主機 Linode 720 使用心得 (一)</title><link>https://blog.wu-boy.com/2009/05/vps-%E8%99%9B%E6%93%AC%E4%B8%BB%E6%A9%9F-linode-720-%E4%BD%BF%E7%94%A8%E5%BF%83%E5%BE%97-%E4%B8%80/</link><pubDate>Thu, 21 May 2009 05:56:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/05/vps-%E8%99%9B%E6%93%AC%E4%B8%BB%E6%A9%9F-linode-720-%E4%BD%BF%E7%94%A8%E5%BF%83%E5%BE%97-%E4%B8%80/</guid><description>&lt;div style="margin:0 auto; text-align:center"&gt;
 &lt;img src="https://i1.wp.com/www.linode.com/images/linode_logo_gray.png?w=840" alt="Linode VPS" data-recalc-dims="1" /&gt;
&lt;/div&gt; 最近正在玩 
&lt;p&gt;&lt;a href="http://www.linode.com/"&gt;Linode 720 VPS&lt;/a&gt; 這個方案，整體服務感覺非常的不錯，正在測試速度跟效能，可以選擇四個地方的機房，可以參考此 &lt;a href="http://www.linode.com/avail.cfm"&gt;連結&lt;/a&gt;，剛開通給我的是 Fremont, CA 機房，其實在哪個機房都是要自己去測試看看，ping 主機，或者是開 ftp 下載，http上傳下載，都要交換測試速度阿，在 Fremont, CA 那邊目前可以放 6 個 Linode 720s 服務，測試 web 的速度感覺還蠻不錯的，Linode 抓取學宿網路速度可以到達 400K/s 以上，抓取美國職棒官網 MLB TV 可以到 4MB/s 以上，學網抓 Linode 可以到 1MB/s，有圖證明： &lt;a href="https://www.flickr.com/photos/appleboy/3550079119/" title="linode_wget_in (by appleboy46)"&gt;&lt;img src="https://i0.wp.com/farm4.static.flickr.com/3325/3550079119_31ebd2247f.jpg?resize=500%2C140&amp;#038;ssl=1" title="linode_wget_in (by appleboy46)" alt="linode_wget_in (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; Linode 抓取美國檔案 &lt;a href="https://www.flickr.com/photos/appleboy/3550829452/" title="linode_01 (by appleboy46)"&gt;&lt;img src="https://i0.wp.com/farm4.static.flickr.com/3335/3550829452_5c4a9ae1d0.jpg?resize=500%2C123&amp;#038;ssl=1" title="linode_01 (by appleboy46)" alt="linode_01 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; Linode 抓取學網檔案 &lt;a href="https://www.flickr.com/photos/appleboy/3550023357/" title="linode_02 (by appleboy46)"&gt;&lt;img src="https://i0.wp.com/farm4.static.flickr.com/3613/3550023357_681a4826d9.jpg?resize=500%2C55&amp;#038;ssl=1" title="linode_02 (by appleboy46)" alt="linode_02 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 學網抓 Linode 檔案&lt;/p&gt;</description></item><item><title>[PHP] CodeIgniter 繁體中文翻譯計畫</title><link>https://blog.wu-boy.com/2009/05/php-codeigniter-%E7%B9%81%E9%AB%94%E4%B8%AD%E6%96%87%E7%BF%BB%E8%AD%AF%E8%A8%88%E7%95%AB/</link><pubDate>Sun, 17 May 2009 04:14:05 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/05/php-codeigniter-%E7%B9%81%E9%AB%94%E4%B8%AD%E6%96%87%E7%BF%BB%E8%AD%AF%E8%A8%88%E7%95%AB/</guid><description>&lt;p&gt;&lt;img src="https://i0.wp.com/www.codeigniter.com.tw/images/design/ci_logo2.gif?w=840" alt="CideIgniter 官方中文網站" data-recalc-dims="1" /&gt; 本人目前正在推廣 &lt;a href="http://www.codeigniter.com.tw/"&gt;CodeIgniter 官方中文網站&lt;/a&gt;，這套 MVC 在我使用起來還蠻適合新手學習的，也非常容易上手的一套 MVC Web development 架構 ，希望推廣給台灣繁體 php web 開發人員，即使您之前沒有用過 MVC 架構，只要懂的一點 PHP 語法，基本 function 會使用，基本上就可以直接來使用 CodeIgniter，在這裡徵求對 php 或者 CodeIgniter 翻譯繁體中文有興趣的網友或者是使用者們，可以加入繁體中文的翻譯計畫，我在 &lt;a href="https://github.com/" target="_blank"&gt;github &lt;/a&gt;開了CodeIgniter translation 的 repository，網址是： &lt;a href="http://github.com/appleboy/PHP-CodeIgniter-Framework-Taiwan/tree/master"&gt;http://github.com/appleboy/PHP-CodeIgniter-Framework-Taiwan/tree/master&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[jQuery] 日曆時間外掛 timepicker CSS/Offset 問題 | Plugins</title><link>https://blog.wu-boy.com/2009/05/jquery-%E6%97%A5%E6%9B%86%E6%99%82%E9%96%93%E5%A4%96%E6%8E%9B-timepicker-cssoffset-%E5%95%8F%E9%A1%8C-plugins/</link><pubDate>Tue, 12 May 2009 06:07:42 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/05/jquery-%E6%97%A5%E6%9B%86%E6%99%82%E9%96%93%E5%A4%96%E6%8E%9B-timepicker-cssoffset-%E5%95%8F%E9%A1%8C-plugins/</guid><description>&lt;p&gt;最近把之前弄的 &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; 日期外掛拿出來看看，筆記過兩篇：&lt;a href="http://blog.wu-boy.com/2008/05/13/251/" target="_blank"&gt;[jQuery筆記] 時間日期外掛：timepicker | jQuery Plugins&lt;/a&gt; 跟 &lt;a href="http://blog.wu-boy.com/2008/04/30/194/" target="_blank"&gt;[jQuery筆記] 好用的日期函式 datepicker&lt;/a&gt;，目前在寫活動的開始時間跟結束時間會用到這兩個外掛，網路上有找到整合日期跟時間的程式，不過效果都不是我很喜歡，因為在時間方面想要設定可以分隔5分鐘，或者是10分鐘間隔，有沒有網友可以提供更好的 jQuery 外掛，可以將日曆跟時間整合在一起，用單一 input 欄位就可以控制，也可以設定間隔時間，目前是搭配這兩個外掛同時使用，也可以達到同樣效果。 timepicker &lt;a href="http://labs.perifer.se/timedatepicker/"&gt;作者網站&lt;/a&gt;，愈到了一個問題，只要網頁裡面有用到 &lt;a href="http://docs.jquery.com/Show"&gt;jQuery Show&lt;/a&gt; 跟 &lt;a href="http://docs.jquery.com/Hide"&gt;hide&lt;/a&gt; 都會讓 timepicker 程式判斷 &lt;a href="http://docs.jquery.com/CSS/offset"&gt;CSS/offset&lt;/a&gt; 發生錯誤，導致功能無法顯示在正確的地方，會跑到網頁其他位置，解決方法就是當滑鼠 click input 欄位時，再去呼叫取得目前 offset 的位置。&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;var elmOffset = $(elm).offset();
$tpDiv.appendTo('body').css({'top':elmOffset.top + 'px', 'left':elmOffset.left+ 'px'}).hide();&lt;/pre&gt; 這樣就可以正確顯示在 input 下方，連這個都可以遇到地雷 XD</description></item><item><title>[PHP] Class: RSS Generator 產生器</title><link>https://blog.wu-boy.com/2009/05/php-class-rss-generator-%E7%94%A2%E7%94%9F%E5%99%A8/</link><pubDate>Fri, 08 May 2009 03:48:42 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/05/php-class-rss-generator-%E7%94%A2%E7%94%9F%E5%99%A8/</guid><description>&lt;p&gt;最近在寫新聞系統，需要 &lt;a href="http://zh.wikipedia.org/wiki/RSS" target="_blank"&gt;RSS&lt;/a&gt; 線上訂閱的功能，所以在 &lt;a href="http://www.phpclasses.org" target="_blank"&gt;PHP Classes&lt;/a&gt; 找到了 &lt;a href="http://www.phpclasses.org/browse/package/2569.html" target="_blank"&gt;RSS Generator&lt;/a&gt; 產生器，這產生器使用起來也相當方便，在測試的時候剛好遇到一個問題，就是要對內容做 escape 的動作，避免 RSS 爛掉，看到 gslin 大的發表一篇 &lt;a title="Permanent Link to &amp;quot;WordPress 的 exporter&amp;quot;" rel="bookmark" href="http://blog.gslin.org/archives/2009/04/24/2002/"&gt;WordPress 的 exporter&lt;/a&gt; 裡面寫到 WordPress 的產生 xml 格式沒有經過 escape 造成程式亂掉『&lt;a onclick="javascript:pageTracker._trackPageview('/outbound/article/core.trac.wordpress.org');" href="https://core.trac.wordpress.org/ticket/9524"&gt;Exporter does not escape url&lt;/a&gt;』，當然解決方法也很容易，那就是用 &lt;a href="http://tw2.php.net/htmlspecialchars" target="_blank"&gt;htmlspecialchars&lt;/a&gt;，避免 url 裡面帶有 &amp;amp; 符號。 解決方法很容易，如下就可以了&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;&lt;?php
$item-&gt;link = htmlentities($url, ENT_QUOTES);
?&gt;&lt;/pre&gt;</description></item><item><title>利用 IE7 CSS 2.0 tbody 解決 IE6 hover 問題</title><link>https://blog.wu-boy.com/2009/05/%E5%88%A9%E7%94%A8-css-tbody-%E8%A7%A3%E6%B1%BA-ie-hover-%E5%95%8F%E9%A1%8C/</link><pubDate>Thu, 07 May 2009 03:43:42 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/05/%E5%88%A9%E7%94%A8-css-tbody-%E8%A7%A3%E6%B1%BA-ie-hover-%E5%95%8F%E9%A1%8C/</guid><description>&lt;p&gt;&lt;strong&gt;update 2009.05.07: IE7 之後開始支援 CSS 2.0，因此可以開始使用 hover&lt;/strong&gt; 之前發表一篇用 &lt;a href="http://blog.wu-boy.com/2009/04/03/1131/" target="_blank"&gt;jQuery 解決 IE 不支援 :hover css&lt;/a&gt;，今天在看 &lt;a href="http://handlino.com/" target="_blank"&gt;和多&lt;/a&gt; 寫的網站 &lt;a href="http://registrano.com"&gt;Registrano&lt;/a&gt; html 原始碼，發現利用 CSS 也可以辦到啦，底下就是 Registrano css 原始碼： html 部份：&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate" title=""&gt;&lt;table class="auto"&gt;
 &lt;tr&gt;
 &lt;td&gt;
 test1
 &lt;/td&gt;
 
 
 &lt;td&gt;
 test2
 &lt;/td&gt;
 
 &lt;/tr&gt;
 
&lt;/table&gt;&lt;/pre&gt;</description></item><item><title>[網站] 好站連結(一)</title><link>https://blog.wu-boy.com/2009/05/%E7%B6%B2%E7%AB%99-%E5%A5%BD%E7%AB%99%E9%80%A3%E7%B5%90%E4%B8%80/</link><pubDate>Wed, 06 May 2009 03:47:58 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/05/%E7%B6%B2%E7%AB%99-%E5%A5%BD%E7%AB%99%E9%80%A3%E7%B5%90%E4%B8%80/</guid><description/></item><item><title>YASnippet is a template system for emacs</title><link>https://blog.wu-boy.com/2009/05/yasnippet-is-a-template-system-for-emacs/</link><pubDate>Wed, 06 May 2009 03:07:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/05/yasnippet-is-a-template-system-for-emacs/</guid><description>&lt;p&gt;在 irc 頻道上面看到 &lt;a href="http://gugod.org"&gt;gugod&lt;/a&gt; 貼了 &lt;a href="http://code.google.com/p/yasnippet/"&gt;YASnippet&lt;/a&gt; 介紹短片，&lt;a href="http://gugod.org"&gt;gugod&lt;/a&gt; 也寫了一篇 &lt;a href="http://gugod.org/2009/05/writing-moose-code-with-yasnippet.html"&gt;Writing Moose code with yasnippet&lt;/a&gt;，YASnippet 是一個針對 emacs 開發者的模組工具，它大量減少寫程式的時間，且自動幫忙補其該有的程式，大家可以在 Linux 底下試試看這一套 template system，我們直接來看影片，就很清楚了。 目前支援程式語言：C, C++, C#, Perl, Python, Ruby, SQL, LaTeX, HTML, CSS and more.&lt;/p&gt;</description></item><item><title>[Python] OSSF::自由軟體鑄造場 Python network programming -進階</title><link>https://blog.wu-boy.com/2009/05/python-ossf%E8%87%AA%E7%94%B1%E8%BB%9F%E9%AB%94%E9%91%84%E9%80%A0%E5%A0%B4-python-network-programming-%E9%80%B2%E9%9A%8E/</link><pubDate>Mon, 04 May 2009 13:58:49 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/05/python-ossf%E8%87%AA%E7%94%B1%E8%BB%9F%E9%AB%94%E9%91%84%E9%80%A0%E5%A0%B4-python-network-programming-%E9%80%B2%E9%9A%8E/</guid><description>&lt;p&gt;今天跑來聽 &lt;a href="http://www.openfoundry.org/"&gt;OSSF::自由軟體鑄造場&lt;/a&gt; 舉辦的 &lt;a href="http://whoswho.openfoundry.org/workshop/details/22.html"&gt;Python network programming -進階&lt;/a&gt; 課程，紀錄上課的心得，以及講師提到的一堆重點整理，分享給大家，收穫實在是太多了，本身在南部能聽到的課程就很少，一看到有開課程，就非常開心報名參加，講師對於上課準備的講義也很用心，學習到平常看書學不到的經驗跟實作。 &lt;strong&gt;1. 字串處理函式&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: python; title: ; notranslate" title=""&gt;# 字串轉換小寫
string.lower
# 字串轉換大寫
string.upper
# 切割字串
string.split
# 合併字串
string.join
# 找尋字串
string.find&lt;/pre&gt;</description></item><item><title>[CodeIgniter] Web Framework 非官方繁體中文討論區成立</title><link>https://blog.wu-boy.com/2009/04/codeigniter-web-framework-%E9%9D%9E%E5%AE%98%E6%96%B9%E7%B9%81%E9%AB%94%E4%B8%AD%E6%96%87%E8%A8%8E%E8%AB%96%E5%8D%80%E6%88%90%E7%AB%8B/</link><pubDate>Thu, 30 Apr 2009 01:41:46 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/04/codeigniter-web-framework-%E9%9D%9E%E5%AE%98%E6%96%B9%E7%B9%81%E9%AB%94%E4%B8%AD%E6%96%87%E8%A8%8E%E8%AB%96%E5%8D%80%E6%88%90%E7%AB%8B/</guid><description>&lt;p&gt;&lt;a href="http://www.codeigniter.org.tw/" target="_blank"&gt;&lt;img src="https://i1.wp.com/www.codeigniter.org.tw/images/design/ci_logo2.gif?w=840" alt="" data-recalc-dims="1" /&gt;&lt;/a&gt; &lt;a href="http://www.codeigniter.org.tw/" target="_blank"&gt;CodeIgniter&lt;/a&gt; 是我最近正在研究的一套 Web &lt;a href="http://en.wikipedia.org/wiki/Model_View_Controller"&gt;MVC&lt;/a&gt; Framework，為什麼會選擇這一套來推廣呢，目前在網路上大家所推的 MVC Framework，無非是 &lt;a href="http://en.wikipedia.org/wiki/Zend_Framework" title="Zend Framework"&gt;Zend Framework&lt;/a&gt;、&lt;a href="http://en.wikipedia.org/wiki/CakePHP" title="CakePHP"&gt;CakePHP&lt;/a&gt;、&lt;a href="http://en.wikipedia.org/wiki/Kohana_%28web_framework%29" title="Kohana (web framework)"&gt;Kohana&lt;/a&gt;、&lt;a href="http://en.wikipedia.org/w/index.php?title=Yii_PHP_Framework&amp;amp;action=edit&amp;amp;redlink=1" title="Yii PHP Framework (page does not exist)"&gt;Yii PHP Framework&lt;/a&gt;{.new}…等，這些都算是國內常用的 MVC 架構，那效能方面可以參考：&lt;a href="http://avnetlabs.com/php/php-framework-comparison-benchmarks" target="_blank"&gt;PHP framework comparison benchmarks&lt;/a&gt;，這篇寫到利用 &lt;a href="http://www.hpl.hp.com/research/linux/httperf/"&gt;httperf&lt;/a&gt; 測試 Web Performance，跑了很多效能方面的數據出來，這些數據也看看就好，大家還是都會選擇自己上手的 Framework 來使用，那今天我就是來推廣 &lt;a href="http://www.codeigniter.org.tw/" target="_blank"&gt;CodeIgniter&lt;/a&gt; 這套 Web Framwork。&lt;/p&gt;</description></item><item><title>[Django] Web Framework- Django -初階學習心得</title><link>https://blog.wu-boy.com/2009/04/django-web-framework-django-%E5%88%9D%E9%9A%8E%E5%AD%B8%E7%BF%92%E5%BF%83%E5%BE%97/</link><pubDate>Mon, 27 Apr 2009 02:50:00 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/04/django-web-framework-django-%E5%88%9D%E9%9A%8E%E5%AD%B8%E7%BF%92%E5%BF%83%E5%BE%97/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/3475465970/" title="django-logo-negative_1236046419 (by appleboy46)"&gt;&lt;img title="django-logo-negative_1236046419 (by appleboy46)" src="https://i1.wp.com/farm4.static.flickr.com/3595/3475465970_7044242629.jpg?resize=198%2C90&amp;#038;ssl=1" alt="django-logo-negative_1236046419 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 首先感謝 &lt;a href="http://phorum.study-area.org/index.php"&gt;酷學園團隊&lt;/a&gt;、&lt;a href="http://whoswho.openfoundry.org"&gt;Who&amp;rsquo;s Who 工作坊&lt;/a&gt;、&lt;a href="http://www.openfoundry.org" target="_blank"&gt;自由軟體鑄造場&lt;/a&gt; 舉辦的一系列南部的 &lt;a href="http://www.python.org/"&gt;python&lt;/a&gt;、&lt;a href="http://www.djangoproject.com/" target="_blank"&gt;Django&lt;/a&gt; 活動，今天的活動主題是：&lt;a href="http://whoswho.openfoundry.org/workshop/details/21.html"&gt;Web Framework- Django -初階 (講者：陳建玎)&lt;/a&gt;，簡介了為什麼需要 MVC 架構寫法，MVC 的重要性，以及 Django 的優點，還蠻豐富的課程，其實重點都是在如何使用 MVC 加速開發 Web 網站，以及在 Team Work 裡的重要性，目前在開發 Web Framework 都是利用 PHP 一套 Frame Work：&lt;a href="http://codeigniter.com/"&gt;Codeigniter&lt;/a&gt;，在台灣已經有中文網站：&lt;a href="http://www.codeigniter.com.tw/"&gt;CodeIgniter 繁體中文&lt;/a&gt;，自己接手了 CodeIgniter 計畫翻譯中文文件，還有開發 &lt;a href="http://www.codeigniter.com.tw/forums"&gt;forum 中文討論區&lt;/a&gt;，還在規劃中，自己也才摸 CodeIgniter 一個多禮拜，底下有一張上課的投影片，介紹三種 Frame Work 的 Model、Views、Controller &lt;a href="https://www.flickr.com/photos/appleboy/3474957475/" title="django (by appleboy46)"&gt;&lt;img title="django (by appleboy46)" src="https://i0.wp.com/farm4.static.flickr.com/3343/3474957475_2a379b69ff.jpg?resize=500%2C371&amp;#038;ssl=1" alt="django (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[jQuery] Events/live Click</title><link>https://blog.wu-boy.com/2009/04/jquery-eventslive-click/</link><pubDate>Wed, 22 Apr 2009 13:35:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/04/jquery-eventslive-click/</guid><description>&lt;p&gt;今天在利用 &lt;a href="http://jquery.com/" target="_blank"&gt;jQuery&lt;/a&gt; 來動態新增表格 &lt;tr&gt;&lt;td&gt; 看到 ptt &lt;a href="http://tony1223.no-ip.org:81/test/testTableGird.html" target="_blank"&gt;Tony 的網站教學&lt;/a&gt;，可以用 parent 的方式，一層一層往上尋找到 tr 標籤，然後再整個 remove 掉，覺得相當好用，不過內容是直接網頁動態載入 delete button，現在我想弄的是新增一個 button，Click 之後，會新增一組 tr 選單，裡面包含 delete button，但是這個 button 利用底下的 jQuery 寫法，會沒辦法作用。&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;$(":input[value=delete]").click(
function(e){
$(this).parent().parent().remove();
}
);&lt;/pre&gt; 原來看 Tony 是直接網頁載入 button，而我的狀況是後來人工點選產生的 button 跟 tr 標籤，所以問了一下 Tony，發現了一個解決方法，那就是利用 
&lt;p&gt;&lt;a href="http://docs.jquery.com/Events/live"&gt;Events/live&lt;/a&gt;，這是新增在 1.3 版本的，他可以 bind 在現有的標籤，或者是未來新增的標籤上面，可以榜定的事件如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;click, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, keydown, keypress, keyup 沒有支援底下的事件：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;blur, focus, mouseenter, mouseleave, change, submit&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[PHP] Web Framework : CodeIgniter MySQL Database 使用教學</title><link>https://blog.wu-boy.com/2009/04/php-web-framework-codeigniter-mysql-database-%E4%BD%BF%E7%94%A8%E6%95%99%E5%AD%B8/</link><pubDate>Mon, 20 Apr 2009 06:26:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/04/php-web-framework-codeigniter-mysql-database-%E4%BD%BF%E7%94%A8%E6%95%99%E5%AD%B8/</guid><description>&lt;p&gt;繼上一篇 &lt;a href="http://blog.wu-boy.com/2009/04/17/1173/"&gt;[PHP] 好用 Web Framework : CodeIgniter 安裝教學&lt;/a&gt; 之後，這次來紀錄一下 &lt;a href="http://codeigniter.com/user_guide/database/index.html"&gt;Database Class&lt;/a&gt; 的用法，我想官方網站都已經寫的很詳細了，就大概快速講一下我的一些用法跟心得，其實最主要講的是內建的 &lt;a href="http://codeigniter.com/user_guide/database/active_record.html"&gt;Active Record Class&lt;/a&gt;，它可以快速撰寫 SQL 語法，不必打 where 或者是 From 這些字眼，insert update select 都可以利用 &lt;a href="http://codeigniter.com/user_guide/database/active_record.html"&gt;Active Record Class&lt;/a&gt; 很簡單的撰寫出來喔，它也幫忙簡單的檢查 escape SQL Injection，舉的簡單例子大概就知道了： 假設底下這個簡單的 join 一個表格的 select 語法&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;$query = $this-&gt;db-&gt;query("SELECT a.news_id, a.news_name, a.add_time FROM project_news a
 left join project_news_categories b on a.categories_id = b.categories_id
where news_id = '".$id."' order by news_top DESC, a.add_time DESC
");&lt;/pre&gt; 利用 
&lt;p&gt;&lt;a href="http://codeigniter.com/user_guide/database/active_record.html"&gt;Active Record Class&lt;/a&gt; 可以改寫成：&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;$this-&gt;db-&gt;select('a.news_id, a.news_name, a.add_time');
$this-&gt;db-&gt;from('project_news a');
$this-&gt;db-&gt;join('project_news_categories b', 'a.categories_id = b.categories_id', 'left'); 
$this-&gt;db-&gt;order_by("news_top DESC, a.add_time DESC");
$this-&gt;db-&gt;where('news_id', $id); &lt;/pre&gt;</description></item><item><title>[PHP] 好用 Web Framework : CodeIgniter 安裝教學</title><link>https://blog.wu-boy.com/2009/04/php-%E5%A5%BD%E7%94%A8-web-framework-codeigniter-%E5%AE%89%E8%A3%9D%E6%95%99%E5%AD%B8/</link><pubDate>Fri, 17 Apr 2009 14:53:20 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/04/php-%E5%A5%BD%E7%94%A8-web-framework-codeigniter-%E5%AE%89%E8%A3%9D%E6%95%99%E5%AD%B8/</guid><description>&lt;p&gt;最近都在 survey 一堆 PHP Web Framework，自己想學一套可以馬上上手的，其實因為目前在 PHP 的開發上面講求速度，以及程式的可維護性，雖然我自己有一套自己的開發方法，包含包好的 SQL Class 以及上傳模組，不過還是覺得熟悉一套 MVC 架構的寫法，將來維護或者是團隊合作方面會比較好分工，在小專案上面還可以自己來，但是大型專案就必須靠 MVC Framework 了，畢竟一個人寫程式，永遠比不上團隊合作，紀錄一下最近找到的一些網路比較多人用的 FrameWork：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.symfony-project.org/" target="_blank"&gt;Symfony&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cakephp.org/" target="_blank"&gt;CakePHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://codeigniter.com/" target="_blank"&gt;CodeIgniter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://framework.zend.com/" target="_blank"&gt;Zend Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.kohanaphp.com/" target="_blank"&gt;Kohana&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[高雄] Python 入門 – Python tutorial</title><link>https://blog.wu-boy.com/2009/04/%E9%AB%98%E9%9B%84-python-%E5%85%A5%E9%96%80-python-tutorial/</link><pubDate>Tue, 14 Apr 2009 14:46:39 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/04/%E9%AB%98%E9%9B%84-python-%E5%85%A5%E9%96%80-python-tutorial/</guid><description>&lt;p&gt;在現今 &lt;a href="http://www.google.com"&gt;Google&lt;/a&gt; 的大多數服務都是利用 &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; 程式撰寫，例如：&lt;a href="http://code.google.com/intl/zh-TW/appengine/"&gt;Google App Engine&lt;/a&gt;，之前買下的 Youtube 影音網站，就是因為 Youtube 是用 Python 的程式撰寫起來的一個 Web 2.0 網站，在上禮拜去參加了 &lt;a href="http://whoswho.openfoundry.org/"&gt;工作坊&lt;/a&gt; 所開的一門入門的課程 &lt;a href="http://whoswho.openfoundry.org/workshop/details/18.html"&gt;Python 入門 - Python tutorial - 第一梯 (講者：黃宇新)&lt;/a&gt;，這課程是給要學習 Python 的基本入門，講師 黃宇新 教的真的很棒，把 Python 的精神都講的非常好，自己感覺跟 Perl 的功能差沒多少，可是兩種語言在比較方面各有優缺點，聽完最大的感想歸納為兩點，那就是 &lt;span style="color: #ff0000;"&gt;Python 產生線上文件相當方&lt;/span&gt;便，還有非常的&lt;span style="color: #ff0000;"&gt;快速模組化&lt;/span&gt;，每個 Python 程式都是一個獨立模組，在其他 Python 程式裡面都以利用 import 方式來交互使用，個人認為在 系統管理、網路管理、網路傳輸程式、網頁程式開發 上面會有相當大的幫助。 Python 還有一個優點就是程式可閱讀性，在每個程式都必須有良好的撰寫習慣，那就是要善用 tab 鍵來排版，不然程式就是會錯誤，底下一個 Python 的例子，九九乘法表：&lt;/p&gt;
&lt;pre class="brush: python; title: ; notranslate" title=""&gt;#!/usr/local/bin/python
for i in range(1,10):
 for j in range(1,10):
 print "%d*%d=%s" % (i,j,i*j),
 print ""&lt;/pre&gt;</description></item><item><title>[高雄美食]四維路巴洲排骨飯</title><link>https://blog.wu-boy.com/2009/04/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F%E5%9B%9B%E7%B6%AD%E8%B7%AF%E5%B7%B4%E6%B4%B2%E6%8E%92%E9%AA%A8%E9%A3%AF/</link><pubDate>Fri, 10 Apr 2009 13:09:51 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/04/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F%E5%9B%9B%E7%B6%AD%E8%B7%AF%E5%B7%B4%E6%B4%B2%E6%8E%92%E9%AA%A8%E9%A3%AF/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/3403403936/" title="CIMG0183"&gt;&lt;img src='https://i2.wp.com/farm4.static.flickr.com/3540/3403403936_d5262117e0.jpg?w=840&amp;#038;ssl=1' hspace='0' vspace='0' border='0' alt='CIMG0183' data-recalc-dims="1" /&gt;&lt;/a&gt; 說起這一間巴洲排骨飯，算是我已經吃了有10年之久了吧，從一間不起眼的店面，現在生意可好的很，服務態度真的不錯，不過價位方面真的有點偏貴，又漲價5元的關係吧，原本雞腿飯是80元，現在是85元了，不過老闆做的飯，跟炒起來的菜真的沒話說，好吃，米飯方面也許有加上一點油香，所以吃起來很入口，真的很好吃，也推薦給大家吃看看，地址是在光華路跟四維路的交叉口喔，大家可以去那邊嘗試看看，東西都是現場現做。&lt;/p&gt;</description></item><item><title>New in Labs:Gmail search autocomplete 快速找尋使用者 email 跟附件檔案</title><link>https://blog.wu-boy.com/2009/04/new-in-labsgmail-search-autocomplete-%E5%BF%AB%E9%80%9F%E6%89%BE%E5%B0%8B%E4%BD%BF%E7%94%A8%E8%80%85-email-%E8%B7%9F%E9%99%84%E4%BB%B6%E6%AA%94%E6%A1%88/</link><pubDate>Sun, 05 Apr 2009 02:24:13 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/04/new-in-labsgmail-search-autocomplete-%E5%BF%AB%E9%80%9F%E6%89%BE%E5%B0%8B%E4%BD%BF%E7%94%A8%E8%80%85-email-%E8%B7%9F%E9%99%84%E4%BB%B6%E6%AA%94%E6%A1%88/</guid><description>&lt;p&gt;&lt;a href="http://mail.google.com/"&gt;Gmail&lt;/a&gt; 又推出一個 Lab 功能了，這個功能我想是大家所期待許久的，可以直接對於搜尋使用者跟附件有相當大的幫助，可以針對附件，郵件裡面的 vedio，圖片副檔名 .jpg、.png、.doc 下去做搜尋的動作，很方便的，也可以針對郵件的 email 或者是姓名搜尋，提供了 autocomplete 的作用，您只需要打入兩個關鍵字，就會出現相關的使用者姓名或者是 email 喔，方便的，可以參考：&lt;a href="http://gmailblog.blogspot.com/2009/04/new-in-labs-gmail-search-made-easier.html"&gt;New in Labs: Gmail search made easier (and lazier)&lt;/a&gt;。 使用方法只要去 Settings -&amp;gt; Labs 把功能打開即可 &lt;a href="https://www.flickr.com/photos/appleboy/3412750067/" title="Google_01 (by appleboy46)"&gt;&lt;img src="https://i0.wp.com/farm4.static.flickr.com/3563/3412750067_b42eebd56b.jpg?resize=500%2C81&amp;#038;ssl=1" title="Google_01 (by appleboy46)" alt="Google_01 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[jQuery] 解決 IE6 不支援 :hover CSS</title><link>https://blog.wu-boy.com/2009/04/jquery-%E8%A7%A3%E6%B1%BA-ie-%E4%B8%8D%E6%94%AF%E6%8F%B4-hover-css/</link><pubDate>Fri, 03 Apr 2009 06:14:22 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/04/jquery-%E8%A7%A3%E6%B1%BA-ie-%E4%B8%8D%E6%94%AF%E6%8F%B4-hover-css/</guid><description>&lt;p&gt;目前 IE 並不支援 :hover 的功能，難怪只有 &lt;a href="http://www.moztw.org/"&gt;FireFox&lt;/a&gt; 可以看的懂 :hover CSS 的功能，上網查了一下解決方法，當然就是利用幫忙處理瀏覽器相容性的 javascript Framework：利用 &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; 就可以解決 IE 這部份的不相容，參考了 &lt;a href="http://blog.twkang.net"&gt;Whatup 的 Blog&lt;/a&gt;：&lt;a href="http://blog.twkang.net/2008/11/08/tr-hover-%E5%9C%A8-ie-%E4%B8%8A%E7%9A%84-hack/"&gt;tr hover 在 IE 上的 hack&lt;/a&gt;，解法也寫的很清楚。 先看看 html&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate" title=""&gt;&lt;table border="0"&gt;
 
 
 
 &lt;tr class="row1"&gt;
 &lt;td&gt;
 test1
 &lt;/td&gt;
 
 
 &lt;td&gt;
 test2
 &lt;/td&gt;
 
 &lt;/tr&gt;
 
&lt;/table&gt;
&lt;/pre&gt; css 寫法： 
&lt;pre class="brush: css; title: ; notranslate" title=""&gt;tr.row1	{ background-color: #EFEFEF; }
tr.row1:hover td{
background-color: #D1D7DC;
}&lt;/pre&gt;</description></item><item><title>利用 freebsd-update 升級 FreeBSD security patch 安全性</title><link>https://blog.wu-boy.com/2009/04/%E5%88%A9%E7%94%A8-freebsd-update-%E5%8D%87%E7%B4%9A-freebsd-security-patch-%E5%AE%89%E5%85%A8%E6%80%A7/</link><pubDate>Thu, 02 Apr 2009 03:13:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/04/%E5%88%A9%E7%94%A8-freebsd-update-%E5%8D%87%E7%B4%9A-freebsd-security-patch-%E5%AE%89%E5%85%A8%E6%80%A7/</guid><description>&lt;p&gt;在玩 &lt;a href="http://www.freebsd.org"&gt;FreeBSD&lt;/a&gt; 系統一定會常常需要升級 &lt;a href="http://www.freebsd.org/security/"&gt;security&lt;/a&gt; 的 patch，之前寫過一篇手動升級 FreeBSD security patch：&lt;a href="http://blog.wu-boy.com/2008/08/26/338/"&gt;FreeBSD 的 security patch 跟 如何 upgrade&lt;/a&gt;，那篇寫的內容也很容易瞭解，那現在又有另一種升級方式，就是利用 FreeBSD 內建指令 &lt;a href="http://www.freshports.org/security/freebsd-update/"&gt;freebsd-update&lt;/a&gt;，這是可以 fetch 或者是 install 和 rollback binary 升級系統，不過這指令只能用在 &lt;span style="color: #ff0000;"&gt;Release Engineering&lt;/span&gt; 的系統上面，例如 FreeBSD 7.1-RELEASE and FreeBSD 7.1-RC1，&lt;span style="color: #ff0000;"&gt;不可以&lt;/span&gt;使用在 FreeBSD 6.2-STABLE 或者是 FreeBSD 7.0-CURRENT 版本上面，那在 &lt;a href="http://blog.gslin.org/"&gt;DK大神 blog&lt;/a&gt; 上面有寫一篇可以升級 PRERELEASE 系統：&lt;a href="http://blog.gslin.org/archives/2009/03/24/1980/"&gt;用 freebsd-update 將 FreeBSD 7.1-PRERELEASE 升級到 7.1-RELEASE&lt;/a&gt;，這方法可以騙過 freebsd-update 指令，不過我想本身要對 FreeBSD 很熟阿，不然會遇到很多地雷阿。 基本 OPTIONS 如下：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;-b basedir -- 指定系統掛載根目錄 預設值：/
 (default: /)
-d workdir -- 檔案暫存的地方
 (default: /var/db/freebsd-update/)
-f conffile -- 讀取基本設定檔
 (default: /etc/freebsd-update.conf)
-k KEY -- Trust an RSA key with SHA256 hash of KEY
-r release -- 指定 Release 版本 (e.g., 6.2-RELEASE)
-s server -- 指定抓取哪一台伺服器
 (default: update.FreeBSD.org)
-t address -- 搭配 corn 指定 email，當執行完畢，寄信通知使用者
 (default: root)&lt;/pre&gt;</description></item><item><title>MySQL count(“欄位”) vs mysql_num_rows 速度？</title><link>https://blog.wu-boy.com/2009/03/mysql-count%E6%AC%84%E4%BD%8D-vs-mysql_num_rows-%E9%80%9F%E5%BA%A6%EF%BC%9F/</link><pubDate>Mon, 30 Mar 2009 11:28:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/mysql-count%E6%AC%84%E4%BD%8D-vs-mysql_num_rows-%E9%80%9F%E5%BA%A6%EF%BC%9F/</guid><description>&lt;p&gt;在 FreeBSD ports 裡面還沒看到 chinese/phpbb3 的 ports，目前只有 &lt;a href="http://chinsan2.twbbs.org/wp/"&gt;chinsan&lt;/a&gt; 維護的 &lt;a href="http://www.freshports.org/chinese/phpbb-tw/"&gt;chinese/phpbb-tw ports&lt;/a&gt;，之前版本是 2.0.22 版本，後來我 commit 到 2.0.23 版本，不過 PHPBB 官網已經不再維護或者是開發 2.0.X 版本了，現在以 PHPBB3 為版本開發，也針對了 PHP6 跟 PHP 5 的相容性做了很大的改變，所以基本上如果在 2.0.X 版本加了很多外掛，那就沒辦法升級到 phpBB3 版本了，畢竟 code 實在改變太多了，找個時間把 chinese/phpbb3-tw commit 進去，不然也可以到 &lt;a href="http://www.freshports.org/www/phpbb3/"&gt;www/phpbb3&lt;/a&gt; 做安裝。 為什麼會提到 &lt;a href="http://www.phpbb.com/"&gt;phpBB&lt;/a&gt; 呢，今天在 trace &lt;a href="http://www.phpbb.com/"&gt;phpBB3&lt;/a&gt; 的 code，發現原本在 phpBB2 裡面有支援 &lt;a href="http://tw2.php.net/mysql-num-rows"&gt;mysql_num_rows&lt;/a&gt; function，用來讓程式可以取出 sql 的個數，不過在 &lt;a href="http://www.phpbb.com/"&gt;phpBB3&lt;/a&gt; 竟然就把這個 function 拿掉了。 phpBB2 mysql4.php 程式：&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;function sql_numrows($query_id = 0)
{
	if( !$query_id )
	{
		$query_id = $this-&gt;query_result;
	}

	return ( $query_id ) ? mysql_num_rows($query_id) : false;
}&lt;/pre&gt;</description></item><item><title>[PHP] Zend 使用 Google Calendar API – 新增、刪除事件 – END</title><link>https://blog.wu-boy.com/2009/03/php-zend-%E4%BD%BF%E7%94%A8-google-calendar-api-%E6%96%B0%E5%A2%9E%E3%80%81%E5%88%AA%E9%99%A4%E4%BA%8B%E4%BB%B6-end/</link><pubDate>Sun, 29 Mar 2009 01:00:09 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/php-zend-%E4%BD%BF%E7%94%A8-google-calendar-api-%E6%96%B0%E5%A2%9E%E3%80%81%E5%88%AA%E9%99%A4%E4%BA%8B%E4%BB%B6-end/</guid><description>&lt;p&gt;這篇算是 &lt;a href="http://code.google.com/apis/calendar/"&gt;Google Calendar API&lt;/a&gt; 的結尾文章了，只剩下新增、刪除兩個功能尚未說明，那這兩個功能野蠻簡單的，底下就來介紹如何新增單一事件功能，看看是否要增另外新檔案放 form 的表單，我是把表單放入 index.php 再把資料傳送到 news.php 此檔案，先介紹 form 表單：&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate" title=""&gt;&lt;/pre&gt;</description></item><item><title>[PHP] Zend 使用 Google Calendar API – 編輯事件</title><link>https://blog.wu-boy.com/2009/03/php-zend-%E4%BD%BF%E7%94%A8-google-calendar-api-%E7%B7%A8%E8%BC%AF%E4%BA%8B%E4%BB%B6/</link><pubDate>Sat, 28 Mar 2009 01:41:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/php-zend-%E4%BD%BF%E7%94%A8-google-calendar-api-%E7%B7%A8%E8%BC%AF%E4%BA%8B%E4%BB%B6/</guid><description>&lt;p&gt;上一篇介紹了瀏覽 Google Calendar API 範圍內所有的事件，有沒有發現在 index.php 就有瀏覽單一事件的連結，我們透過 API 可以取得單一事件的 evenID，取得的方式就是透過 &lt;a href="http://tw2.php.net/basename"&gt;basename&lt;/a&gt; 函式：&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;basename($event-&gt;id-&gt;text)&lt;/pre&gt; 我們可以利用 $_GET 方式讀取到 evenID 值，傳送到 event.php 來接收 
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;$eventId = ( isset($_POST['id']) ) ? $_POST['id'] : $_GET['id'];&lt;/pre&gt; 1. 新增 event.php 檔案，寫入開頭： 
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;&lt;?php
include('config.inc.php');
/*
* 首頁傳來的 event id 值
*/
$eventId = ( isset($_POST['id']) ) ? $_POST['id'] : $_GET['id'];

$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient($googleAccount, $googlePassword, $service);
/*
* 讀取單一事件資料
*/
$eventEntry = getEvent($client, $eventId);
/*
* 讀取單一事件地點
*/
foreach ($eventEntry-&gt;where as $where) {
 $whereValue = $where-&gt;valueString;//地點
}
?&gt;&lt;/pre&gt;</description></item><item><title>[PHP] Zend 使用 Google Calendar API – 瀏覽事件</title><link>https://blog.wu-boy.com/2009/03/php-zend-%E4%BD%BF%E7%94%A8-google-calendar-api-%E7%80%8F%E8%A6%BD%E4%BA%8B%E4%BB%B6/</link><pubDate>Fri, 27 Mar 2009 04:09:30 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/php-zend-%E4%BD%BF%E7%94%A8-google-calendar-api-%E7%80%8F%E8%A6%BD%E4%BA%8B%E4%BB%B6/</guid><description>&lt;p&gt;昨天寫了一篇 &lt;a href="http://blog.wu-boy.com/2009/03/26/1075/"&gt;[PHP] Zend 使用 Google Calendar API - 環境建立架設&lt;/a&gt;，相信應該是非常簡單才對，那今天來介紹一下實做 Google Calendar API 的瀏覽、新增、刪除、修改事件的功能，在官方網站都有詳細的 API 功能介紹，我只不過把功能整合完整一點，詳細請看 &lt;a href="http://code.google.com/apis/calendar/docs/1.0/developers_guide_php.html"&gt;Google Calendar API With PHP&lt;/a&gt;。 1. 瀏覽功能：建立 index.php&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;/*
* include 昨天新增的config.inc.php 檔案
*/
include('config.inc.php');
/*
* 提供Calendar 的服務名稱
*/
$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
/*
* 登入帳號密碼
*/
$client = Zend_Gdata_ClientLogin::getHttpClient($googleAccount, $googlePassword, $service);&lt;/pre&gt;</description></item><item><title>[PHP] Zend 使用 Google Calendar API – 環境建立架設</title><link>https://blog.wu-boy.com/2009/03/php-zend-%E4%BD%BF%E7%94%A8-google-calendar-api-%E7%92%B0%E5%A2%83%E5%BB%BA%E7%AB%8B%E6%9E%B6%E8%A8%AD/</link><pubDate>Thu, 26 Mar 2009 13:15:02 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/php-zend-%E4%BD%BF%E7%94%A8-google-calendar-api-%E7%92%B0%E5%A2%83%E5%BB%BA%E7%AB%8B%E6%9E%B6%E8%A8%AD/</guid><description>&lt;p&gt;最近又玩了 Googl 的 API：&lt;a href="http://code.google.com/apis/calendar/"&gt;Google Calendar APIs and Tools&lt;/a&gt;，這個 API 可以讓 PHP 開發者對於使用 Google Canledar 有很大的幫助，可以新增事件，刪除事件，修改事件，或者是更改事件，相信在 Google 的 API 裡面都寫的很詳細，這 API 是由 Zend 底下所開發出來的，在 Zend Framework 底下是小 API 模組，大家可以在 &lt;a href="http://framework.zend.com/download/webservices"&gt;這裡&lt;/a&gt; 下載到最新的版本 &lt;a href="http://framework.zend.com/download/webservices"&gt;Zend Gdata 1.7.7&lt;/a&gt;，大家也可以直接在 &lt;a href="http://framework.zend.com/"&gt;Zend Framework&lt;/a&gt; 底下做開發，目前支援 PHP5，如果對 Google 月曆不會用的，可以上網找一下，很多 &lt;a href="http://www.google.com.tw/search?q=google+calendar+%E6%95%99%E5%AD%B8&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rlz=1R1GGGL_en___TW320&amp;amp;client=firefox-a"&gt;教學&lt;/a&gt; 的喔，底下是要針對開發環境建立做介紹。 針對 &lt;a href="http://code.google.com/apis/calendar/docs/1.0/developers_guide_php.html"&gt;Google Calendar PHP API&lt;/a&gt; 教學大家可以先看看，今天先教大家建置環境，環境用在 &lt;a href="http://framework.zend.com"&gt;Zend Framework&lt;/a&gt; 底下的作法，那架設 Zend Framework 可以參考我上一篇文章：&lt;a href="http://blog.wu-boy.com/2009/03/24/1060/"&gt;[PHP] Zend Framework 安裝筆記教學 Appserv + Zend Framework (一)&lt;/a&gt;，如果是在 Zend Framwork 底下安裝的話，那必須把 .htaccess 裡面的導向 index.php 的功能 mark 起來，不然就跑不過去喔，不然就是另開一個資料夾，就不需要搭配 Zend Framework，那就在 (www 或者是 data)資料夾，多開一個 GClab 資料夾，把檔案解壓縮到裡面。 1. 新增 google 帳號的設定檔案 config.inc.php&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;/*
* Google 帳號密碼，以及 calendar ID
*/
$googleAccount = 'xxxxxxx@gmail.com';
$googlePassword = '';	
$calendarID = 'xxxxxxxx@gmail.com';&lt;/pre&gt;</description></item><item><title>[PHP] Zend Framework 安裝筆記教學 Appserv + Zend Framework (一)</title><link>https://blog.wu-boy.com/2009/03/php-zend-framework-%E5%AE%89%E8%A3%9D%E7%AD%86%E8%A8%98%E6%95%99%E5%AD%B8-appserv-zend-framework-%E4%B8%80/</link><pubDate>Tue, 24 Mar 2009 02:33:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/php-zend-framework-%E5%AE%89%E8%A3%9D%E7%AD%86%E8%A8%98%E6%95%99%E5%AD%B8-appserv-zend-framework-%E4%B8%80/</guid><description>&lt;p&gt;今天在公司上班需要用到 &lt;a href="http://framework.zend.com"&gt;Zend Framework&lt;/a&gt; 這一套 MVC 的軟體，用來開發 &lt;a href="http://code.google.com/intl/zh-TW/apis/calendar/"&gt;Google Calendar APIs&lt;/a&gt;，這 API 是用 Zend Framework 下去寫得，在 &lt;a href="http://code.google.com/intl/zh-TW/apis/calendar/docs/1.0/developers_guide_php.html"&gt;Google 文件&lt;/a&gt; 說的很清楚，那底下來介紹一下安裝過程吧，首先環境要先有 Apache + PHP + MySQL，我本身用 &lt;a href="http://www.appservnetwork.com/"&gt;Appserv&lt;/a&gt; 懶人套件，我是用 AppServ 2.5.10 裡面包含底下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apache 2.2.8&lt;/li&gt;
&lt;li&gt;PHP 5.2.6&lt;/li&gt;
&lt;li&gt;MySQL 5.0.51b&lt;/li&gt;
&lt;li&gt;phpMyAdmin-2.10.3 1. 先修改 apache 設定 httpd.conf&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#LoadModule rewrite_module modules/mod_rewrite.so&lt;/pre&gt; 改成 unmark 掉 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;LoadModule rewrite_module modules/mod_rewrite.so&lt;/pre&gt; 修改 include_path 在 php.ini 裡面，或者是利用 
&lt;p&gt;&lt;a href="http://tw2.php.net/set_include_path"&gt;set_include_path&lt;/a&gt; 來修改 2. 開始安裝 Zend Framework，首先去 &lt;a href="http://framework.zend.com/download/latest"&gt;官方網站下載&lt;/a&gt;，目前版本：&lt;a href="http://framework.zend.com"&gt;Zend Framework&lt;/a&gt; 1.7.7，了解 &lt;a href="http://zh.wikipedia.org/wiki/MVC"&gt;MVC&lt;/a&gt; 架構。可以參考：&lt;a href="http://www.jaceju.net/resources/webmvc/"&gt;透視 WebMVC&lt;/a&gt; 這篇。&lt;/p&gt;</description></item><item><title>[jQuery] 如何取得 select List index 和 value 值</title><link>https://blog.wu-boy.com/2009/03/jquery-%E5%A6%82%E4%BD%95%E5%8F%96%E5%BE%97-select-liset-index-%E5%92%8C-value-%E5%80%BC/</link><pubDate>Fri, 20 Mar 2009 06:44:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/jquery-%E5%A6%82%E4%BD%95%E5%8F%96%E5%BE%97-select-liset-index-%E5%92%8C-value-%E5%80%BC/</guid><description>&lt;p&gt;上次寫了 &lt;a href="http://blog.wu-boy.com/2009/03/18/1024/"&gt;[jQuery] 表單取值 radio checkbox select text 驗證表單&lt;/a&gt;，這篇淺顯易懂，在 ptt 有人問到如何把 select 的 value 跟 text 值加入到另一個 select 的 options 裡面，其實還蠻簡單的，利用 &lt;a href="http://www.texotela.co.uk/code/jquery/select/"&gt;jQuery - Select box manipulation&lt;/a&gt; 這個 plugin 就可以輕鬆做到了，底下是我的一些筆記心得：&lt;/p&gt;
&lt;h2 id="實作案例"&gt;實作案例&lt;/h2&gt;
&lt;p&gt;首先如何取得 select 的 value 跟 text&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;* 取得 select value 值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$(&lt;span style="color:#cd5555"&gt;&amp;#39;#selectList&amp;#39;&lt;/span&gt;).val();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;取得 text 值，可以利用 :selected 這個&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;* 取得 select text 值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$(&lt;span style="color:#cd5555"&gt;&amp;#39;#selectList :selected&amp;#39;&lt;/span&gt;).text();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Gmail Lab：新功能 取消寄信 Undo Send mail</title><link>https://blog.wu-boy.com/2009/03/gmail-lab%EF%BC%9A%E6%96%B0%E5%8A%9F%E8%83%BD-%E5%8F%96%E6%B6%88%E5%AF%84%E4%BF%A1-undo-send-mail/</link><pubDate>Fri, 20 Mar 2009 04:03:20 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/gmail-lab%EF%BC%9A%E6%96%B0%E5%8A%9F%E8%83%BD-%E5%8F%96%E6%B6%88%E5%AF%84%E4%BF%A1-undo-send-mail/</guid><description>&lt;p&gt;&lt;a href="http://gmailblog.blogspot.com"&gt;Gmail Lab&lt;/a&gt; 發佈新功能 &lt;a href="http://gmailblog.blogspot.com/2009/03/new-in-labs-undo-send.html"&gt;New in Labs: Undo Send&lt;/a&gt;，在 Gmail 的使用介面，不管您是要刪除文章，或者是標示文章，都可以恢復到上一個動作，這一點對於大多使用者幫助非常大，畢竟有時後會手誤，不小心刪除信件，或者是信件消失，現在又多了一個功能，就是當您寄信出去的時候，可以恢復到未寄出的狀態，這個可以避免信件寫錯，想要重新寫一遍，之前只要按送出，信件基本上就是出去了，不管關掉瀏覽器，或者是拔除網路線都是來不及的，所以 Google 工程師寫了這個 Lab 功能，這功能在您送出寄信的時候，會&lt;span style="color: #ff0000;"&gt;暫存5秒的時間&lt;/span&gt;，在這時間內您可以恢復到寫信狀態。 1. 開啟方式：Settings -&amp;gt; Labs 開啟底下功能 &lt;a href="https://www.flickr.com/photos/appleboy/3369781120/" title="Gmail_01 (by appleboy46)"&gt;&lt;img src="https://i1.wp.com/farm4.static.flickr.com/3572/3369781120_171293d9c2.jpg?resize=500%2C92&amp;#038;ssl=1" title="Gmail_01 (by appleboy46)" alt="Gmail_01 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 接下來就可以使用了 ^^&lt;/p&gt;</description></item><item><title>Gmail Lab:快速瀏覽 YouTube videos, Picasa and Flickr links in Gmail</title><link>https://blog.wu-boy.com/2009/03/google-gmail-lab-%E5%BF%AB%E9%80%9F%E5%88%86%E4%BA%AB%E7%80%8F%E8%A6%BD-youtube-videos-picasa-and-flickr-links-in-gmail/</link><pubDate>Thu, 19 Mar 2009 11:16:44 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/google-gmail-lab-%E5%BF%AB%E9%80%9F%E5%88%86%E4%BA%AB%E7%80%8F%E8%A6%BD-youtube-videos-picasa-and-flickr-links-in-gmail/</guid><description>&lt;p&gt;今天看到 &lt;a href="http://gmailblog.blogspot.com/"&gt;Gmail Lab&lt;/a&gt; 又發佈了一個新功能：&lt;a href="http://gmailblog.blogspot.com/2009/03/new-in-labs-youtube-picasa-flickr-and.html"&gt;New in Labs: YouTube, Picasa, Flickr and Yelp previews&lt;/a&gt;，這功能是利用 &lt;a href="http://mail.google.com"&gt;Gmail&lt;/a&gt; 來分享 &lt;a href="http://www.youtube.com/"&gt;Youtube&lt;/a&gt; 或者 Picasa 和 &lt;a href="https://www.flickr.com"&gt;Flickr&lt;/a&gt; 在 Gmail Box 中實現，在大家出去外面遊玩，一定會分享照片，或者是影片給自己的朋友，用 Gmail 一定是寄送 Link 給使用者，使用者點取 Link 開啟新視窗來欣賞影片或照片，現在已經不需要這麼麻煩了喔，只要在 Gmail Lab 開啟偵測語法功能，就可以不必另開視窗了，直接可以線上觀看 Flickr 照片跟 &lt;a href="http://www.youtube.com/"&gt;Youtube&lt;/a&gt; 影片喔。Gmail chat 已經有可以直接分享 Youyube 的影片功能，可以參考文章：&lt;a href="http://gmailblog.blogspot.com/2009/01/watch-videos-right-in-gmail-chat.html"&gt;YouTube previews in Gmail chat&lt;/a&gt;。 首先先把 Gmail 語系切換到英文的介面，然後選取 Settings -&amp;gt; Lab 會看到底下的功能： &lt;a href="https://www.flickr.com/photos/appleboy/3367041861/" title="Gmail (by appleboy46)"&gt;&lt;img src="https://i1.wp.com/farm4.static.flickr.com/3548/3367041861_eeebec5117.jpg?resize=500%2C344&amp;#038;ssl=1" title="Gmail (by appleboy46)" alt="Gmail (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[jQuery] 表單取值 radio checkbox select text 驗證表單</title><link>https://blog.wu-boy.com/2009/03/jquery-%E8%A1%A8%E5%96%AE%E5%8F%96%E5%80%BC-radio-checkbox-select-text/</link><pubDate>Wed, 18 Mar 2009 04:37:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/jquery-%E8%A1%A8%E5%96%AE%E5%8F%96%E5%80%BC-radio-checkbox-select-text/</guid><description>&lt;p&gt;最近在專案全面使用 &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; 來整合後台部份，目前還沒有大量用到 AJAX 的部份，等以後有時間會全部轉換 AJAX 利用 JSON 的部份，其實之前就有寫到一篇用 datatype JSON 的方式來實現 AJAX：&lt;a href="http://blog.wu-boy.com/2008/09/22/412/"&gt;[jQuery] AJAX 學習筆記 (一) 如何使用 JSON 驗證使用者表單&lt;/a&gt;，大家可以參考看看，不過今天大概寫一下昨天在實做驗證表單取值的一些心得，在設計後台的時候，我把編輯文章跟新增文章的功能做在同一塊，然後利用 jQuery 去改變傳值狀態，利用 hidden 的 mode 欄位來決定是要新增文章還是修改文章&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;$(document).ready(function() 
{
 $("#add_news_link").click(function(){
 $("#mode").attr("value", "add");
 });
})
&lt;/pre&gt;</description></item><item><title>[jQuery] Javascript plotting library 畫圖 chart</title><link>https://blog.wu-boy.com/2009/03/jquery-javascript-plotting-library-%E7%95%AB%E5%9C%96-chart/</link><pubDate>Tue, 17 Mar 2009 02:00:28 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/jquery-javascript-plotting-library-%E7%95%AB%E5%9C%96-chart/</guid><description>&lt;p&gt;沒想到 &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; 可以做到畫圖的功能，&lt;a href="http://code.google.com/p/flot/"&gt;Flot&lt;/a&gt; 是 Javascript plotting library for jQuery，目前支援瀏覽器：Internet Explorer 6/7/8，Firefox 2.x+，Safari 3.0+，Opera 9.5 和 Konqueror 4.x+，瀏覽器跑起來都還不錯快，唯獨 Internet Explorer 有另外寫一個 excanvas 模擬器，也就是在 IE 上面看還需要 include 另外一個 js 檔案，才可以顯示圖形，我在 google 找到一些也是 PHP Chart 的好用工具，都是國外開發的：&lt;a href="http://naku.dohcrew.com/libchart/pages/introduction/"&gt;Libchart - Simple PHP chart drawing library&lt;/a&gt;，&lt;a href="http://www.maani.us/xml_charts/index.php"&gt;XML/SWF Charts&lt;/a&gt;，其實還蠻多的，自己 google 就會出現一堆，不過要上去試試看。 我個人還蠻喜歡 &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; 的，所以我就推薦 Flot 這一個 jQuery 的 library，在官網上面有很多 example 的介紹，可以去看看&lt;a href="http://people.iola.dk/olau/flot/examples/"&gt;這裡&lt;/a&gt;。 畫最簡單的圖，還有支援 cos sin 的三角函數喔 $(function () { /* [橫座標,縱座標] Math.sin 支援三角函數 */ var d1 = []; for (var i = 0; i &amp;lt; 14; i += 0.5) d1.push([i, Math.cos(i)]); var d2 = [[0, 3], [4, 8], [8, 5], [9, 13]]; // a null signifies separate line segments var d3 = [[0, 12], [7, 12], null, [7, 2.5], [12, 2.5]]; $.plot($(&amp;quot;#placeholder&amp;quot;), [ d1, d2, d3 ]); });[/code] 畫出來的圖如下： &lt;a href="https://www.flickr.com/photos/appleboy/3359261523/" title="flot_01 (by appleboy46)"&gt;&lt;img src="https://i0.wp.com/farm4.static.flickr.com/3589/3359261523_4dca591215.jpg?resize=500%2C290&amp;#038;ssl=1" title="flot_01 (by appleboy46)" alt="flot_01 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[轉貼]程式設計師的格言</title><link>https://blog.wu-boy.com/2009/03/%E8%BD%89%E8%B2%BC%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88%E5%B8%AB%E7%9A%84%E6%A0%BC%E8%A8%80/</link><pubDate>Mon, 16 Mar 2009 04:48:46 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/%E8%BD%89%E8%B2%BC%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88%E5%B8%AB%E7%9A%84%E6%A0%BC%E8%A8%80/</guid><description>&lt;p&gt;轉貼自：&lt;a href="http://but.tw/2008/10/programmers_rule/"&gt;程式設計師的格言&lt;/a&gt; &lt;strong&gt;我覺得有些話真的還蠻中肯的。&lt;/strong&gt; 程式設計師的格言（盜作不少） 譯自 &lt;a href="http://www2.biglobe.ne.jp/~oni_page/other/etc/pr03.html"&gt;http://www2.biglobe.ne.jp/~oni_page/other/etc/pr03.html&lt;/a&gt; &lt;a href="http://mixi.jp/view_community.pl?id=1772737"&gt;http://mixi.jp/view_community.pl?id=1772737&lt;/a&gt; (版本4 2008/12/16更新) 譯註 SE是日本軟體公司裡程式設計師的頭子。自己不太寫程式，主要工作是跟客戶確認規格。 程式設計師多半自己不面對客戶。 在台灣隨公司不同，比較接近SA或PM。 總之就保留原樣寫SE囉。&lt;/p&gt;</description></item><item><title>[Pear] 利用 Validate 套件驗證 E-mail 多重表單認證</title><link>https://blog.wu-boy.com/2009/03/pear-%E5%88%A9%E7%94%A8-validate-%E5%A5%97%E4%BB%B6%E9%A9%97%E8%AD%89-e-mail-%E5%A4%9A%E9%87%8D%E8%A1%A8%E5%96%AE%E8%AA%8D%E8%AD%89/</link><pubDate>Sun, 15 Mar 2009 08:07:14 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/pear-%E5%88%A9%E7%94%A8-validate-%E5%A5%97%E4%BB%B6%E9%A9%97%E8%AD%89-e-mail-%E5%A4%9A%E9%87%8D%E8%A1%A8%E5%96%AE%E8%AA%8D%E8%AD%89/</guid><description>&lt;p&gt;最近都在玩 &lt;a href="http://en.wikipedia.org/wiki/Open_source"&gt;open source&lt;/a&gt; 的程式，方便加速自己開發 PHP 的專案，在申請帳號密碼部份就可以利用 &lt;a href="http://pear.php.net/package/Validate"&gt;Validate&lt;/a&gt; 套件來驗證，以及 email 填寫正確性，可以檢查 MX 或者是 A record 紀錄，還蠻方便的，也可以檢查 &lt;a href="http://pear.php.net/package/Validate/docs/0.8.2/Validate/Validate.html#methodmultiple"&gt;multiple&lt;/a&gt; 欄位，設計的相當不錯，也有金融相關套件可以驗證 &lt;a href="http://en.wikipedia.org/wiki/Credit_card"&gt;CreditCard&lt;/a&gt;，金融套件名稱是 &lt;a href="http://pear.php.net/package/Validate_Finance"&gt;Validate_Finance&lt;/a&gt; 裡面的 &lt;a href="http://pear.php.net/package/Validate_Finance_CreditCard"&gt;Validate_Finance_CreditCard&lt;/a&gt; 部份，線上也有很多相關說明，可以參考 &lt;a href="http://pear.php.net/package/Validate/docs/0.8.2/"&gt;Validate 線上手冊&lt;/a&gt;，目前已經到 0.8.2 (beta)，如果使用 Release 版本，請選用 0.8.1，軟體可以在此&lt;a href="http://pear.php.net/package/Validate/download/"&gt;下載&lt;/a&gt;，0.8.2 是在 2009-01-31 Release 出來的，還不錯用，最主要的功能如下&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Package to validate various datas. It includes : - numbers (min/max, decimal or not) - email (syntax, domain check, &lt;a href="http://www.w3.org/Protocols/rfc822/"&gt;rfc822&lt;/a&gt;) - string (predifined type alpha upper and/or lowercase, numeric,&amp;hellip;) - date (min, max, rfc822 compliant) - uri (&lt;a href="http://www.w3.org/2002/11/dbooth-names/rfc2396-numbered_clean.htm"&gt;RFC2396&lt;/a&gt;) - possibility valid multiple data with a single method call (::multiple)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;驗證各種不同的日期函式&lt;/li&gt;
&lt;li&gt;驗證數字(最小/最大,是否是10進位)&lt;/li&gt;
&lt;li&gt;email 驗證(正規語法驗證，check domain name 是否存在，&lt;a href="http://www.w3.org/Protocols/rfc822/"&gt;rfc822&lt;/a&gt; 驗證)&lt;/li&gt;
&lt;li&gt;字串驗證(正規語法驗證，是否包含數字英文字母，可輸入最長或最短)&lt;/li&gt;
&lt;li&gt;url 驗證(遵從 &lt;a href="http://www.w3.org/2002/11/dbooth-names/rfc2396-numbered_clean.htm"&gt;RFC2396&lt;/a&gt; 規定)&lt;/li&gt;
&lt;li&gt;多重欄位(multiple data)驗證(可以同時驗證上述功能)&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>[中正] CN Journal 組刊系統交接</title><link>https://blog.wu-boy.com/2009/03/%E4%B8%AD%E6%AD%A3cn-journal-%E7%B5%84%E5%88%8A%E7%B3%BB%E7%B5%B1%E4%BA%A4%E6%8E%A5/</link><pubDate>Sat, 14 Mar 2009 12:46:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/%E4%B8%AD%E6%AD%A3cn-journal-%E7%B5%84%E5%88%8A%E7%B3%BB%E7%B5%B1%E4%BA%A4%E6%8E%A5/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/3352908763/" title="12311 (by appleboy46)"&gt;&lt;img title="12311 (by appleboy46)" src="https://i2.wp.com/farm2.static.flickr.com/1386/3352908763_587a2de84e.jpg?resize=500%2C250&amp;#038;ssl=1" alt="12311 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 終於到了交接的時候了，時間也過的很快，想當初碩一進來，就被 &lt;a href="http://abay01.blogspot.com/"&gt;abay(吳建鴻)&lt;/a&gt; 抓進來當組刊的伺服器 maintainer，那當然我也不會辜負大家對我的期望啦，時間已經經過了一年半，我剛好經歷兩屆的組刊編輯團隊，想當初進來的時候，跟著一堆學弟妹開會，那時候擔任網路組伺服器的轉移，可以參考這一篇 網路組 web 服務移機 ，&lt;a href="http://journal.cn.ee.ccu.edu.tw/"&gt;CN-Journal&lt;/a&gt; 是創刊在一位學姐身上，組刊好像也沒有訪問過這個學姐，一直傳承下來這個系統，從之前的舊版組刊(純 html 介面)，到現在的用 &lt;a href="http://xoops.tnc.edu.tw/"&gt;Xoops&lt;/a&gt; 這一套 open source 系統，經歷了很多辛苦，這方面就要多感謝 abay(吳建鴻) 找了這套系統，雖然留下很多 bug，在我任內，我把 bug 排除了一些，也許目前還有 bug 存在，不過那已經不是重點了，這一套也可以順利延續下去，我也弄了一套 open source &lt;a href="http://album.cn.ee.ccu.edu.tw/index.php"&gt;網路相簿&lt;/a&gt;，來放網路組的每年活動照片，這樣以後大家還可以回味，畢竟每次活動下來，都固定只有一些人有照片，弄這套系統目的，可以讓新進學弟妹，可以看看我們學長姐的面貌，以及加速認識學長姐。&lt;/p&gt;</description></item><item><title>[Windows] Appserv 安裝 pear 套件</title><link>https://blog.wu-boy.com/2009/03/windows-appserv-%E5%AE%89%E8%A3%9D-pear-%E5%A5%97%E4%BB%B6/</link><pubDate>Sat, 14 Mar 2009 10:49:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/windows-appserv-%E5%AE%89%E8%A3%9D-pear-%E5%A5%97%E4%BB%B6/</guid><description>&lt;p&gt;最近要在 Windows 上面安裝 &lt;a href="http://www.apache.org/"&gt;Apache&lt;/a&gt; + &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt; + &lt;a href="http://www.php.net"&gt;PHP&lt;/a&gt;，我選擇利用懶人包安裝方法：&lt;a href="http://www.appservnetwork.com/"&gt;Appserv&lt;/a&gt;，目前版本為 AppServ 2.5.10 跟 AppServ 2.6.0，如果您要寫 PHP5 的話，就選擇安裝 AppServ 2.5.10，目前支援到 PHP 5.2.6，不過我上次已經看到 &lt;a href="http://blog.wu-boy.com/2009/03/01/842/"&gt;PHP 5.2.9 Released&lt;/a&gt; 了，如果想要支援 PHP6，那就選擇 AppServ 2.6.0 這個版本，不過我建議新手可以安裝 AppServ 2.5.10，這個版本比較穩定，安裝好之後，也有支援 phpMyAdmin，底下是 2.5.10 支援的套件：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;* Apache 2.2.8 * PHP 5.2.6 * MySQL 5.0.51b * phpMyAdmin-2.10.3 今天要安裝 pear 的套件在 Windows 上面，不過不用緊張，因為 Appserv 已經把 &lt;a href="http://pear.php.net"&gt;Pear&lt;/a&gt; 的模組包進來裡面了，只要執行 .bat 檔，按照視窗，就可以完成安裝了，自己平常有用 Pear 的 &lt;a href="http://blog.wu-boy.com/2009/01/03/677/"&gt;HTTP_Upload 多重檔案上傳 Multiple files upload&lt;/a&gt;，跟 &lt;a href="http://blog.wu-boy.com/2007/12/18/129/"&gt;PEAR - PHP Mail and Mail_Mime 模組&lt;/a&gt;，底下就是 Windows 的安裝方法：&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>2009 棒球經典賽：棒壇輸球頻檢討 未見實質改善</title><link>https://blog.wu-boy.com/2009/03/2009-%E6%A3%92%E7%90%83%E7%B6%93%E5%85%B8%E8%B3%BD%EF%BC%9A%E6%A3%92%E5%A3%87%E8%BC%B8%E7%90%83%E9%A0%BB%E6%AA%A2%E8%A8%8E-%E6%9C%AA%E8%A6%8B%E5%AF%A6%E8%B3%AA%E6%94%B9%E5%96%84/</link><pubDate>Fri, 13 Mar 2009 15:47:20 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/2009-%E6%A3%92%E7%90%83%E7%B6%93%E5%85%B8%E8%B3%BD%EF%BC%9A%E6%A3%92%E5%A3%87%E8%BC%B8%E7%90%83%E9%A0%BB%E6%AA%A2%E8%A8%8E-%E6%9C%AA%E8%A6%8B%E5%AF%A6%E8%B3%AA%E6%94%B9%E5%96%84/</guid><description>&lt;p&gt;看到這次的經典賽，說實在的也點傷心，以往每年都在替中華隊加油，沒有一次這麼慘的，每一次都在檢討，但是不知道政府在棒球這一塊，有沒有在用心經營，在體育方面有沒有在付出，其實在台灣發展體育好像沒有什麼效果，不像美國這麼保護球員的身體狀況，台灣好像就是可以操就好，也沒有在關心照顧球員狀況，這影片是在 &lt;a href="http://blog.ericsk.org/"&gt;ericsk&lt;/a&gt; 大大寫的一篇：&lt;a href="http://blog.ericsk.org/archives/1303"&gt;棒壇輸球頻檢討 未見實質改善&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>使用 CSS 排版製作網站</title><link>https://blog.wu-boy.com/2009/03/%E4%BD%BF%E7%94%A8-css-%E6%8E%92%E7%89%88%E8%A3%BD%E4%BD%9C%E7%B6%B2%E7%AB%99/</link><pubDate>Wed, 11 Mar 2009 12:45:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/%E4%BD%BF%E7%94%A8-css-%E6%8E%92%E7%89%88%E8%A3%BD%E4%BD%9C%E7%B6%B2%E7%AB%99/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/3346746764/" title="國立中正大學--經濟系含國際經濟研究所--第十屆全國實證經濟學論文研討會--首頁_1236772280180 (by appleboy46)"&gt;&lt;img title="國立中正大學--經濟系含國際經濟研究所--第十屆全國實證經濟學論文研討會--首頁_1236772280180 (by appleboy46)" src="https://i0.wp.com/farm4.static.flickr.com/3625/3346746764_1259500fd3.jpg?resize=395%2C500&amp;#038;ssl=1" alt="國立中正大學--經濟系含國際經濟研究所--第十屆全國實證經濟學論文研討會--首頁_1236772280180 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 今天下午都在研究網站 &lt;a href="http://zh.wikipedia.org/wiki/CSS"&gt;CSS&lt;/a&gt; 的排版跟製作，在現在 Web 2.0 的時代，很多入口網站全部都改換成 CSS 來排版，取代掉原本的 Table 表格，這算是相當重大的改變，一來對於維護網站會相當方便，二來就是省下很多頻寬資源，大型入口網站：&lt;a href="http://tw.yahoo.com"&gt;Yahoo&lt;/a&gt;、&lt;a href="http://www.pixnet.net"&gt;痞客幫&lt;/a&gt; 首頁全部都利用 CSS Div 的方式下去排版，當然一些基本的 CSS 觀念要有，這樣就很好學習了，CSS 排版觀念：&lt;a href="http://css.1keydata.com/tw/box-model.php"&gt;CSS 盒子模式&lt;/a&gt;{.nav}、&lt;span style="font-family: Verdana,Arial,Helvetica,sans-serif;"&gt;&lt;a class="nav" href="http://css.1keydata.com/tw/float.php"&gt;CSS 浮動 (Float)&lt;/a&gt;，可以參考 &lt;a href="http://css.1keydata.com/tw/"&gt;CSS 語法教學&lt;/a&gt; 這裡，這個網站寫的相當簡單，可以當作入門網站，順手就把之前幫學校做的一個網站：&lt;/span&gt;&lt;a href="http://www.ccu.edu.tw/economic/2009/index.php"&gt;國立中正大學::第十屆全國實證經濟學論文研討會&lt;/a&gt; 全部換成 CSS，也通過 &lt;a href="http://enable.nat.gov.tw/"&gt;無障礙&lt;/a&gt; A+ 程式驗證。&lt;/p&gt;</description></item><item><title>Linux or FreeBSD screen 指令介紹使用</title><link>https://blog.wu-boy.com/2009/03/linux-or-freebsd-screen-%E6%8C%87%E4%BB%A4%E4%BB%8B%E7%B4%B9%E4%BD%BF%E7%94%A8/</link><pubDate>Tue, 10 Mar 2009 09:47:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/linux-or-freebsd-screen-%E6%8C%87%E4%BB%A4%E4%BB%8B%E7%B4%B9%E4%BD%BF%E7%94%A8/</guid><description>&lt;p&gt;在管理 Linux 或者是 &lt;a href="http://www7.tw.freebsd.org/"&gt;FreeBSD&lt;/a&gt; 系統常常用到的指令：screen，一方面如果 pietty 當掉，那您執行的指令升級系統都會繼續在 background 跑，那有時候可能跑的時間很長，這時候當然就要靠 screen 來達成這個目的，當然您也可以用 nohup 的方式來做到此目的，底下就是一些 screen 我常用的一些指令，還蠻方便的 首先如何開啟新的 screen 呢，當然就直接打指令 screen 就可以了，在 FreeBSD 底下開始沒有支援 screen 指令，利用 &lt;a href="http://www.freshports.org/"&gt;FreeBSD ports&lt;/a&gt; 來安裝&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;cd /usr/ports/sysutils/screen; make install clean&lt;/pre&gt;</description></item><item><title>mydumper 取代 mysqldump 效能</title><link>https://blog.wu-boy.com/2009/03/mydumper-%E5%8F%96%E4%BB%A3-mysqldump-%E6%95%88%E8%83%BD/</link><pubDate>Mon, 09 Mar 2009 02:36:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/mydumper-%E5%8F%96%E4%BB%A3-mysqldump-%E6%95%88%E8%83%BD/</guid><description>&lt;p&gt;這是我在 &lt;a href="http://blog.gslin.org"&gt;gslin 大神&lt;/a&gt; 那邊看到的一篇文章：&lt;a href="http://blog.gslin.org/archives/2009/03/04/1956/"&gt;mydumper (取代 mysqldump 的工具)&lt;/a&gt;，&lt;a href="http://dammit.lt/2009/02/03/mydumper/"&gt;mysqldumper&lt;/a&gt; 有平行跟效能方面壓力測試，效果跟時間都壓縮的比 &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html"&gt;mysqldump&lt;/a&gt; 還要快，簡單管理 output 資料，它把 database 每個資料表分別 dump 資料出來寫到檔案，方便觀看檔案資料，不過沒有支援 dump table 的 definitions，所以加速提取 data 寫入到檔案，gslin 大神也把它包進 &lt;a href="http://www.freebsd.org"&gt;FreeBSD&lt;/a&gt; &lt;a href="http://www.freebsd.org/ports/"&gt;ports&lt;/a&gt; 裡面，在 &lt;a href="http://www.freshports.org/databases/mydumper/"&gt;database/mydumper&lt;/a&gt; 這裡。 我想會把這個機制套用到我之前寫的 shell script 裡面：&lt;a href="http://blog.wu-boy.com/2008/05/23/268/"&gt;[Linux&amp;amp;FreeBSD] 備份系統資料，MySQL 資料庫，PgSQL 資料庫的自動化 bash shell script 程式&lt;/a&gt;，那 mydumper 用法也相當簡單，mydumper &amp;ndash;help 就寫的很清楚了，跟 mysqldump 用法差沒多少：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;-h, --host 連接到 hostname 伺服器
-u, --user 使用者名稱
-p, --password 使用者密碼
-P, --port MySQL TCP/IP port 
-B, --database Database 名稱
-t, --threads Number of parallel threads
-o, --outputdir 輸出的檔案要存放在哪, 預設 ./export-*/
-c, --compress gzip 壓縮每個檔案，多花一點時間
-x, --regex Regular expression for 'db.table' matching&lt;/pre&gt;</description></item><item><title>Google App Engine SDK：python 基本教學安裝</title><link>https://blog.wu-boy.com/2009/03/google-app-engine-sdk%EF%BC%9Apython-%E5%9F%BA%E6%9C%AC%E6%95%99%E5%AD%B8%E5%AE%89%E8%A3%9D/</link><pubDate>Sat, 07 Mar 2009 04:41:30 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/google-app-engine-sdk%EF%BC%9Apython-%E5%9F%BA%E6%9C%AC%E6%95%99%E5%AD%B8%E5%AE%89%E8%A3%9D/</guid><description>&lt;p&gt;&lt;img src="https://i0.wp.com/code.google.com/appengine/images/appengine-silver-120x30.gif?resize=120%2C30" alt="Powered by Google App Engine" data-recalc-dims="1" /&gt; &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt; 利用 python 程式語言所組成，可以利用 &lt;a href="http://www.google.com.tw/"&gt;Google&lt;/a&gt; 背後的技術來開發您的 Web application，後端就交給 Google 的強大雲端運算能力，前端就可以利用 &lt;a href="http://code.google.com/appengine/downloads.html"&gt;SDK&lt;/a&gt; 來開發您的 Web 介面，後端儲存可以用 &lt;a href="http://www.google.com.tw/"&gt;Google&lt;/a&gt; &lt;a href="http://labs.google.com/papers/bigtable.html" target="_blank"&gt;Bigtable&lt;/a&gt; 及 &lt;a href="http://labs.google.com/papers/gfs.html" target="_blank"&gt;GFS&lt;/a&gt; 的儲存方式，那現在就不多說了，花了一點時間把環境建立起來，遇到一些問題，現在來筆記一下，目前我在 &lt;a href="http://www.tw.freebsd.org/"&gt;FreeBSD&lt;/a&gt; 7.1 Release 來當作 &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt; 開發平台，在安裝方面有遇到一些小問題，底下來看看： 在 FreeBSD 安裝方法還蠻簡單的，首先把 python 環境弄好&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# cd /usr/ports/lang/python25/
# make install clean&lt;/pre&gt; 底下這張圖就是安裝好的結果： 
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/3333900131/" title="GAE (by appleboy46)"&gt;&lt;img title="GAE (by appleboy46)" src="https://i2.wp.com/farm4.static.flickr.com/3556/3333900131_dd95bd7d35.jpg?resize=500%2C151&amp;#038;ssl=1" alt="GAE (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[南投]清境農場 國民賓館</title><link>https://blog.wu-boy.com/2009/03/%E5%8D%97%E6%8A%95%E6%B8%85%E5%A2%83%E8%BE%B2%E5%A0%B4-%E5%9C%8B%E6%B0%91%E8%B3%93%E9%A4%A8/</link><pubDate>Fri, 06 Mar 2009 09:57:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/%E5%8D%97%E6%8A%95%E6%B8%85%E5%A2%83%E8%BE%B2%E5%A0%B4-%E5%9C%8B%E6%B0%91%E8%B3%93%E9%A4%A8/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/3287169168/" title="CIMG0401"&gt;&lt;img src='https://i2.wp.com/farm4.static.flickr.com/3287/3287169168_86b73e4a79.jpg?w=840&amp;#038;ssl=1' hspace='0' vspace='0' border='0' alt='CIMG0401' data-recalc-dims="1" /&gt;&lt;/a&gt; 這次來介紹2月份去清境農場的住宿旅館：&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.cingjing.gov.tw"&gt;國民賓館&lt;/a&gt;，這一家真的很不錯，人也很多，剛好位於 &lt;a href="http://www.cingjing.gov.tw/mien/index.php"&gt;青青草原&lt;/a&gt; 下面沒多遠，走路上去風景很棒，在 &lt;a href="http://www.cingjing.gov.tw"&gt;小瑞士花園&lt;/a&gt; 隔壁，離清境的八大景色附近喔：**清境人文饗宴－國民賓館、博望新村、&lt;strong&gt;&lt;strong&gt;瑞士之賞－小瑞士花園&lt;/strong&gt;&lt;/strong&gt;、&lt;strong&gt;&lt;strong&gt;親親綿羊－青青草原&lt;/strong&gt;&lt;/strong&gt;、&lt;strong&gt;&lt;strong&gt;與群山邂逅－觀山牧區&lt;/strong&gt;&lt;/strong&gt;、&lt;strong&gt;&lt;strong&gt;生命的躍動－生態體驗園區&lt;/strong&gt;&lt;/strong&gt;、&lt;strong&gt;&lt;strong&gt;動靜之間－特色步道&lt;/strong&gt;&lt;/strong&gt;、&lt;strong&gt;&lt;strong&gt;四季合歡－合歡山&lt;/strong&gt;&lt;/strong&gt;、**&lt;strong&gt;環遊世界－特色民宿街&lt;/strong&gt;，可以參考&lt;a href="http://www.cingjing.gov.tw/mien/index4.php"&gt;這裡&lt;/a&gt;，我們住的地方是三人房：&lt;a href="http://www.cingjing.gov.tw/room/index.php?index_m_id=1&amp;amp;index_id=9&amp;amp;id_index=3"&gt;東巴‧時尚‧簡約和風(2+1人)&lt;/a&gt;，我覺得這裡的視野相當的棒喔，空氣很好，又可以看到整個山，底下就有一些圖片來介紹，首先就是陽台出去的景色，很不賴喔。&lt;/p&gt;</description></item><item><title>[關子嶺] 洗心館 泥漿溫泉</title><link>https://blog.wu-boy.com/2009/03/%E9%97%9C%E5%AD%90%E5%B6%BA-%E6%B4%97%E5%BF%83%E9%A4%A8-%E6%B3%A5%E6%BC%BF%E6%BA%AB%E6%B3%89/</link><pubDate>Thu, 05 Mar 2009 02:55:58 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/%E9%97%9C%E5%AD%90%E5%B6%BA-%E6%B4%97%E5%BF%83%E9%A4%A8-%E6%B3%A5%E6%BC%BF%E6%BA%AB%E6%B3%89/</guid><description>&lt;p&gt;我要來介紹關子嶺的溫泉了，在去洗溫泉前，自己 survey 很多溫泉飯店或者是民宿，不過想要去洗三小時，沒有過夜的，所以大致上打電話去問一問就好了，基本上價位大概都是3小時800元，例如 &lt;a href="http://066822888.emmm.tw" target="_blank"&gt;熱琍溫泉館&lt;/a&gt;、&lt;a href="http://066822302.mmmtravel.com.tw/" target="_blank"&gt;洗心館&lt;/a&gt;…等，不過最後還是挑 &lt;a href="http://066822302.mmmtravel.com.tw/" target="_blank"&gt;洗心館&lt;/a&gt;，原因是便宜一百元，三小時的休息只要 700 元喔，而且我們去的時候要求大的浴缸，這樣雙人才可以進去一起泡喔，老闆娘人也不錯，直接給我最大的，房號就是 202，2樓上去右轉第一間，還蠻大的喔 &lt;a href="https://www.flickr.com/photos/10526457@N00/3286840544/" title="CIMG0207"&gt;&lt;img src="https://i0.wp.com/farm4.static.flickr.com/3221/3286840544_14b767f931.jpg?w=840&amp;#038;ssl=1" border="0" alt="CIMG0207" hspace="0" vspace="0" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[WordPress] post 文章不能使用 javascript 語法</title><link>https://blog.wu-boy.com/2009/03/wordpress-post-%E6%96%87%E7%AB%A0%E4%B8%8D%E8%83%BD%E4%BD%BF%E7%94%A8-javascript-%E8%AA%9E%E6%B3%95/</link><pubDate>Tue, 03 Mar 2009 12:38:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/wordpress-post-%E6%96%87%E7%AB%A0%E4%B8%8D%E8%83%BD%E4%BD%BF%E7%94%A8-javascript-%E8%AA%9E%E6%B3%95/</guid><description>&lt;p&gt;之前寫了一篇讓 wordpress 可以支援 &lt;a href="http://code.google.com/apis/maps/"&gt;Google Map API&lt;/a&gt; 的教學：&lt;a href="http://blog.wu-boy.com/2008/10/04/532/"&gt;[AJAX] google map 的應用&lt;/a&gt;，不過我將 WordPress 升級到 WordPress 2.8-bleeding-edge 版本，發現 javascript 語言就不能使用了，因為在寫 javascript 的時候，有利用到 &lt;br /&gt; 這個 Tag，不過送出後轉出來的 javascript 語言會變成編碼過後，&amp;quot; 會變成 ” Big5 編碼，所以這個問題很困擾我，去找一下 ，Wordpress 把斷行完全用 wpautop 這個函式下去取代，所以你只要在內容寫入 &amp;lt;br / &amp;gt; 都會消失，不然就是出現怪問題。 這個問題也不是無解，在網路上找到兩個解法： 1. &lt;a href="http://www.ooso.net/inline-js"&gt;inline-js - wordpress plugin&lt;/a&gt; 您只要在 javascript 語言包一層 tag 就可以了&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;&lt;/pre&gt;</description></item><item><title>PHP 5.2.9 Released!</title><link>https://blog.wu-boy.com/2009/03/php-529-released/</link><pubDate>Sun, 01 Mar 2009 05:41:41 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/03/php-529-released/</guid><description>&lt;p&gt;&lt;a href="http://www.php.net"&gt;PHP&lt;/a&gt; 在官網時間 26-Feb-2009 發佈 &lt;a href="http://www.php.net/releases/5_2_9.php"&gt;PHP 5.2.9 Released&lt;/a&gt;，這次的 Release 主要是在改善安全性跟修正超過 50 bug list，最主要的安全性修正如下： Security Enhancements and Fixes in PHP 5.2.9:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;* Fixed security issue in imagerotate(), background colour isn’t validated correctly with a non truecolour image. Reported by Hamid Ebadi, APA Laboratory (Fixes CVE-2008-5498). (Scott) * Fixed a crash on extract in zip when files or directories entry names contain a relative path. (Pierre) * Fixed explode() behavior with empty string to respect negative limit. (Shire) * Fixed a segfault when malformed string is passed to json_decode(). (Scott) 大家可以參考這裡：&lt;a href="http://www.php.net/releases/5_2_9.php"&gt;5.2.9 Release&lt;/a&gt;，&lt;a href="http://www.php.net/ChangeLog-5.php#5.2.9"&gt;Change log&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Google]Gmail 支援選擇多重檔案上傳跟進度狀況狀態 multi-select and progress bars</title><link>https://blog.wu-boy.com/2009/02/googlegmail-%E6%94%AF%E6%8F%B4%E9%81%B8%E6%93%87%E5%A4%9A%E9%87%8D%E6%AA%94%E6%A1%88%E4%B8%8A%E5%82%B3%E8%B7%9F%E9%80%B2%E5%BA%A6%E7%8B%80%E6%B3%81%E7%8B%80%E6%85%8B-multi-select-and-progress-bars/</link><pubDate>Fri, 27 Feb 2009 03:43:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/02/googlegmail-%E6%94%AF%E6%8F%B4%E9%81%B8%E6%93%87%E5%A4%9A%E9%87%8D%E6%AA%94%E6%A1%88%E4%B8%8A%E5%82%B3%E8%B7%9F%E9%80%B2%E5%BA%A6%E7%8B%80%E6%B3%81%E7%8B%80%E6%85%8B-multi-select-and-progress-bars/</guid><description>&lt;p&gt;&lt;a href="http://mail.google.com"&gt;Gmail&lt;/a&gt; 推廣到現在，目前很多人都在使用，&lt;a href="http://gmailblog.blogspot.com"&gt;Gmail Blog&lt;/a&gt; 也開發許多模組讓大家使用，之前 &lt;a href="http://mail.google.com"&gt;Gmail&lt;/a&gt; 都不支援多重檔案選擇上傳，都必需要分別選取檔案，來達到多重上傳，而且每次上傳都不知道進度，也不確定是否上傳成功，現在 &lt;a href="http://mail.google.com"&gt;Gmail&lt;/a&gt; 改變了一些作法，來達到附件檔案上傳進度跟多重檔案選取，如果您要選取多個檔案上傳，您只要按住 Ctrl 加上檔案就可以多重選取了，相當方便，或者是按住 Shift 來達到大量選取檔案，可以參考此篇：&lt;a href="http://gmailblog.blogspot.com/2009/02/updates-to-attachments-multi-select-and.html"&gt;Updates to attachments: multi-select and progress bars&lt;/a&gt; 底下就是 Gmail 上傳附件檔案的圖示： &lt;a href="https://www.flickr.com/photos/appleboy/3313315418/" title="Gmail (by appleboy46)"&gt;&lt;img src="https://i1.wp.com/farm4.static.flickr.com/3325/3313315418_bb933a9d60.jpg?resize=500%2C144&amp;#038;ssl=1" title="Gmail (by appleboy46)" alt="Gmail (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>如何在 console 端使用 Tail (View) Multiple Files on UNIX / Linux Console</title><link>https://blog.wu-boy.com/2009/02/%E5%A6%82%E4%BD%95%E5%9C%A8-console-%E7%AB%AF%E4%BD%BF%E7%94%A8-tail-view-multiple-files-on-unix-linux-console/</link><pubDate>Tue, 24 Feb 2009 10:24:28 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/02/%E5%A6%82%E4%BD%95%E5%9C%A8-console-%E7%AB%AF%E4%BD%BF%E7%94%A8-tail-view-multiple-files-on-unix-linux-console/</guid><description>&lt;p&gt;這在管理 &lt;a href="http://en.wikipedia.org/wiki/Unix"&gt;UNIX&lt;/a&gt; base 系統方面最重要的地方，不管是維護 &lt;a href="http://zh.wikipedia.org/wiki/Linux"&gt;Linux&lt;/a&gt; or &lt;a href="http://www.freebsd.org"&gt;FreeBSD&lt;/a&gt; 主機，都要學習如何觀看 log 檔案，系統出問題，不管是 apache 不能啟動，或者是 MySQL 發生錯誤，基本上都可以觀察 /var/log 底下的檔案來達到解決問題，平常在使用 Linux 預設可以用 &lt;a href="http://en.wikipedia.org/wiki/Tail_(Unix)"&gt;tail&lt;/a&gt; 這個指令，使用方法如下：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;tail -F /var/log/message
tail -f /var/log/message
-f 如果在 message 晚上 rotate 檔案的時候，就會停止
-F 持續偵測是否有新檔案，會繼續維持下去&lt;/pre&gt;</description></item><item><title>[FreeBSD] 利用 portmaster 升級 PHP 5.26 -&gt; 5.28</title><link>https://blog.wu-boy.com/2009/02/freebsd-%E5%88%A9%E7%94%A8-portmaster-%E5%8D%87%E7%B4%9A-php-526-528/</link><pubDate>Mon, 23 Feb 2009 12:14:48 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/02/freebsd-%E5%88%A9%E7%94%A8-portmaster-%E5%8D%87%E7%B4%9A-php-526-528/</guid><description>&lt;p&gt;之前在 &lt;a href="http://blog.gslin.org"&gt;大神&lt;/a&gt; 那邊看到一篇 升級 &lt;a href="http://blog.gslin.org/archives/2008/12/10/1879/"&gt;PHP 5.2.8 的一些小細節&lt;/a&gt;，就來把我的機器升級一下，發現 php 5.2.7 之後已經把 pcre extension 納入在裡面，參考 /usr/ports/UPDATING 裡面的  20081211 這個項目，可以利用 &lt;a href="http://www.freshports.org/ports-mgmt/portupgrade/"&gt;portupgrade&lt;/a&gt; 或者是 &lt;a href="http://www.freshports.org/ports-mgmt/portmaster/"&gt;portmaster&lt;/a&gt; 來升級，之前都是利用 ruby 寫的 portupgrade 來升級系統或者是更新安全性，現在利用 portmaster 這一套也是不錯用，portmaster 是用 sh 寫出來的，在 gslin 大神這一篇：&lt;a href="http://blog.gslin.org/archives/2007/03/05/1113/"&gt;portupgrade、portmaster、portconf&lt;/a&gt; 說到速度方面比 portupgrade 還要好，這我沒有實際測試過，自己在實際用了一下，還蠻方便的。 安裝 &lt;a href="http://www.freshports.org/ports-mgmt/portmaster/"&gt;portmaster&lt;/a&gt; 跟 &lt;a href="http://www.freshports.org/ports-mgmt/portconf"&gt;portconf&lt;/a&gt; 搭配：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;cd /usr/ports/ports-mgmt/portconf
make install clean
cd /usr/ports/ports-mgmt/portmaster
make install clean&lt;/pre&gt;</description></item><item><title>[Linux] CentOS 5.2 安裝 Webmin 套件</title><link>https://blog.wu-boy.com/2009/02/linux-centos-52-%E5%AE%89%E8%A3%9D-webmin-%E5%A5%97%E4%BB%B6/</link><pubDate>Sun, 22 Feb 2009 06:55:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/02/linux-centos-52-%E5%AE%89%E8%A3%9D-webmin-%E5%A5%97%E4%BB%B6/</guid><description>&lt;p&gt;目前幫台北朋友維護一台 &lt;a href="http://www.centos.org/"&gt;CentOS&lt;/a&gt; 5.2 主機，想試試看的可以來 &lt;a href="http://isoredirect.centos.org/centos/5/isos/i386/"&gt;這裡&lt;/a&gt; 下載，在剛開始裝好的時候，預設好像沒有把 &lt;a href="http://webmin.com/"&gt;Webmin&lt;/a&gt; 給裝上去，所以就要去網路上找 rpm 來安裝，如果是要找 rpm 套件，我個人推薦 &lt;a href="http://rpm.pbone.net/"&gt;http://rpm.pbone.net/&lt;/a&gt;，裡面可以搜尋到相關您想要的套件，也可以找到很多 mirror site 網站，相當方便，首先我們可以輸入 webmin 來找尋套件，可以找到此套件：&lt;a href="http://rpm.pbone.net/index.php3/stat/4/idpl/7974770/com/webmin-1.420-1.noarch.rpm.html"&gt;webmin-1.420-1.noarch.rpm&lt;/a&gt; 這是給 Centos 安裝的。 &lt;a href="https://www.flickr.com/photos/appleboy/3299708090/" title="RPM Search webmin_1235284992618 (by appleboy46)"&gt;&lt;img title="RPM Search webmin_1235284992618 (by appleboy46)" src="https://i0.wp.com/farm4.static.flickr.com/3299/3299708090_84fa4f1240.jpg?resize=370%2C500&amp;#038;ssl=1" alt="RPM Search webmin_1235284992618 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[google] Gmail Multiple Inboxes 支援多重資料夾</title><link>https://blog.wu-boy.com/2009/02/google-gmail-multiple-inboxes-%E6%94%AF%E6%8F%B4%E5%A4%9A%E9%87%8D%E8%B3%87%E6%96%99%E5%A4%BE/</link><pubDate>Sat, 21 Feb 2009 07:25:54 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/02/google-gmail-multiple-inboxes-%E6%94%AF%E6%8F%B4%E5%A4%9A%E9%87%8D%E8%B3%87%E6%96%99%E5%A4%BE/</guid><description>&lt;p&gt;今天玩了 &lt;a href="http://gmailblog.blogspot.com/" target="_blank"&gt;Gmail Labs&lt;/a&gt; &lt;a href="https://mail.google.com/mail/"&gt;Google mail&lt;/a&gt; 的一項新功能：&lt;a href="http://gmailblog.blogspot.com/2009/02/new-in-labs-multiple-inboxes.html"&gt;new lab：Multiple Inboxes&lt;/a&gt;，這不但可以讓您支援多重收件夾，可以多5個出來喔，支援 Labels 還可以使用 forward mail 到 gmail 在分類都可以喔，可以參考這篇：&lt;a href="http://gmailblog.blogspot.com/2009/02/tip-manage-several-email-accounts-with.html"&gt;Tip: Manage several email accounts with Multiple Inboxes&lt;/a&gt;，步驟其實也相當簡單： 1. 先到 &lt;span style="color: #008000;"&gt;Settings&lt;/span&gt; 裡面選取 Labs 2. enable &lt;span style="color: #008000;"&gt;Multiple Inboxes&lt;/span&gt; 這樣就可以了 &lt;a href="https://www.flickr.com/photos/appleboy/3296250785/" title="gmail Inboxes (by appleboy46)"&gt;&lt;img title="gmail Inboxes (by appleboy46)" src="https://i2.wp.com/farm4.static.flickr.com/3404/3296250785_9ef092fd98.jpg?resize=500%2C84&amp;#038;ssl=1" alt="gmail Inboxes (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>聯絡我</title><link>https://blog.wu-boy.com/contact-subscribe/</link><pubDate>Fri, 20 Feb 2009 15:49:37 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/contact-subscribe/</guid><description>&lt;h3 id="subscribe-blog-article"&gt;Subscribe Blog Article&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://feeds2.feedburner.com/appleboy/"&gt;http://feeds2.feedburner.com/appleboy/&lt;/a&gt; (建議用這個)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.wu-boy.com/feed/"&gt;http://blog.wu-boy.com/feed/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="contact-me"&gt;Contact Me&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://i1.wp.com/blog.wu-boy.com/wp-content/uploads/2009/01/mail.png"&gt;&lt;img src="https://i1.wp.com/blog.wu-boy.com/wp-content/uploads/2009/01/mail.png?w=840" alt="" title="mail" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Twitter：&lt;a href="http://twitter.com/appleboy"&gt;https://twitter.com/appleboy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plurk：&lt;a href="http://www.plurk.com/appleboy46"&gt;https://www.plurk.com/appleboy46&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Facebook：&lt;a href="https://www.facebook.com/appleboy46"&gt;https://www.facebook.com/appleboy46&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Github: &lt;a href="https://github.com/appleboy"&gt;https://github.com/appleboy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SlideShare: &lt;a href="http://www.slideshare.net/appleboy"&gt;http://www.slideshare.net/appleboy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Debian] GNU/Linux 5.0 發布 zhcon 解決終端機亂碼</title><link>https://blog.wu-boy.com/2009/02/debian-gnulinux-50-%E7%99%BC%E5%B8%83-zhcon-%E8%A7%A3%E6%B1%BA%E7%B5%82%E7%AB%AF%E6%A9%9F%E4%BA%82%E7%A2%BC/</link><pubDate>Wed, 18 Feb 2009 07:28:14 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/02/debian-gnulinux-50-%E7%99%BC%E5%B8%83-zhcon-%E8%A7%A3%E6%B1%BA%E7%B5%82%E7%AB%AF%E6%A9%9F%E4%BA%82%E7%A2%BC/</guid><description>&lt;p&gt;&lt;a href="http://debian.org"&gt;Debian&lt;/a&gt; 釋出了 GNU/Linux 5.0 發布，&lt;a href="http://debian.org/News/2009/20090214.zh-tw.html"&gt;官方新聞&lt;/a&gt; 於2009年02月14日發佈出來，最近想說把自己的 NB 要換成 Debian 5.0 版本，不過之前都是在玩 Ubuntu 的狀況下，所以就找 i386 的 ISO 檔案，利用虛擬機器 &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt;，之前也沒有玩過虛擬機器，都是直接燒光碟，拿主機來硬幹，哈哈，不過想說學習一下 VitualBox 來試試看，我參考了一篇 &lt;a href="http://www.peachwaneversay.blogspot.com/2007/06/virtualbox_09.html"&gt;VirtualBox指南&lt;/a&gt;，寫的很不錯，我就拿來使用 Debian 5.0 了，不過安裝過程其實還蠻簡易的，可以參考這篇：&lt;a href="http://maxubuntu.blogspot.com/2008/12/debian-desktop.html"&gt;[教學]圖解Debian Desktop安裝筆記(1)&lt;/a&gt;，這篇寫的很好，也淺顯易懂，安裝好之後，開機 grub 畫面如下： &lt;a href="https://www.flickr.com/photos/appleboy/3289226153/" title="2009-02-18_151709 (by appleboy46)"&gt;&lt;img title="2009-02-18_151709 (by appleboy46)" src="https://i1.wp.com/farm4.static.flickr.com/3651/3289226153_da7c30e54c.jpg?resize=500%2C320&amp;#038;ssl=1" alt="2009-02-18_151709 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[jQuery] Confirm Plugin 動態新增表單欄位</title><link>https://blog.wu-boy.com/2009/02/jquery-confirm-plugin%EF%BC%8C%E5%8B%95%E6%85%8B%E6%96%B0%E5%A2%9E%E8%A1%A8%E5%96%AE%E6%AC%84%E4%BD%8D/</link><pubDate>Wed, 18 Feb 2009 03:04:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/02/jquery-confirm-plugin%EF%BC%8C%E5%8B%95%E6%85%8B%E6%96%B0%E5%A2%9E%E8%A1%A8%E5%96%AE%E6%AC%84%E4%BD%8D/</guid><description>&lt;p&gt;最近在實做多重檔案上傳，寫過一篇 &lt;a href="http://blog.wu-boy.com/2009/01/03/677/" target="_blank"&gt;[PHP] pear 模組 HTTP_Upload 多重檔案上傳 Multiple files upload&lt;/a&gt;，那一開始我先設定只能上傳5個檔案，後來想想動態的話比較方便，畢竟現在網站都講求 web2.0，所以就利用 &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; 來動態新增 input file 欄位，作法其實很簡單，不難的喔。其實還有 &lt;a href="http://nadiana.com/jquery-confirm-plugin"&gt;jQuery Confirm Plugin&lt;/a&gt; 可以利用它來確定使用者是否刪除檔案。 之前介紹的上傳檔案 html 部份：&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate" title=""&gt;
 
 
 
 
&lt;/pre&gt;</description></item><item><title>[PHP] 取得圖片大小長寬資訊</title><link>https://blog.wu-boy.com/2009/02/php-%E5%8F%96%E5%BE%97%E5%9C%96%E7%89%87%E5%A4%A7%E5%B0%8F%E9%95%B7%E5%AF%AC%E8%B3%87%E8%A8%8A/</link><pubDate>Mon, 16 Feb 2009 11:34:52 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/02/php-%E5%8F%96%E5%BE%97%E5%9C%96%E7%89%87%E5%A4%A7%E5%B0%8F%E9%95%B7%E5%AF%AC%E8%B3%87%E8%A8%8A/</guid><description>&lt;p&gt;今天在 &lt;a href="http://www.ptt.cc/index.html"&gt;批踢踢實業坊&lt;/a&gt; 裡面的 &lt;a href="http://tw.php.net/"&gt;PHP&lt;/a&gt; 版，看到有人問到如何取得圖片的資訊，例如：大小，長寬…等，那推文的幾乎都是推利用 PHP function &lt;a href="http://tw.php.net/getimagesize" target="_blank"&gt;GetImageSize&lt;/a&gt;，但是 buganini 版友推 &lt;a href="http://www.imagemagick.org"&gt;imagemagick&lt;/a&gt; 裡面的 &lt;a href="http://www.imagemagick.org/www/identify.html"&gt;identify command line&lt;/a&gt; 這個功能，我覺得相當不錯， imagemagic &lt;a href="http://www.imagemagick.org/www/convert.html"&gt;convert&lt;/a&gt; 支援強大的轉圖功能，不只能壓縮圖片大小，也可以觀看圖片資訊，推薦給大家使用。&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# 利用 identify 取得圖片大小及長寬
identify books.gif
books.gif GIF 54x54 54x54+0+0 PseudoClass 256c 8-bit 1.66211kb&lt;/pre&gt;</description></item><item><title>[wordpress]update 2.6 -&gt; 2.71</title><link>https://blog.wu-boy.com/2009/02/wordpressupdate-25-271/</link><pubDate>Sun, 15 Feb 2009 06:58:14 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/02/wordpressupdate-25-271/</guid><description>&lt;p&gt;好久沒來升級 &lt;a href="http://wordpress.org"&gt;wordpress&lt;/a&gt;，發現升級過後，後台改的還真多阿，升級可以參考 &lt;a href="http://blog.wu-boy.com/2008/04/27/192/"&gt;[wordpress] 快速升級 Upgrade 2.5.0 -&amp;gt; 2.5.1 for Linux &amp;amp; FreeBSD&lt;/a&gt;，2.7.1 是 2.7 來維護的第一個版本，如果已經是版本 2.7 的話，可以利用後台 Tools-&amp;gt;Upgrade menu 來升級，相當方便，不過我是利用 &lt;a href="http://wordpress.org/download/svn/"&gt;Subversion&lt;/a&gt; 的方式，2.7.1 版本修正了 &lt;a href="http://core.trac.wordpress.org/query?status=closed&amp;amp;milestone=2.7.1&amp;amp;resolution=fixed&amp;amp;order=priority"&gt;68 tickets&lt;/a&gt;，底下可以看到 2.7 版本的畫面： &lt;a href="https://www.flickr.com/photos/appleboy/3280897608/" title="34680316838 (by appleboy46)"&gt;&lt;img src="https://i1.wp.com/farm4.static.flickr.com/3321/3280897608_64da16b51b_b.jpg?w=500&amp;#038;ssl=1" title="34680316838 (by appleboy46)" alt="34680316838 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[FireFox] 安裝 google toolbar 使用 chrome Start page</title><link>https://blog.wu-boy.com/2009/02/firefox-%E5%AE%89%E8%A3%9D-google-toolbar-%E4%BD%BF%E7%94%A8-chrome-start-page/</link><pubDate>Wed, 11 Feb 2009 01:31:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/02/firefox-%E5%AE%89%E8%A3%9D-google-toolbar-%E4%BD%BF%E7%94%A8-chrome-start-page/</guid><description>&lt;p&gt;在 &lt;a href="http://blog.darkhero.net"&gt;darkhero&lt;/a&gt; 的 blog 發現了這篇 &lt;a href="http://blog.darkhero.net/?p=333"&gt;讓Firefox也有Chrome的StartPage&lt;/a&gt;，用起來發現還不錯，會記憶妳上過的網站，截圖放在首頁喔，那安裝方法很容易啦，就是 &lt;a href="http://www.moztw.org/"&gt;FireFox&lt;/a&gt; 的 &lt;a href="http://www.google.com/tools/firefox/toolbar/FT5/intl/zh-TW/index.html"&gt;Google Toolbar&lt;/a&gt;，非常方便。利用 Ctrl + T 就可以看到分頁功能了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;檢視您最常造訪的網站：&lt;/strong&gt; 只要開啟新分頁即可檢視您最常造訪的網站。 畫面如下： &lt;a href="https://www.flickr.com/photos/appleboy/3270934280/" title="google toolbar home page (by appleboy46)"&gt;&lt;img title="google toolbar home page (by appleboy46)" src="https://i1.wp.com/farm4.static.flickr.com/3377/3270934280_fc4006431f.jpg?resize=500%2C299&amp;#038;ssl=1" alt="google toolbar home page (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[FreeBSD] Perl 5.8.9 on bsnmpd SNMP 統計流量分析 mrtg</title><link>https://blog.wu-boy.com/2009/02/freebsd-perl-589-on-bsnmpd-snmp-%E7%B5%B1%E8%A8%88%E6%B5%81%E9%87%8F%E5%88%86%E6%9E%90-mrtg/</link><pubDate>Fri, 06 Feb 2009 09:57:20 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/02/freebsd-perl-589-on-bsnmpd-snmp-%E7%B5%B1%E8%A8%88%E6%B5%81%E9%87%8F%E5%88%86%E6%9E%90-mrtg/</guid><description>&lt;p&gt;在 &lt;a href="http://www.freebsd.org/"&gt;FreeBSD&lt;/a&gt; 7.1 Release 要裝起 SNMP 搭配 MRTG 已經非常容易，請參考之前寫的教學：&lt;a href="http://blog.wu-boy.com/2008/03/20/158/"&gt;[FreeBSD] SNMP 統計流量分析 mrtg&lt;/a&gt; ，可是這次因為安裝新系統，使用 Perl 5.8.9 在 MRTG 相依性好像安裝的不是很好，所以造成底下錯誤訊息：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Can’t locate SNMP_util.pm in @INC (@INC contains: /usr/local/bin/../lib/mrtg2 / usr/local/bin /usr/local/lib/perl5/5.8. 9/BSDPAN /usr/local/lib/perl5/site_perl /5.8.9/mach /usr/local/lib/perl5/site_p erl/5.8.9 /usr/local/lib/perl5/site_per l /usr/local/lib/perl5/5.8.9/mach /usr/ local/lib/perl5/5.8.9 .) at /usr/local/ bin/cfgmaker line 105&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[生活]2009高雄燈會煙火</title><link>https://blog.wu-boy.com/2009/02/%E7%94%9F%E6%B4%BB2009%E9%AB%98%E9%9B%84%E7%87%88%E6%9C%83%E7%85%99%E7%81%AB/</link><pubDate>Thu, 05 Feb 2009 13:23:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/02/%E7%94%9F%E6%B4%BB2009%E9%AB%98%E9%9B%84%E7%87%88%E6%9C%83%E7%85%99%E7%81%AB/</guid><description>&lt;p&gt;2009高雄這次舉辦的燈會煙火，固定每天晚上時間9點鐘會播放一次，真的還蠻精彩的喔，不比去年的 &lt;a href="http://blog.wu-boy.com/2008/10/12/543/"&gt;[嘉義]國慶煙火影片&lt;/a&gt; 還差喔，高雄這次辦的還不錯。&lt;/p&gt;</description></item><item><title>[Google]Offline Gmail 新功能</title><link>https://blog.wu-boy.com/2009/01/googleoffline-gmail-%E6%96%B0%E5%8A%9F%E8%83%BD/</link><pubDate>Thu, 29 Jan 2009 09:45:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/01/googleoffline-gmail-%E6%96%B0%E5%8A%9F%E8%83%BD/</guid><description>&lt;p&gt;今天看到 &lt;a href="http://mail.google.com/mail/?hl=zh-tw"&gt;Gmail&lt;/a&gt; 的新功能：&lt;a href="http://googlesystem.blogspot.com/2009/01/offline-gmail.html"&gt;Offline Gmail&lt;/a&gt; 可以讓使用者離線瀏覽自己的 Gmail 信箱，看到 &lt;a href="http://gmailblog.blogspot.com/2009/01/new-in-labs-offline-gmail.html"&gt;New in Labs: Offline Gmail&lt;/a&gt; 這篇，裡面有一個影片非常的詳細介紹了這個 Offline Gmail 的好處，它利用了 &lt;a href="http://gears.google.com/"&gt;Gears&lt;/a&gt; 來下載您的 mail 資料放於 local cache，這 cache 可以自動地 synchronized Gmail’s Server，當您失去了網路連線，Gmail 就會自動切換到 offline mode，然後轉換存取到您的電腦硬碟，來取代網路連線的模式。 底下是 google 的一段影片&lt;/p&gt;</description></item><item><title>[MySQL]left, right, inner, outer join 使用方法</title><link>https://blog.wu-boy.com/2009/01/mysqlleft-right-inner-outer-join-%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95/</link><pubDate>Sat, 24 Jan 2009 12:09:39 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/01/mysqlleft-right-inner-outer-join-%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;最近在高雄面試的時候，被問到的資料庫問題，什麼是 left join，out join，inner join，其實這些都是寫基本 SQL 語法需要知道的，當然我比較少用到 out join，不過還是要知道一下比較好喔，底下來說明一下這些，整理一些心得&lt;/p&gt;
&lt;h2 id="表格-test1-資料表"&gt;表格 test1 資料表&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/3222461660/" title="2 (by appleboy46)"&gt;&lt;img src="https://i2.wp.com/farm4.static.flickr.com/3327/3222461660_4203972953_o.jpg?resize=171%2C92&amp;#038;ssl=1" title="2 (by appleboy46)" alt="2 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="表格-test2-資料表"&gt;表格 test2 資料表&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/3222461636/" title="1 (by appleboy46)"&gt;&lt;img src="https://i1.wp.com/farm4.static.flickr.com/3328/3222461636_c25a9bf9e5_o.jpg?resize=126%2C121&amp;#038;ssl=1" title="1 (by appleboy46)" alt="1 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[javascript]判斷中文全形字數有幾個</title><link>https://blog.wu-boy.com/2009/01/javascript%E5%88%A4%E6%96%B7%E4%B8%AD%E6%96%87%E5%85%A8%E5%BD%A2%E5%AD%97%E6%95%B8%E6%9C%89%E5%B9%BE%E5%80%8B/</link><pubDate>Thu, 22 Jan 2009 12:46:06 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/01/javascript%E5%88%A4%E6%96%B7%E4%B8%AD%E6%96%87%E5%85%A8%E5%BD%A2%E5%AD%97%E6%95%B8%E6%9C%89%E5%B9%BE%E5%80%8B/</guid><description>&lt;p&gt;在 &lt;a href="http://www.ptt.cc/index.html"&gt;ptt&lt;/a&gt; &lt;a href="telnet://ptt.cc"&gt;bbs&lt;/a&gt; 的 AJAX 版討論到如何判斷計算有幾個中文字數，那 TonyQ 兄跟 toshii 兄分別提供了兩種方法，我自己測試了一下包含全形字型，如：？，。…這些都算喔，我自己想到 &lt;a href="http://www.cht.com.tw/"&gt;中華電信&lt;/a&gt; &lt;a href="http://www.emome.net/"&gt;emome&lt;/a&gt; 的簡訊系統也會有判斷數字加上英文跟中文字的算法，看了一下大致上都是相同的。 TonyQ 解法：&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;/*
利用 regex pattern
*/
function chineseCount(word){
 return word.split(/[\u4e00-\u9a05]/).length -1;
}

var word="test中asd文asd字as到底asd有幾asd個?";
alert(chineseCount(word));
&lt;/pre&gt;</description></item><item><title>Linux Find 指令用法教學</title><link>https://blog.wu-boy.com/2009/01/linuxfreebsd-find-%E6%8C%87%E4%BB%A4%E7%94%A8%E6%B3%95%E6%95%99%E5%AD%B8/</link><pubDate>Tue, 13 Jan 2009 06:35:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/01/linuxfreebsd-find-%E6%8C%87%E4%BB%A4%E7%94%A8%E6%B3%95%E6%95%99%E5%AD%B8/</guid><description>&lt;p&gt;筆記一下自己常用的 &lt;a href="https://www.geeksforgeeks.org/find-command-in-linux-with-examples/"&gt;find&lt;/a&gt; 指令，適用於 &lt;a href="https://www.freebsd.org/"&gt;FreeBSD&lt;/a&gt; 或者是 &lt;a href="https://en.wikipedia.org/wiki/Linux"&gt;Linux&lt;/a&gt; 各大 distribution，系統管理這個指令就相當重要了，在搭配 grep，sed，awk，perl 可以快速找到自己要的檔案。我自己本身很常用到 grep，find，awk 這些撰寫 shell script。 底下先來介紹一下 find： 1. 找出 . 底下的 php 檔案&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -name &lt;span style="color:#cd5555"&gt;&amp;#34;*.php&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;找出 . 底下非 php 副檔名檔案&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -not -name &lt;span style="color:#cd5555"&gt;&amp;#34;*.php&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>[Linux] 利用 awk 或 perl command line 找出 passwd id 大於1000 的帳號</title><link>https://blog.wu-boy.com/2009/01/linux-%E5%88%A9%E7%94%A8-awk-%E6%88%96-perl-command-line-%E6%89%BE%E5%87%BA-passwd-id-%E5%A4%A7%E6%96%BC1000-%E7%9A%84%E5%B8%B3%E8%99%9F/</link><pubDate>Fri, 09 Jan 2009 13:19:53 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/01/linux-%E5%88%A9%E7%94%A8-awk-%E6%88%96-perl-command-line-%E6%89%BE%E5%87%BA-passwd-id-%E5%A4%A7%E6%96%BC1000-%E7%9A%84%E5%B8%B3%E8%99%9F/</guid><description>&lt;p&gt;其實還蠻簡單的，只是想紀錄一下，利用 awk 或者是 perl command line 找出非系統產生的帳號 perl:&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# perl 寫法
#
perl -an -F: -e 'if ($F[2] &gt;= 1000) { print $F[0],"\n"; }' passwd&lt;/pre&gt; awk: 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# awk 寫法
#
awk -F ":" '($3 &gt;= 1000) { printf $1 "\n"}' /etc/passwd&lt;/pre&gt;</description></item><item><title>[FreeBSD]快速利用 cvsup-mirror 架設 CVSup Server (mirror site)</title><link>https://blog.wu-boy.com/2009/01/freebsd%E5%BF%AB%E9%80%9F%E5%88%A9%E7%94%A8-cvsup-mirror-%E6%9E%B6%E8%A8%AD-cvsup-server-mirror-site/</link><pubDate>Tue, 06 Jan 2009 13:22:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/01/freebsd%E5%BF%AB%E9%80%9F%E5%88%A9%E7%94%A8-cvsup-mirror-%E6%9E%B6%E8%A8%AD-cvsup-server-mirror-site/</guid><description>&lt;p&gt;今天看到一篇：&lt;a href="http://www.backup.idv.tw/viewtopic.php?=&amp;amp;p=1536"&gt;[教學]用 cvsup-mirror 架設 CVSup Server (mirror site)&lt;/a&gt;，自己就來架設一下，其實還蠻容易的，因為 FreeBSD Ports 都已經包好，所以安裝起來也不困難，利用 &lt;a href="http://www.freshports.org/net/cvsup-mirror/"&gt;cvsup-mirror&lt;/a&gt; 這個軟體就可以架設完成了，那如何在台灣找尋一台最佳連線速度的 mirror 伺服器呢，利用 &lt;a href="http://www.freshports.org/sysutils/fastest_cvsup/"&gt;fastest_cvsup&lt;/a&gt; 這個 ports 軟體，就可以了，當 FreeBSD 剛安裝完成，就是要先設定 cvsup mirror 的站台，我自己都是用 cvsup.tw.freebsd.org，這伺服器是交大資工架設，domain 同 freebsd.csie.nctu.edu.tw，我們利用 fastest_cvsup 可以另外找尋更好的伺服器。&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# ports 安裝
#
cd /usr/ports/sysutils/fastest_cvsup
make install clean&lt;/pre&gt; 說明如何使用指令： 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# 找尋台灣區最佳的伺服器 
#
fastest_cvsup -c tw
#
# 找尋最上層 cvsup 伺服器，如 cvsup.freebsd.org
#
fastest_cvsup -c tld&lt;/pre&gt;</description></item><item><title>[PHP]製作類似 google 網頁認證碼</title><link>https://blog.wu-boy.com/2009/01/php%E8%A3%BD%E4%BD%9C%E9%A1%9E%E4%BC%BC-google-%E7%B6%B2%E9%A0%81%E8%AA%8D%E8%AD%89%E7%A2%BC/</link><pubDate>Mon, 05 Jan 2009 15:36:25 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/01/php%E8%A3%BD%E4%BD%9C%E9%A1%9E%E4%BC%BC-google-%E7%B6%B2%E9%A0%81%E8%AA%8D%E8%AD%89%E7%A2%BC/</guid><description>&lt;p&gt;我在 &lt;a href="http://blog.roodo.com/jaceju/"&gt;網站製作學習誌&lt;/a&gt; 發現一篇 &lt;a href="http://blog.roodo.com/jaceju/archives/8015459.html"&gt;[Web] 連結分享&lt;/a&gt; 裡面有一篇：&lt;a href="http://samsharehome.blogspot.com/2008/12/phpgoogle.html"&gt;用php做出類似Google的字詞驗證圖片&lt;/a&gt;，這一篇寫的不錯，跟我之前寫的一篇：&lt;a href="http://blog.wu-boy.com/2008/10/28/572/"&gt;[PHP] 好用的留言板 驗證碼 功能&lt;/a&gt;，驗證碼的強度還要更好，畢竟這樣比較不會被破解，然而這篇加上許多干擾的驗證，也選用了比較複雜的字型來提供給網站驗證部份，在 google 的登入系統部份，剛開始都是給使用者方便，不會跑出驗證碼的部份，可是只要輸入幾次錯誤的帳號密碼之後，google 的驗證碼就會跑出來了，而這個很類似 google 的驗證碼提供給大家使用，當然也感謝原作者，因為在Google字詞驗證與 &lt;a href="http://caca.zoy.org/wiki/PWNtcha"&gt;CAPTCHA&lt;/a&gt; 都已經相繼被破解，這消息我不知道從哪裡來的，在 &lt;a href="http://samsharehome.blogspot.com/2008/12/phpgoogle.html"&gt;這裡&lt;/a&gt; 有提到，詳細情祥可能要網路查查了 那在這個 php class 說明以及 code 如下，相信都寫的很清楚： html 認證部份：&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate" title=""&gt;



Type the characters you see in the picture below. &lt;br /&gt;
&lt;img src="verify_image.php" alt="點此刷新驗證碼" name="verify_code" width="150" height="60" border="0" id="verify_code"
onclick="document.getElementById('verify_code').src='verify_image.php?' + Math.random();" style="FILTER: wave(add=0,freq=3,lightstrength=50,phase=0,strength=3);cursor:pointer;" /&gt;&lt;br /&gt;


&lt;/pre&gt;</description></item><item><title>[FreeBSD筆記] 快速搜尋 ports 軟體 psearch</title><link>https://blog.wu-boy.com/2009/01/freebsd%E7%AD%86%E8%A8%98-%E5%BF%AB%E9%80%9F%E6%90%9C%E5%B0%8B-ports-%E8%BB%9F%E9%AB%94/</link><pubDate>Sun, 04 Jan 2009 13:41:54 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/01/freebsd%E7%AD%86%E8%A8%98-%E5%BF%AB%E9%80%9F%E6%90%9C%E5%B0%8B-ports-%E8%BB%9F%E9%AB%94/</guid><description>&lt;p&gt;在 &lt;a href="http://www.freebsd.org/"&gt;FreeBSD&lt;/a&gt; 內建的搜尋 &lt;a href="http://www.freebsd.org/ports/"&gt;ports&lt;/a&gt; 指令搜尋速度有點慢，加上搜尋出來還蠻難找的，所以推薦一個搜尋 ports 軟體：&lt;a href="http://www.freebsd.org/cgi/cvsweb.cgi/ports/ports-mgmt/psearch/"&gt;psearch&lt;/a&gt;，支援 regular expression 安裝方式：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# ports 安裝
#
cd /usr/ports/ports-mgmt/psearch
make install clean
rehash;&lt;/pre&gt; 使用方法： 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;options:
 -V, --version 顯示版本資訊
 -h, --help 顯示 help 資訊
 -c CATEGORY, --category=CATEGORY
 快速搜尋方式，可以指定資料夾，例如：www，chinese
 -f FILE, --file=FILE 指定 INDEX 的檔案 Default: "/usr/ports/INDEX-7"
 -l, --long 顯示詳細的 ports 資訊介紹
 -m, --maintainer 取代 ports 的簡短訊息，顯示維護者資訊
 也可以搜尋 ports 的維護者所有維護的 ports
 -n, --name 顯示標準的訊息，基本的版本訊息
 -o, --or 搜尋任何符合 PATTERN 的 ports 資訊
 -s, --search_long 顯示 ports 詳細的資訊，速度較慢
 -v INVERSE_PATTERN, --inverse=INVERSE_PATTERN
 反向搜尋 ports 名稱&lt;/pre&gt;</description></item><item><title>[PHP] pear 模組 HTTP_Upload 多重檔案上傳 Multiple files upload</title><link>https://blog.wu-boy.com/2009/01/php-pear-%E6%A8%A1%E7%B5%84-http_upload-%E5%A4%9A%E9%87%8D%E6%AA%94%E6%A1%88%E4%B8%8A%E5%82%B3-multiple-files-upload/</link><pubDate>Sat, 03 Jan 2009 10:10:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2009/01/php-pear-%E6%A8%A1%E7%B5%84-http_upload-%E5%A4%9A%E9%87%8D%E6%AA%94%E6%A1%88%E4%B8%8A%E5%82%B3-multiple-files-upload/</guid><description>&lt;p&gt;自從上次介紹了 &lt;a href="http://blog.wu-boy.com/2008/10/24/563/"&gt;[PHP]好用的上傳 pear 模組 HTTP_Upload&lt;/a&gt;，最近又要使用到多重的檔案上傳，就又去看了一下官網的 &lt;a href="http://pear.php.net/manual/en/package.http.http-upload.php#package.http.http-upload.examples.multiple"&gt;document&lt;/a&gt; 寫的還蠻詳細的，大家去看看大概就知道我的作法了，底下是我的寫法： html 部份&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate" title=""&gt;
 
 
 
 
&lt;/pre&gt;</description></item><item><title>[MySQL] 實做 MySQL Master-Master Replication 同步</title><link>https://blog.wu-boy.com/2008/12/mysql-%E5%AF%A6%E5%81%9A-mysql-master-master-replication-%E5%90%8C%E6%AD%A5/</link><pubDate>Tue, 30 Dec 2008 14:10:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/12/mysql-%E5%AF%A6%E5%81%9A-mysql-master-master-replication-%E5%90%8C%E6%AD%A5/</guid><description>&lt;p&gt;今天無聊實做了 &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt; 資料庫同步化，那可以先看看 &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/replication.html"&gt;MySQL Master Slave Replication&lt;/a&gt;，中文網站可以上 google 查詢或者是看看這一篇：&lt;a href="http://plog.longwin.com.tw/my_note-app-setting/2008/03/11/mysql_replication_master_slave_set_2008"&gt;MySQL 設定 Replication (Master – Slave)&lt;/a&gt;，基本上設定還蠻容易的，如果會 Master 同步到 Slave 的話，那 MySQL Master-Master 只是在用相同的方法在做一遍，如果不懂 MMM 的可以先參考這一篇：&lt;a href="http://plog.longwin.com.tw/news-technology/2008/10/21/mysql-master-replication-manager-mmm-intro-2008"&gt;MySQL Master-Master Replication Manager(1) – 簡介&lt;/a&gt;，這篇寫的很清楚，今天看了文章，我實做起來，遇到一些問題，其實還蠻奇怪的，所以底下就來紀錄一下步驟，順便也說明一下。 實做兩台 Ubuntu 機器： db1：192.168.1.1 db2：192.168.1.2 先設定 db1： 目前我都是在 Ubuntu 7.10 底下實做的，那基本上只要有支援 MySQL 的 Linux 或者 FreeBSD 機器都可以實做這個方法： &lt;strong&gt;&lt;span style="color: #ff0000;"&gt;步驟一：先修改 my.cnf 這個檔案：&lt;/span&gt;&lt;/strong&gt; FreeBSD 的話在：/var/db/mysql/my.cnf Ubuntu：/etc/mysql/my.cnf 有的版本是在 /etc/my.cnf 所以不太一定，請依照自己的作業系統 修改：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# bind-address 請 mark 起來，因為我們必須讓 MySQL Listen 各個不同的 IP Address
#bind-address = 127.0.0.1
#
# server id 請記得每台機器都設定不同喔
#
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log&lt;/pre&gt;</description></item><item><title>[FreeBSD]利用 DenyHosts 軟體擋掉暴力破解 ssh 的使用者</title><link>https://blog.wu-boy.com/2008/12/freebsd%E5%88%A9%E7%94%A8-denyhosts-%E8%BB%9F%E9%AB%94%E6%93%8B%E6%8E%89%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3-ssh-%E7%9A%84%E4%BD%BF%E7%94%A8%E8%80%85/</link><pubDate>Fri, 26 Dec 2008 04:48:00 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/12/freebsd%E5%88%A9%E7%94%A8-denyhosts-%E8%BB%9F%E9%AB%94%E6%93%8B%E6%8E%89%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3-ssh-%E7%9A%84%E4%BD%BF%E7%94%A8%E8%80%85/</guid><description>&lt;p&gt;不管是架設好 Linux 跟 &lt;a href="http://www.freebsd.org/"&gt;FreeBSD&lt;/a&gt; 通常都會有國外的 hacker 來 try 機器的 SSH 帳號密碼，我想這是很正常的，網路上也提供很多方法來分析 Log 檔，&lt;a href="http://www.freebsd.org/"&gt;FreeBSD&lt;/a&gt;：/var/log/auth.log，我可以分析檔案，然後再利用 firewall like ipfw or pf 的方式來達到，或者是利用寫到 /etc/hosts.deny 來達到 Block 的功能，網路上有很多工具可以用，例如 &lt;a href="http://denyhosts.sourceforge.net/"&gt;DenyHosts&lt;/a&gt;，&lt;a href="http://sshguard.sourceforge.net/"&gt;sshguard&lt;/a&gt; 或者是 &lt;a href="http://anp.ath.cx/sshit/"&gt;sshit&lt;/a&gt;，可以參考我之前寫的一篇&lt;a href="http://blog.wu-boy.com/2006/11/04/31/"&gt;利用 sshit 來達到阻擋 ssh 使用者&lt;/a&gt;，然而今天來介紹一下 DenyHosts 再 FreeBSD 底下如何設定，還蠻方便的。 首先利用 ports 安裝，&lt;a href="http://denyhosts.sourceforge.net/"&gt;DenyHosts&lt;/a&gt; 是利用 &lt;a href="http://www.python.org/"&gt;python&lt;/a&gt; 的程式語言寫出來的：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;Port: denyhosts-2.6_2
Path: /usr/ports/security/denyhosts
Info: Script to thwart ssh attacks
Maint: janos.mohacsi@bsd.hu
B-deps: python25-2.5.2_3
R-deps: python25-2.5.2_3
WWW: http://denyhosts.sourceforge.net/

/* 利用 ports 安裝 */
cd /usr/ports/security/denyhosts; make install clean
&lt;/pre&gt;</description></item><item><title>[jQuery]判斷 checkbox 是否選取，實現全選跟全部取消</title><link>https://blog.wu-boy.com/2008/12/jquery%E5%88%A4%E6%96%B7-checkbox-%E6%98%AF%E5%90%A6%E9%81%B8%E5%8F%96%EF%BC%8C%E5%AF%A6%E7%8F%BE%E5%85%A8%E9%81%B8%E8%B7%9F%E5%85%A8%E9%83%A8%E5%8F%96%E6%B6%88/</link><pubDate>Tue, 23 Dec 2008 05:50:02 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/12/jquery%E5%88%A4%E6%96%B7-checkbox-%E6%98%AF%E5%90%A6%E9%81%B8%E5%8F%96%EF%BC%8C%E5%AF%A6%E7%8F%BE%E5%85%A8%E9%81%B8%E8%B7%9F%E5%85%A8%E9%83%A8%E5%8F%96%E6%B6%88/</guid><description>&lt;p&gt;在 jQuery 底下要如何實現這個功能，其實還蠻簡單的，首先看 html 部份&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#8b008b;font-weight:bold"&gt;input&lt;/span&gt; &lt;span style="color:#658b00"&gt;name&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;user_active_col[]&amp;#34;&lt;/span&gt; &lt;span style="color:#658b00"&gt;type&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;checkbox&amp;#34;&lt;/span&gt; &lt;span style="color:#658b00"&gt;value&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&amp;gt; 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#8b008b;font-weight:bold"&gt;input&lt;/span&gt; &lt;span style="color:#658b00"&gt;name&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;user_active_col[]&amp;#34;&lt;/span&gt; &lt;span style="color:#658b00"&gt;type&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;checkbox&amp;#34;&lt;/span&gt; &lt;span style="color:#658b00"&gt;value&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;2&amp;#34;&lt;/span&gt;&amp;gt; 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#8b008b;font-weight:bold"&gt;input&lt;/span&gt; &lt;span style="color:#658b00"&gt;name&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;user_active_col[]&amp;#34;&lt;/span&gt; &lt;span style="color:#658b00"&gt;type&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;checkbox&amp;#34;&lt;/span&gt; &lt;span style="color:#658b00"&gt;value&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;3&amp;#34;&lt;/span&gt;&amp;gt; 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#8b008b;font-weight:bold"&gt;input&lt;/span&gt; &lt;span style="color:#658b00"&gt;name&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;user_active_col[]&amp;#34;&lt;/span&gt; &lt;span style="color:#658b00"&gt;type&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;checkbox&amp;#34;&lt;/span&gt; &lt;span style="color:#658b00"&gt;value&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;4&amp;#34;&lt;/span&gt;&amp;gt; 4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#8b008b;font-weight:bold"&gt;input&lt;/span&gt; &lt;span style="color:#658b00"&gt;name&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;user_active_col[]&amp;#34;&lt;/span&gt; &lt;span style="color:#658b00"&gt;type&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;checkbox&amp;#34;&lt;/span&gt; &lt;span style="color:#658b00"&gt;value&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;5&amp;#34;&lt;/span&gt;&amp;gt; 5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#8b008b;font-weight:bold"&gt;input&lt;/span&gt; &lt;span style="color:#658b00"&gt;name&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;clickAll&amp;#34;&lt;/span&gt; &lt;span style="color:#658b00"&gt;id&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;clickAll&amp;#34;&lt;/span&gt; &lt;span style="color:#658b00"&gt;type&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;checkbox&amp;#34;&lt;/span&gt;&amp;gt; 全選
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>[高雄美食]西堤 TASTY (西堤中山店)</title><link>https://blog.wu-boy.com/2008/12/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F%E8%A5%BF%E5%A0%A4-tasty-%E8%A5%BF%E5%A0%A4%E4%B8%AD%E5%B1%B1%E5%BA%97/</link><pubDate>Fri, 19 Dec 2008 05:02:22 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/12/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F%E8%A5%BF%E5%A0%A4-tasty-%E8%A5%BF%E5%A0%A4%E4%B8%AD%E5%B1%B1%E5%BA%97/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/3095498302/" title="1208194122"&gt;&lt;img src='https://i0.wp.com/farm4.static.flickr.com/3141/3095498302_e33deb0926.jpg?w=840&amp;#038;ssl=1' border='0' alt='1208194122' data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div id="map_address_20081208" style="width: 500px; height: 300px"&gt;
&lt;/div&gt; 在慶祝一週年之前，我就已經在規劃了，欠小蚊子一頓餐點，之前有一次本來要去吃，但是當天定位根本沒位子，所以這次學聰明了，馬上在一個月之前就定好了 
&lt;p&gt;&lt;a href="http://www.tasty.com.tw"&gt;西堤牛排&lt;/a&gt;，我自己本身也是第一次去吃，所以也帶著好奇的心情去吃，因為之前吃過同企業的 &lt;a href="http://blog.wu-boy.com/2008/10/05/536/"&gt;[嘉義美食]陶板屋&lt;/a&gt;，我覺得還不賴，那高雄這一間西堤第一次去吃，所以就跟小蚊子一起去吃，當天到了，發現人還真是多阿，2F整個都已經塞滿了客人，還沒六點半就已經超多人了，還是禮拜一呢，果然經濟不景氣，還是不會影響到餐飲業。&lt;/p&gt;</description></item><item><title>[AJAX] jQuery plugin cascade 多重下拉選單應用 by json</title><link>https://blog.wu-boy.com/2008/12/ajax-jquery-plugin-cascade-%E5%A4%9A%E9%87%8D%E4%B8%8B%E6%8B%89%E9%81%B8%E5%96%AE%E6%87%89%E7%94%A8-by-json/</link><pubDate>Fri, 19 Dec 2008 02:25:11 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/12/ajax-jquery-plugin-cascade-%E5%A4%9A%E9%87%8D%E4%B8%8B%E6%8B%89%E9%81%B8%E5%96%AE%E6%87%89%E7%94%A8-by-json/</guid><description>&lt;p&gt;最近在弄動態下拉式選單，因為層級的關係，所以必須用到，大學裡面各學院，底下在各系所，在網路上看到一篇 &lt;a href="http://blog.roodo.com/taikobo0/archives/6166625.html"&gt;[AJAX] jQuery的多重下拉式選單應用 PART1&lt;/a&gt;，實做起來是不會困難，可是我遇到一些怪問題就是了，目前還沒有解決，當然首推 &lt;a href="http://plugins.jquery.com"&gt;jQuery plugin&lt;/a&gt; 套件 &lt;a href="http://plugins.jquery.com/project/cascade"&gt;cascade&lt;/a&gt;，那也參考了國外的一篇文章 &lt;a href="http://devlicio.us/blogs/mike_nichols/archive/2008/05/25/jquery-cascade-cascading-values-from-forms.aspx"&gt;jQuery.cascade : Cascading values from forms&lt;/a&gt; ，這幾篇看完其實就差不多了，因為大家都寫得很清楚，&lt;a href="http://dev.chayachronicles.com/jquery/cascade/index.html"&gt;官方網站&lt;/a&gt; 更是把所有應用都寫出來了，詳細很多用法可以參考 &lt;a href="http://dev.chayachronicles.com/jquery/cascade/index.html"&gt;官方網站&lt;/a&gt;，看原始碼大概就知道在寫甚麼了。 先來說明一下使用的方法：在這個 jQuery cascade plugin 裡面，定義了一格式：&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;/*
格式就在底下總共有三攔
*/
{'when':'selectedValue','value':'itemValue','text':'itemText'}
&lt;/pre&gt; 第一個 when：這是上一層的 select 的 value 值 第二個 value：這是下一層的 select 的 value 值 第三個 text：這是下一層 option 的 text 我想有一點 html 基礎的，大概就知道我在說什麼了吧</description></item><item><title>[國科會計畫]虎尾科技大學報告</title><link>https://blog.wu-boy.com/2008/12/%E5%9C%8B%E7%A7%91%E6%9C%83%E8%A8%88%E7%95%AB%E8%99%8E%E5%B0%BE%E7%A7%91%E6%8A%80%E5%A4%A7%E5%AD%B8%E5%A0%B1%E5%91%8A/</link><pubDate>Sat, 13 Dec 2008 11:28:49 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/12/%E5%9C%8B%E7%A7%91%E6%9C%83%E8%A8%88%E7%95%AB%E8%99%8E%E5%B0%BE%E7%A7%91%E6%8A%80%E5%A4%A7%E5%AD%B8%E5%A0%B1%E5%91%8A/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/3101806893/" title="DSC00863"&gt;&lt;img src='https://i2.wp.com/farm4.static.flickr.com/3282/3101806893_bd47bb6fee.jpg?w=840&amp;#038;ssl=1' border='0' alt='DSC00863' data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/3101795479/" title="DSC00824"&gt;&lt;img src='https://i0.wp.com/farm4.static.flickr.com/3169/3101795479_19db8b2714.jpg?w=840&amp;#038;ssl=1' border='0' alt='DSC00824' data-recalc-dims="1" /&gt;&lt;/a&gt; 底下是我這一次去報的投影片：&lt;/p&gt;
&lt;div style="width:425px" id="__ss_842385"&gt;
 &lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/appleboy/ss-presentation-842385" title="全國電信研討會"&gt;全國電信研討會&lt;/a&gt;&lt;/strong&gt; 
 &lt;div style="padding:5px 0 12px"&gt;
 View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/appleboy"&gt;Wu Bo-Yi&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt; 這次的 
&lt;p&gt;&lt;a href="http://sparc.nfu.edu.tw/~nst2008/"&gt;2008全國電信研討會&lt;/a&gt; 舉辦在虎尾科技大學，在12月5號跟6號這兩天舉辦，這兩天我都必需要到現場，第一天呢，當然是去貼Poster，5號這天就跟IC，秉儒還有吉泰一起過去，這天其實是最多人的，我看每一場的會議室都是人，然後八樓跟九樓都有人在貼Poster，我們就拿海報貼一貼，不過說實在的，好像沒有人在問問題，所以到了中午過後我們就去領便當去吃了，這一天的便當還不錯吃，六號的便當，就…不太好吃了。&lt;/p&gt;</description></item><item><title>[Java] 使用java模擬ping和telnet的實現</title><link>https://blog.wu-boy.com/2008/12/java-%E4%BD%BF%E7%94%A8java%E6%A8%A1%E6%93%ACping%E5%92%8Ctelnet%E7%9A%84%E5%AF%A6%E7%8F%BE/</link><pubDate>Thu, 11 Dec 2008 07:18:18 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/12/java-%E4%BD%BF%E7%94%A8java%E6%A8%A1%E6%93%ACping%E5%92%8Ctelnet%E7%9A%84%E5%AF%A6%E7%8F%BE/</guid><description>&lt;p&gt;今天在寫 Java 的時候，遇到問題跑去問 TonyQ 兄，他丟了一個網址給我，剛剛測試過了，還漫好用的,紀錄一下 模擬 ping 的實現&lt;/p&gt;
&lt;pre class="brush: java; title: ; notranslate" title=""&gt;import java.io.*;
import java.net.*;

public class PseudoPing {
 public static void main(String args[]) {
 try {

 InetAddress address = InetAddress.getByName(args[0]);
 System.out.println(address.isReachable(5000));
 } catch (UnknownHostException e) {
 e.printStackTrace();
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
}&lt;/pre&gt;</description></item><item><title>[中正大學]畢業團拍</title><link>https://blog.wu-boy.com/2008/11/%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E7%95%A2%E6%A5%AD%E5%9C%98%E6%8B%8D/</link><pubDate>Tue, 25 Nov 2008 15:43:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/11/%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E7%95%A2%E6%A5%AD%E5%9C%98%E6%8B%8D/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/3059069796/" title="P1060675"&gt;&lt;img src='https://i1.wp.com/farm4.static.flickr.com/3006/3059069796_ba99e9f240.jpg?w=840&amp;#038;ssl=1' hspace='0' vspace='0' border='0' alt='P1060675' data-recalc-dims="1" /&gt;&lt;/a&gt; 今天早上呢，是我們&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.comm.ccu.edu.tw/"&gt;中正大學通訊工程研究所&lt;/a&gt; 一起拍團拍的時間，10點半就要開始拍了，這次大概是大家最早到實驗室的時候，不然大家應該都是到下午才會慢慢出現在實驗室，不過還好，我都很早起床就去實驗室了，哈哈，今天照相還蠻好玩的，我的老師穿的很正式，終於看到老師穿西裝打領帶了，真的帥呆了，一堆女生搶著要跟侯老師合拍，還說跟老師拍完才可以畢業，結果我跟老師合拍的時候，老師說我還要讀四年，囧～，底下是我跟老師合拍，老師真的好高阿&lt;/p&gt;</description></item><item><title>[Linux&amp;FreeBSD] 解决 umount時出現的 “Device is busy”</title><link>https://blog.wu-boy.com/2008/11/linuxfreebsd-%E8%A7%A3%E5%86%B3-umount%E6%99%82%E5%87%BA%E7%8F%BE%E7%9A%84-device-is-busy/</link><pubDate>Tue, 25 Nov 2008 08:32:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/11/linuxfreebsd-%E8%A7%A3%E5%86%B3-umount%E6%99%82%E5%87%BA%E7%8F%BE%E7%9A%84-device-is-busy/</guid><description>&lt;p&gt;在 Linux 系列 OS 安裝好之後，都會有支援一個 fuser 這一個指令，那有時候在 linux 底下 mount 隨身碟，或者是其他硬體的時候，有時候沒辦法讓您移除，會出現：『Device is busy』，那這個訊息是在保護確保你的資料有儲存到該裝置，有時候如果沒有正確移除，會造成資料遺失，或者是資料不完整，那基本上裝上任何一套 Linux 作業系統，都會有支援了，所以不必在另外安裝，那 &lt;a href="http://www.freebsd.org"&gt;FreeBSD&lt;/a&gt; 那就要在安裝 &lt;a href="http://www.freshports.org/sysutils/fuser"&gt;/usr/ports/sysutils/fuser&lt;/a&gt; 這一個 tool 這樣才會有喔 安裝：『FreeBSD』&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;cd /usr/ports/sysutils/fuser
make install clean&lt;/pre&gt; 那使用方法： for FreeBSD 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# fuser -m /var/log/maillog
/var/log/maillog: 513wa
# 加上 -u 參數
# fuser -mu /var/log/maillog
/var/log/maillog: 513wa(root)&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2008.11.28 update&lt;/strong&gt; 另外解法： 可以使用 fstat -f /home 來觀看有哪些 process access /home&lt;/p&gt;</description></item><item><title>[PHP] 設定 session 的過期時間 &amp; 暫存檔過多</title><link>https://blog.wu-boy.com/2008/11/php-%E8%A8%AD%E5%AE%9A-session-%E7%9A%84%E9%81%8E%E6%9C%9F%E6%99%82%E9%96%93-%E6%9A%AB%E5%AD%98%E6%AA%94%E9%81%8E%E5%A4%9A/</link><pubDate>Tue, 18 Nov 2008 11:40:31 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/11/php-%E8%A8%AD%E5%AE%9A-session-%E7%9A%84%E9%81%8E%E6%9C%9F%E6%99%82%E9%96%93-%E6%9A%AB%E5%AD%98%E6%AA%94%E9%81%8E%E5%A4%9A/</guid><description>&lt;p&gt;目前在 PHP 網站裡面，大部分的網站都是利用 session 的技術來達到驗證使用者帳號密碼，那 PHP 預設 SESSION 是把他寫入檔案，那 Linux 底下會放在 /tmp 裡面，你會發現網站越多人，裡面檔案就會越多，一串亂碼的檔案 sess_*，那底下是可以寫在程式裡面設定多久可以刪除這些過期的 Session 檔案 底下轉貼自：&lt;a href="http://www.finalwebsites.com/snippets.php?id=42"&gt;Cross-Browser Session Starter&lt;/a&gt;&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;&lt;?php
function start_session($expire = 0)
{
 if ($expire == 0) {
 $expire = ini_get('session.gc_maxlifetime');
 } else {
 ini_set('session.gc_maxlifetime', $expire);
 }

 if (empty($_COOKIE['PHPSESSID'])) {
 session_set_cookie_params($expire);
 session_start();
 } else {
 session_start();
 setcookie('PHPSESSID', session_id(), time() + $expire);
 }
}
?&gt; &lt;/pre&gt;</description></item><item><title>[Ubuntu &amp; java] java JDBC and MySQL</title><link>https://blog.wu-boy.com/2008/11/ubuntu-java-java-jdbc-and-mysql/</link><pubDate>Sat, 15 Nov 2008 12:34:10 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/11/ubuntu-java-java-jdbc-and-mysql/</guid><description>&lt;p&gt;最近開始要摸 &lt;a href="http://zh.wikipedia.org/wiki/Java"&gt;java&lt;/a&gt; 了，目前大概先實做 java with &lt;a href="http://java.sun.com/javase/technologies/database/"&gt;JDBC&lt;/a&gt; 連接 MySQL，所以在 &lt;a href="http://www.javaworld.com.tw"&gt;JavaWorld@TW&lt;/a&gt; 這裡找了一些相關的文件，目前我在 Linux 底下實做，還沒找到一套很適合的 IDE Tool 來撰寫程式碼，大家好像都很推 &lt;a href="http://www.netbeans.org/"&gt;netbeans&lt;/a&gt; 跟 &lt;a href="http://www.eclipse.org/"&gt;eclipse&lt;/a&gt;，不過我目前還是使用 &lt;a href="http://www.pspad.com/"&gt;PSPad&lt;/a&gt; 來撰寫 java 程式碼，然後透過 FTP 的方式編輯，這不是重點，重點是要透過 jdbc 來連接 MySQL，目前是在 &lt;a href="http://www.ubuntu-tw.org/"&gt;Ubuntu&lt;/a&gt; 7.04 這一版本上面實做，底下是實做方法： 1. 首先先安裝 deb 檔案：透過 apt-get 的方式&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# 首先尋找 java lib with mysql
apt-get install libmysql-java
&lt;/pre&gt; 2. 安裝好之後尋找 jar 檔案，加入到 class path 裡面 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# 首先 echo $CLASSPAT
#
# java mysql jar 檔案如下
/usr/share/java/mysql.jar
# 加入 CLASSPATH，修改 /etc/bash.bashrc
export CLASSPATH=$CLASSPATH:/usr/share/java/mysql.jar
# 然後在
source /etc/bash.bashrc&lt;/pre&gt;</description></item><item><title>[高雄美食]安德列廚房 法式簡約小館</title><link>https://blog.wu-boy.com/2008/11/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F%E5%AE%89%E5%BE%B7%E5%88%97%E5%BB%9A%E6%88%BF-%E6%B3%95%E5%BC%8F%E7%B0%A1%E7%B4%84%E5%B0%8F%E9%A4%A8/</link><pubDate>Tue, 11 Nov 2008 12:46:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/11/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F%E5%AE%89%E5%BE%B7%E5%88%97%E5%BB%9A%E6%88%BF-%E6%B3%95%E5%BC%8F%E7%B0%A1%E7%B4%84%E5%B0%8F%E9%A4%A8/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/3001636770/" title="1031183036"&gt;&lt;img src='https://i0.wp.com/farm4.static.flickr.com/3008/3001636770_f308b59193.jpg?w=840&amp;#038;ssl=1' border='0' alt='1031183036' data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div id="map_address_584" style="width: 500px; height: 300px"&gt;
&lt;/div&gt; 這是看過 ptt 的高雄版找到的一篇美食：
&lt;p&gt;&lt;a href="http://www.wretch.cc/blog/leoro/22632336"&gt;安德列廚房 法式簡約小館&lt;/a&gt;，然後就去吃了啦，這一間在高雄五福路新崛江附近這邊，我跟小蚊子是衝著甜點過去吃的，哈哈，這間的店面不會說很大，有點小間，不過還蠻好找的啦。&lt;/p&gt;</description></item><item><title>[中正大學]學校官方首頁改版 第七版</title><link>https://blog.wu-boy.com/2008/11/%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E5%AD%B8%E6%A0%A1%E5%AE%98%E6%96%B9%E9%A6%96%E9%A0%81%E6%94%B9%E7%89%88-%E7%AC%AC%E4%B8%83%E7%89%88/</link><pubDate>Tue, 04 Nov 2008 06:54:49 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/11/%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E5%AD%B8%E6%A0%A1%E5%AE%98%E6%96%B9%E9%A6%96%E9%A0%81%E6%94%B9%E7%89%88-%E7%AC%AC%E4%B8%83%E7%89%88/</guid><description>&lt;p&gt;&lt;a href="http://www.ccu.edu.tw"&gt;中正大學學校首頁&lt;/a&gt; 目前已經大致上開始運作快1個禮拜了，這次已經是創校以來第七次改版，我是這次改版程式負責的工讀生，我覺得這次改版跟上一次的風格大同小異，那前一版本的樣子，可以到 &lt;a href="http://www.ccu.edu.tw/V6/"&gt;這裡&lt;/a&gt; 看看，不確定什麼時候會砍，所以我用了 screen 的功能截圖下來： 最新版： &lt;a href="https://www.flickr.com/photos/appleboy/3002198860/" title="CCU_V7 (by appleboy46)"&gt;&lt;img title="CCU_V7 (by appleboy46)" src="https://i2.wp.com/farm4.static.flickr.com/3066/3002198860_689d1348b6.jpg?resize=500%2C357&amp;#038;ssl=1" alt="CCU_V7 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 前一版： &lt;a href="https://www.flickr.com/photos/appleboy/3001362775/" title="CCU_V6 (by appleboy46)"&gt;&lt;img title="CCU_V6 (by appleboy46)" src="https://i0.wp.com/farm4.static.flickr.com/3144/3001362775_23cec02b9a.jpg?resize=500%2C352&amp;#038;ssl=1" alt="CCU_V6 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[體檢]97年健康檢查出來了</title><link>https://blog.wu-boy.com/2008/11/%E9%AB%94%E6%AA%A297%E5%B9%B4%E5%81%A5%E5%BA%B7%E6%AA%A2%E6%9F%A5%E5%87%BA%E4%BE%86%E4%BA%86/</link><pubDate>Mon, 03 Nov 2008 05:59:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/11/%E9%AB%94%E6%AA%A297%E5%B9%B4%E5%81%A5%E5%BA%B7%E6%AA%A2%E6%9F%A5%E5%87%BA%E4%BE%86%E4%BA%86/</guid><description>&lt;p&gt;這一次開學我做了健康檢查，今天終於拿到體檢報告了，其實看起來沒有異常，不過牙齒部份，我被劃了三顆缺牙，囧，然後醫生建議欄裡面寫要我去檢查牙齒，避免持續惡化，不過也還好吧，缺了38,18,48這幾顆牙齒，嗯嗯，該不會我智齒都長在肉裡面吧，那我以後不就要開刀了，XDDD，其他部份都還蠻正常的，全部都落在標準值中間，很正常的，除了血壓，出來是 138 / 90 收縮壓/舒張壓 有點偏高之外，其實我在家裏面量，好像也差不多這樣喔，不過沒關係，我已經控制的很好，家裏量舒張壓，大概是75-80之間，慈濟量都會過高，我也不清處原因，哈哈，身高體重部份：167公分，62公斤，哈哈，這也是落在標準裡面，BMI：22.4，非常正常，其他血液檢查，尿液檢查，肝功能，血脂肪，這些都是正常的。 最後醫生建議我去看牙醫，不過這個還好啦，其他正常比較重要&lt;/p&gt;</description></item><item><title>[PHP] 好用的留言板 驗證碼 功能</title><link>https://blog.wu-boy.com/2008/10/php-%E5%A5%BD%E7%94%A8%E7%9A%84%E7%95%99%E8%A8%80%E6%9D%BF-%E9%A9%97%E8%AD%89%E7%A2%BC-%E5%8A%9F%E8%83%BD/</link><pubDate>Tue, 28 Oct 2008 07:59:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/10/php-%E5%A5%BD%E7%94%A8%E7%9A%84%E7%95%99%E8%A8%80%E6%9D%BF-%E9%A9%97%E8%AD%89%E7%A2%BC-%E5%8A%9F%E8%83%BD/</guid><description>&lt;p&gt;這算是大家都知道的技術了吧，因為說實在的，留言板惡意灌水實在是太容易了，就算是檔檔 referer 也是沒用，因為表頭可以自己偽造，那最好的方法就是用 PHP 驗證碼的機制，這個機制利用 GD 縮圖的部份，然後再把驗證數字存放在 SESSION 裡面，不過 PHPBB 的作法是存在 database 資料庫裡面進行比對，然後在 delete 該比資料，畢竟每個連線都有自己的 ssid 的值，所以這樣進行比對，我想是不錯的方法，也可以用在很多地方，那底下是我去 &lt;a href="http://jax-work-archive.blogspot.com"&gt;Jax 的工作紀錄&lt;/a&gt; 看到的一篇：&lt;a href="http://jax-work-archive.blogspot.com/2007/11/php.html"&gt;PHP 驗證碼&lt;/a&gt;，拿過來筆記一下。 首先先去 Windows 底下的 Fonts 資料夾，選一個字型吧，因為裡面會用到喔，不然底下這一段 code 會用到&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;imagettftext($im, 20, 0, 25, 35, $Color,"arial.ttf",$verification__session);
/*
imagettftext (int im, int size, int angle,
int x, int y, int col,
string fontfile, string text)
im 圖片物件
size 文字大小
angle 0度將會由左到右讀取文字，而更高的值表示逆時鐘旋轉
x y 文字起始座標
col 顏色物件
fontfile 字形路徑，為主機實體目錄的絕對路徑，
可自行設定想要的字型
text 寫入的文字字串
*/&lt;/pre&gt;</description></item><item><title>[PHP]好用的上傳 pear 模組 HTTP_Upload</title><link>https://blog.wu-boy.com/2008/10/php%E5%A5%BD%E7%94%A8%E7%9A%84%E4%B8%8A%E5%82%B3-pear-%E6%A8%A1%E7%B5%84-http_upload/</link><pubDate>Fri, 24 Oct 2008 06:08:41 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/10/php%E5%A5%BD%E7%94%A8%E7%9A%84%E4%B8%8A%E5%82%B3-pear-%E6%A8%A1%E7%B5%84-http_upload/</guid><description>&lt;p&gt;在台大 &lt;a href="http://www.ptt.cc"&gt;ptt&lt;/a&gt; BBS 上面看到有人推文上傳功能可以交給 &lt;a href="http://pear.php.net/package/HTTP_Upload"&gt;pear HTTP_Upload&lt;/a&gt; 來跟 PHP 搭配使用，自己去看了一下&lt;a href="http://pear.php.net/manual/en/package.http.http-upload.php"&gt;官方線上文件&lt;/a&gt;，教學還蠻容易的，大概看過範例就可以瞭解了，上傳之後的檔案，在搭配之前我寫的 &lt;a href="http://blog.wu-boy.com/2007/05/25/106/"&gt;[PHP] header下載檔案 搭配資料庫&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;* Can handle from one file to multiple files. * Safe file copying from tmp dir. * Easy detecting mechanism of valid upload, missing upload or error. * Gives extensive information about the uploaded file. * Rename uploaded files in different ways: as it is, safe or unique * Validate allowed file extensions * Multiple languages error messages support (es, en, de, fr, it, nl, pt_BR) 1. 首先下載官方檔案：&lt;a href="http://pear.php.net/package/HTTP_Upload/download"&gt;點我&lt;/a&gt; 2. 撰寫 PHP 程式：&lt;/p&gt;</description></item><item><title>[省錢]新竹 萊爾富（新竹竹磐店） 每朝烏龍..黑松汽水(買一送一)</title><link>https://blog.wu-boy.com/2008/10/%E7%9C%81%E9%8C%A2%E6%96%B0%E7%AB%B9-%E8%90%8A%E7%88%BE%E5%AF%8C%EF%BC%88%E6%96%B0%E7%AB%B9%E7%AB%B9%E7%A3%90%E5%BA%97%EF%BC%89-%E6%AF%8F%E6%9C%9D%E7%83%8F%E9%BE%8D%E9%BB%91%E6%9D%BE%E6%B1%BD/</link><pubDate>Wed, 22 Oct 2008 12:10:36 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/10/%E7%9C%81%E9%8C%A2%E6%96%B0%E7%AB%B9-%E8%90%8A%E7%88%BE%E5%AF%8C%EF%BC%88%E6%96%B0%E7%AB%B9%E7%AB%B9%E7%A3%90%E5%BA%97%EF%BC%89-%E6%AF%8F%E6%9C%9D%E7%83%8F%E9%BE%8D%E9%BB%91%E6%9D%BE%E6%B1%BD/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/2966690372/" title="IMG_1747"&gt;&lt;img src='https://i0.wp.com/farm4.static.flickr.com/3026/2966690372_9b55ab2dd1.jpg?w=840&amp;#038;ssl=1' border='0' alt='IMG_1747' data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div id="map_address_2008_10_22" style="width: 500px; height: 300px"&gt;
&lt;/div&gt; 店 家：新竹萊爾富竹磐 日 期：11月初截止 時 間：11月初以前 電 話：03-5422341 需要請直接聯絡店長： 
&lt;p&gt;&lt;a href="http://www.ptt.cc"&gt;ptt&lt;/a&gt; bbs id：user043 &lt;span style="color:red"&gt;店長電話：0982082584&lt;/span&gt; 地點 or 地址：面交取貨(新竹竹磐店) 新竹市北區3西大路734號 內容 or 方案：店長要衝業績..時機歹歹&lt;/p&gt;</description></item><item><title>[PHP]好用的FCKeditor</title><link>https://blog.wu-boy.com/2008/10/php%E5%A5%BD%E7%94%A8%E7%9A%84fckeditor/</link><pubDate>Fri, 17 Oct 2008 05:09:51 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/10/php%E5%A5%BD%E7%94%A8%E7%9A%84fckeditor/</guid><description>&lt;p&gt;最近在玩這一套 &lt;a href="http://www.fckeditor.net/"&gt;FCKeditor&lt;/a&gt; 線上 HTML 編輯系統，這目前很多 opensource 都有利用這一套編輯系統來搭配，我覺得還蠻方便的，所以很多後台或者是前台都會使用，我想這已經是現在的趨勢了，然而要安裝這個也相當容易，官方網站都寫的很清楚，可以先使用他們線上的 &lt;a href="http://www.fckeditor.net/demo"&gt;demo&lt;/a&gt;，如果要加入到自己的系統，他們也有提供一些文件讓大家參考：&lt;a href="http://docs.fckeditor.net/"&gt;線上文件&lt;/a&gt;，其實他們支援各大語法：asp，php，Python… 一堆，安裝方法也很容易，底下寫一下安裝方法： 1. 首先先下載 &lt;a href="http://www.fckeditor.net/"&gt;FCKeditor&lt;/a&gt; 這一套軟體： &lt;a href="http://www.fckeditor.net/download"&gt;點我下載&lt;/a&gt; 目前是這個版本：FCKeditor_2.6.3.zip 2. 裡面有一些 sample 可以使用 fckeditor/_samples/default.html 3. 如果你要使用在自己的系統裡面起加入底下語法：&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;$root_path = './';
include($root_path . "fckeditor/fckeditor.php");
$sBasePath = "fckeditor/";

//實體化 FCKeditor 並指定欄位名稱
$oFCKeditor = new FCKeditor('file_data');
$oFCKeditor-&gt;BasePath = $sBasePath;

//預設的語言，zh表繁體中文
$oFCKeditor-&gt;Config['DefaultLanguage'] = 'zh';

//預設填入的內容
$oFCKeditor-&gt;Value = '

&lt;p&gt;
 This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://www.fckeditor.net/"&gt;FCKeditor&lt;/a&gt;.
&lt;/p&gt;' ;

//直接輸出FCKeditor表單
$oFCKeditor-&gt;Create(); &lt;/pre&gt; 基本上這樣大致上就完成了喔。很容易吧</description></item><item><title>[嘉義]國慶煙火影片</title><link>https://blog.wu-boy.com/2008/10/%E5%98%89%E7%BE%A9%E5%9C%8B%E6%85%B6%E7%85%99%E7%81%AB%E5%BD%B1%E7%89%87/</link><pubDate>Sun, 12 Oct 2008 04:06:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/10/%E5%98%89%E7%BE%A9%E5%9C%8B%E6%85%B6%E7%85%99%E7%81%AB%E5%BD%B1%E7%89%87/</guid><description>&lt;p&gt;這是利用小蚊子的相機拍的，大家看看就好，我覺得還不賴，不過現場看更棒 2008.10.10 嘉義國慶煙火 part1 2008.10.10 嘉義國慶煙火 part2&lt;/p&gt;</description></item><item><title>[嘉義美食]陶板屋 和風創作料理，跟老闆還有一堆朋友</title><link>https://blog.wu-boy.com/2008/10/%E5%98%89%E7%BE%A9%E7%BE%8E%E9%A3%9F%E9%99%B6%E6%9D%BF%E5%B1%8B-%E5%92%8C%E9%A2%A8%E5%89%B5%E4%BD%9C%E6%96%99%E7%90%86%EF%BC%8C%E8%B7%9F%E8%80%81%E9%97%86%E9%82%84%E6%9C%89%E4%B8%80%E5%A0%86/</link><pubDate>Sun, 05 Oct 2008 15:40:00 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/10/%E5%98%89%E7%BE%A9%E7%BE%8E%E9%A3%9F%E9%99%B6%E6%9D%BF%E5%B1%8B-%E5%92%8C%E9%A2%A8%E5%89%B5%E4%BD%9C%E6%96%99%E7%90%86%EF%BC%8C%E8%B7%9F%E8%80%81%E9%97%86%E9%82%84%E6%9C%89%E4%B8%80%E5%A0%86/</guid><description>&lt;p&gt;今天呢，老闆請我們到 陶板屋 吃飯喔，因為我是組刊團隊的人，加上吉泰，小孟，增美，還有一個計畫沒接到，但是還是有付出的工作人員，宗翰跟冠吉，下午本來四點開會，結果忘記通知老師，然後我兩點跑去嘉義，在嘉義買福義軒蛋捲，買到時間忘了，3點45分，在嘉義市火車站前面，囧，我看到手機嚇到，我直接飆回中正，然後騎腳踏車到實驗室，總共花費25分鐘，哈哈，超快的，增美都嚇到了，他說我怎麼這麼快阿，基本上嘉義到中正需要半小時，然後宿舍到實驗室需要20分鐘，哈哈，囧，可見我機車很猛吧，最近有把機車操到，哈哈，到實驗室，我以為老闆已經在等我了，結果老闆已經回家了，所以我就跟增美，小孟，吉泰，一起開會了，開完會，我們以為被老師放鴿子了，因為老闆本來要贊助每人400元，我們一人貼150元，就可以去吃，後來老師原來在家裏阿，我跟宗翰就到老師家做老師的車子過去嘉義市，畢竟嘉義在下雨阿，還蠻大的，雖然是一陣一陣的&lt;/p&gt;
&lt;div id="map_address3" style="width: 500px; height: 300px"&gt;
&lt;/div&gt;</description></item><item><title>[AJAX] google map 的應用～</title><link>https://blog.wu-boy.com/2008/10/ajax-google-map-%E7%9A%84%E6%87%89%E7%94%A8%EF%BD%9E/</link><pubDate>Sat, 04 Oct 2008 14:44:02 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/10/ajax-google-map-%E7%9A%84%E6%87%89%E7%94%A8%EF%BD%9E/</guid><description>&lt;p&gt;嗯嗯，我自己的 blog 有在寫美食，就會有美食地點，當然我覺得把 &lt;a href="http://code.google.com/apis/maps/"&gt;google map api&lt;/a&gt; 整合進來，是不錯的方法，其實 google map 也提供了只要輸入地址，就可以直接幫妳對應經度跟緯度的值，這樣就可以利用 ajax 的技術把資料庫裡面的地址都加上 google map 了，至少之前 &lt;a href="http://www.kaoh.com.tw/"&gt;高雄線上&lt;/a&gt; 是這樣加上所有店家資訊的地址 google map，其實要使用 google map 相當容易，其實妳只要按照下面步驟就可以了：&lt;/p&gt;
&lt;ol class="doublespace"&gt;
 &lt;li&gt;
 &lt;a href="http://code.google.com/apis/maps/signup.html"&gt;Sign up for a Google Maps API key.&lt;/a&gt;
 &lt;/li&gt;
 &lt;li&gt;
 Read the &lt;a href="http://code.google.com/apis/maps/documentation/index.html"&gt;Maps API Concepts&lt;/a&gt;.
 &lt;/li&gt;
 &lt;li&gt;
 Check out some &lt;a href="http://code.google.com/apis/maps/documentation/examples/"&gt;Maps API Examples&lt;/a&gt;.
 &lt;/li&gt;
 &lt;li&gt;
 Read the &lt;a href="http://code.google.com/apis/maps/documentation/reference.html"&gt;Maps API Reference&lt;/a&gt;.
 &lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>[PHP]解決 PEAR::Mail_Mime 標題 UTF-8 亂碼問題(不能顯示)</title><link>https://blog.wu-boy.com/2008/10/php%E8%A7%A3%E6%B1%BA-pearmail_mime-%E6%A8%99%E9%A1%8C-utf-8-%E4%BA%82%E7%A2%BC%E5%95%8F%E9%A1%8C%E4%B8%8D%E8%83%BD%E9%A1%AF%E7%A4%BA/</link><pubDate>Wed, 01 Oct 2008 02:17:30 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/10/php%E8%A7%A3%E6%B1%BA-pearmail_mime-%E6%A8%99%E9%A1%8C-utf-8-%E4%BA%82%E7%A2%BC%E5%95%8F%E9%A1%8C%E4%B8%8D%E8%83%BD%E9%A1%AF%E7%A4%BA/</guid><description>&lt;p&gt;話說大家在寫 PHP 的時候，一定會很常用到 mail 這個函式，畢竟一個網站一定會有很多需要用到寄信的地方，我先給大家推薦一下 &lt;a href="http://pear.php.net/package/Mail_Mime"&gt;PEAR::Mail_Mime&lt;/a&gt; 跟 &lt;a href="http://pear.php.net/package/Mail"&gt;PEAR::Mail&lt;/a&gt; 這兩個 Pear 的套件，用起來相當不錯，支援 html 跟 UTF-8 或者是 Big5 編碼，我之前寫過一篇 &lt;a title="Permanent Link to [PHP] 好用的 PEAR - PHP Mail and Mail_Mime" rel="bookmark" href="http://blog.wu-boy.com/2007/12/18/129/"&gt;[PHP] 好用的 PEAR – PHP Mail and Mail_Mime&lt;/a&gt;，裡面寫的還蠻詳細的，不過上次有一個問題還沒解決，就是如果用 UTF-8 編碼的標題，會顯示不出來，&lt;a href="http://mail.google.com"&gt;Gmail&lt;/a&gt; 收到的話就會是 no subject，然後昨天用了一個非常笨的解決方法，改成把標題使用 Big5 就可以了，解決方法如下： &lt;strong&gt;Update：感謝 darkhero 提供解決方法：&lt;/strong&gt; 如果要用 UTF-8 的標題：&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;$param['head_charset'] = 'utf-8';
 $hdrs = array(
 'From' =&gt; 'appleboy.tw@gmail.com',
 'Subject' =&gt; '=?utf8?B?' . base64_encode($subj) . '?=', 
 'Content-type' =&gt; 'text/html; charset=utf-8'
 ); &lt;/pre&gt; 先讓主機支援 PEAR： 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# FreeBSD ports 安裝
cd /usr/ports/devel/pear
make install clean&lt;/pre&gt;</description></item><item><title>[高雄美食]大遠百隔壁 幸福餐桌</title><link>https://blog.wu-boy.com/2008/09/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F%E5%A4%A7%E9%81%A0%E7%99%BE%E9%9A%94%E5%A3%81-%E5%B9%B8%E7%A6%8F%E9%A4%90%E6%A1%8C/</link><pubDate>Sun, 28 Sep 2008 04:59:58 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/09/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F%E5%A4%A7%E9%81%A0%E7%99%BE%E9%9A%94%E5%A3%81-%E5%B9%B8%E7%A6%8F%E9%A4%90%E6%A1%8C/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/2874324489/" title="CIMG0196"&gt;&lt;img src='https://i1.wp.com/farm4.static.flickr.com/3045/2874324489_837304596f.jpg?w=840&amp;#038;ssl=1' hspace='0' vspace='0' border='0' alt='CIMG0196' data-recalc-dims="1" /&gt;&lt;/a&gt; 2008.09.20 這一天呢，跟小蚊子一起出發去吃幸福餐桌，這一家餐廳氣氛不錯，而且生意不錯，底下是幸福餐桌的地點，以及他們的一些店家資訊&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;餐廳名稱：大遠百隔壁 幸福餐桌 地 址：高雄市苓雅區三多四路31號 電 話：(07)3382698 營業時間：AM 11:00 ~ PM 21:00 價位範圍(每人)：200~300 鄰近捷運站：三多捷運站&lt;div id="map_address2" style="width: 500px; height: 300px"&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;</description></item><item><title>[PHP]如何把 Yahoo! BBAuth 加入網站入口認證</title><link>https://blog.wu-boy.com/2008/09/php%E5%A6%82%E4%BD%95%E6%8A%8A-yahoo-bbath-%E5%8A%A0%E5%85%A5%E7%B6%B2%E7%AB%99%E5%85%A5%E5%8F%A3%E8%AA%8D%E8%AD%89/</link><pubDate>Thu, 25 Sep 2008 16:33:49 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/09/php%E5%A6%82%E4%BD%95%E6%8A%8A-yahoo-bbath-%E5%8A%A0%E5%85%A5%E7%B6%B2%E7%AB%99%E5%85%A5%E5%8F%A3%E8%AA%8D%E8%AD%89/</guid><description>&lt;p&gt;最近很紅的一個 &lt;a href="http://tw.developer.yahoo.com/home.html"&gt;Yahoo API&lt;/a&gt;：&lt;a href="http://developer.yahoo.com/auth/"&gt;Browser-Based Authentication&lt;/a&gt;，這是目前蠻多網站開始支援的認證之一，在 &lt;a href="http://blog.xdite.net/"&gt;XDite&lt;/a&gt; 網站看到他們去參加 &lt;a href="http://hackday.ithome.com.tw/yahoo/"&gt;Yahoo Open Hack Day&lt;/a&gt; 的參賽作品：「&lt;a href="http://bingo.handlino.com/"&gt;和多繽紛樂&lt;/a&gt;」&lt;a href="http://blog.xdite.net/?p=709"&gt;XDite 網站說明&lt;/a&gt;，裡面就有提供 &lt;a href="http://openid.net/"&gt;OpenID&lt;/a&gt; 以及 &lt;a href="http://developer.yahoo.com/auth/"&gt;Yahoo BBAuth 登入方式&lt;/a&gt;，等於是說目前你有 Yahoo 帳號或者是 OpenID 的帳號都可以直接進去 &lt;a href="http://bingo.handlino.com/"&gt;和多繽紛樂&lt;/a&gt; 做登入動作，這對於有使用者不使用註冊這麼多網站，也記太多帳號密碼而煩惱，而 &lt;a href="http://developer.yahoo.com/auth/"&gt;Browser-Based Authentication&lt;/a&gt; 也提供了 Single Sign-On (SSO) 給大家使用，底下是大概講解一下 &lt;a href="http://developer.yahoo.com/auth/"&gt;Yahoo BBAuth&lt;/a&gt; 是如何運作： &lt;a href="https://www.flickr.com/photos/10526457@N00/2887916878/" title="bbauth"&gt;&lt;img src="https://i2.wp.com/farm4.static.flickr.com/3119/2887916878_330ea569bb.jpg?w=840&amp;#038;ssl=1" border="0" alt="bbauth" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[美食介紹]高雄旗津美食 – 老店肉羹湯飯麵</title><link>https://blog.wu-boy.com/2008/09/%E7%BE%8E%E9%A3%9F%E4%BB%8B%E7%B4%B9%E9%AB%98%E9%9B%84%E6%97%97%E6%B4%A5%E7%BE%8E%E9%A3%9F-%E8%80%81%E5%BA%97%E8%82%89%E7%BE%B9%E6%B9%AF%E9%A3%AF%E9%BA%B5/</link><pubDate>Mon, 22 Sep 2008 12:36:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/09/%E7%BE%8E%E9%A3%9F%E4%BB%8B%E7%B4%B9%E9%AB%98%E9%9B%84%E6%97%97%E6%B4%A5%E7%BE%8E%E9%A3%9F-%E8%80%81%E5%BA%97%E8%82%89%E7%BE%B9%E6%B9%AF%E9%A3%AF%E9%BA%B5/</guid><description>&lt;p&gt;&lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-7605"&gt;&lt;img src="https://i2.wp.com/pic.wu-boy.com/albums/userpics/10002/normal_CIMG0010%7E5.JPG?w=500" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 這次去高雄旗津坐渡輪，想必去高雄一定就是要搭渡輪過去的阿，離上次去旗津好像是6年前的事情了，這次去就是先去找這一家肉羹店，因為整個旗津都是海產店，都在賣其他東西，我最喜歡吃這個了，我覺得很好吃喔，推薦給大家去吃看看，點一份小的肉羹麵35元 + 一份小的炸肉羹，呼呼，吃起來相當爽 &lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-7608"&gt;&lt;img src="https://i1.wp.com/pic.wu-boy.com/albums/userpics/10002/normal_CIMG0013%7E6.JPG?w=500" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 肉羹麵&lt;/p&gt;</description></item><item><title>[jQuery] AJAX 學習筆記 (一) 如何使用 JSON 驗證使用者表單</title><link>https://blog.wu-boy.com/2008/09/jquery-ajax-%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98-%E4%B8%80-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-json-%E9%A9%97%E8%AD%89%E4%BD%BF%E7%94%A8%E8%80%85%E8%A1%A8%E5%96%AE/</link><pubDate>Mon, 22 Sep 2008 04:09:46 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/09/jquery-ajax-%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98-%E4%B8%80-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-json-%E9%A9%97%E8%AD%89%E4%BD%BF%E7%94%A8%E8%80%85%E8%A1%A8%E5%96%AE/</guid><description>&lt;p&gt;最近開始摸了 &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;，因為自己本身也很想學習，這是目前當紅的技術，許多網站已經開始在使用 jQuery AJAX 了，包含各大入口網站：&lt;a href="http://www.pixnet.net/"&gt;Pixnet 痞客幫&lt;/a&gt;，大家會發現學習 jQuery 好處很多，重點是她將 javascript 整合了，讓你方便使用來讓網站 web 2.0 我想現在很多網站都是朝這個方向去進行了，如果想知道什麼是 AJAX 可以上網查&lt;a href="http://zh.wikipedia.org/wiki/Ajax"&gt;維基百科解釋&lt;/a&gt;，已目前來說，大家都使用javascript 客戶端來取得資料，然而 AJAX 可以從Server端取的資料 show 在使用者端給大家看，底下會大概講解以及實做一個驗證。&lt;/p&gt;</description></item><item><title>老師：『柏毅阿，你要當助教，這讓我很為難阿』</title><link>https://blog.wu-boy.com/2008/09/%E8%80%81%E5%B8%AB%EF%BC%9A%E3%80%8E%E6%9F%8F%E6%AF%85%E9%98%BF%EF%BC%8C%E4%BD%A0%E8%A6%81%E7%95%B6%E5%8A%A9%E6%95%99%EF%BC%8C%E9%80%99%E8%AE%93%E6%88%91%E5%BE%88%E7%82%BA%E9%9B%A3%E9%98%BF%E3%80%8F/</link><pubDate>Tue, 16 Sep 2008 01:34:41 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/09/%E8%80%81%E5%B8%AB%EF%BC%9A%E3%80%8E%E6%9F%8F%E6%AF%85%E9%98%BF%EF%BC%8C%E4%BD%A0%E8%A6%81%E7%95%B6%E5%8A%A9%E6%95%99%EF%BC%8C%E9%80%99%E8%AE%93%E6%88%91%E5%BE%88%E7%82%BA%E9%9B%A3%E9%98%BF%E3%80%8F/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/2845739984/" title="0802234003"&gt;&lt;img src="https://i0.wp.com/farm4.static.flickr.com/3052/2845739984_4470f290de.jpg?w=840&amp;#038;ssl=1" border="0" alt="0802234003" data-recalc-dims="1" /&gt;&lt;/a&gt; 今天老師對我說了一次非常經典的話阿，在我之前還沒上研究所的時候，一直很希望自己如果考上可以當上助教，現在呢，我升上碩二了，滿心期待的就是可以當上助教，然後可以監考，可以當上學弟妹的助教，這是我還蠻一心期待的。&lt;/p&gt;</description></item><item><title>[嘉義美食]福義軒蛋捲</title><link>https://blog.wu-boy.com/2008/09/%E5%98%89%E7%BE%A9%E7%BE%8E%E9%A3%9F%E7%A6%8F%E7%BE%A9%E8%BB%92%E8%9B%8B%E6%8D%B2/</link><pubDate>Mon, 15 Sep 2008 05:21:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/09/%E5%98%89%E7%BE%A9%E7%BE%8E%E9%A3%9F%E7%A6%8F%E7%BE%A9%E8%BB%92%E8%9B%8B%E6%8D%B2/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/2858926944/" title="1135333260"&gt;&lt;img src="https://i2.wp.com/farm3.static.flickr.com/2378/2858926944_80199c45e7.jpg?w=840&amp;#038;ssl=1" border="0" alt="1135333260" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;名稱：福義軒食品廠有限公司 地 址：嘉義市成功街98號(垂楊路上，遠東百貨附近的巷子) 電 話：05-2223107 營業時間：星期一&lt;del&gt;星期六:07:30am&lt;/del&gt;08:00pm，星期日:08:00am~05:00pm 消費方式：蛋捲120/包；副產品95/包以內 &lt;div id="map_address9" style="width: 500px; height: 300px"&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;</description></item><item><title>[生活日記]宗翰幫我照的玫瑰蝦</title><link>https://blog.wu-boy.com/2008/09/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E5%AE%97%E7%BF%B0%E5%B9%AB%E6%88%91%E7%85%A7%E7%9A%84%E7%8E%AB%E7%91%B0%E8%9D%A6/</link><pubDate>Sat, 13 Sep 2008 15:41:20 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/09/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E5%AE%97%E7%BF%B0%E5%B9%AB%E6%88%91%E7%85%A7%E7%9A%84%E7%8E%AB%E7%91%B0%E8%9D%A6/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/2848414372/" title="IMG_0169"&gt;&lt;img src='https://i1.wp.com/farm4.static.flickr.com/3151/2848414372_d10bd77429.jpg?w=840&amp;#038;ssl=1' border='0' alt='IMG_0169' data-recalc-dims="1" /&gt;&lt;/a&gt; 呼呼 照的不錯，還是用普通的相機喔～&lt;/p&gt;</description></item><item><title>[FreeBSD]安裝 apache2 (worker) + PHP5.2.6 + mod_fastcgi + php5-fcgi</title><link>https://blog.wu-boy.com/2008/09/freebsd%E5%AE%89%E8%A3%9D-apache2-worker-php526-mod_fastcgi-php5-fcgi/</link><pubDate>Sat, 13 Sep 2008 12:24:26 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/09/freebsd%E5%AE%89%E8%A3%9D-apache2-worker-php526-mod_fastcgi-php5-fcgi/</guid><description>&lt;p&gt;今天把 &lt;a href="http://www.freebsd.org"&gt;FreeBSD&lt;/a&gt; web 改成了 &lt;a href="http://www.apache.org/"&gt;apache&lt;/a&gt; &lt;a href="http://httpd.apache.org/docs/2.0/mod/worker.html"&gt;worker&lt;/a&gt; 其實之前就已經這麼做了，只是今天加上 mod_fastcgi 我是參考 &lt;a href="http://blog.gslin.org/archives/2008/08/17/1624/"&gt;DarkKiller 大神 apache22 (worker) + mod_fastcgi + php5-fcgi&lt;/a&gt;，之前就把 Server 換成了 php5-fcgi，只不過我是搭配 &lt;a href="http://www.lighttpd.net/"&gt;Lighttpd&lt;/a&gt;，效能方面還不錯，可以參考這篇：&lt;a href="http://blog.wu-boy.com/2008/07/10/291/"&gt;[FreeBSD] Lighttpd + PHP + mod_proxy + FastCGI&lt;/a&gt;，那因為用 &lt;a href="http://www.lighttpd.net/"&gt;lighttpd&lt;/a&gt; 的外掛模組真的太少，不像 apache 支援這麼多 module，重點是還缺少了 .htaccess 這個功能，所以大大降低大家使用 &lt;a href="http://www.lighttpd.net/"&gt;lighttpd&lt;/a&gt;，近期內會把全部 server 換成 apache2 搭配 &lt;a href="http://www.fastcgi.com/"&gt;mod_fastcgi&lt;/a&gt;，那底下寫一下作法了：&lt;/p&gt;</description></item><item><title>[生活日記]2008.09.13 我養的魚缸 玫瑰蝦</title><link>https://blog.wu-boy.com/2008/09/%E7%B6%B2%E8%B7%AF%E7%B5%8420080913-%E6%88%91%E9%A4%8A%E7%9A%84%E9%AD%9A%E7%BC%B8-%E7%8E%AB%E7%91%B0%E8%9D%A6/</link><pubDate>Sat, 13 Sep 2008 06:36:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/09/%E7%B6%B2%E8%B7%AF%E7%B5%8420080913-%E6%88%91%E9%A4%8A%E7%9A%84%E9%AD%9A%E7%BC%B8-%E7%8E%AB%E7%91%B0%E8%9D%A6/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/2850953828/" title="IMG_0247"&gt;&lt;img src='https://i2.wp.com/farm3.static.flickr.com/2151/2850953828_fda3d8c83e.jpg?w=840&amp;#038;ssl=1' border='0' alt='IMG_0247' data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/2850123149/" title="IMG_0249"&gt;&lt;img src='https://i1.wp.com/farm4.static.flickr.com/3236/2850123149_fab8664d8b.jpg?w=840&amp;#038;ssl=1' border='0' alt='IMG_0249' data-recalc-dims="1" /&gt;&lt;/a&gt; 最近幫自己的魚缸整理一下，不過其實都不是我整理的，都是網路組同學幫我處理的，他們是高手，我還不太會弄缸，自己有一次差點害玫瑰蝦全死倒缸，不過後來靠宗翰跟小陳贊助東西之下，整個魚缸又復活了，不過還是沒改變，現在又開始很多螺跑出來了，真不知道該怎麼解決，底下是我整個魚缸全景 2008.09.12 我的魚缸全景&lt;/p&gt;</description></item><item><title>[中正]今天學校身體檢查</title><link>https://blog.wu-boy.com/2008/09/%E4%B8%AD%E6%AD%A3%E4%BB%8A%E5%A4%A9%E5%AD%B8%E6%A0%A1%E8%BA%AB%E9%AB%94%E6%AA%A2%E6%9F%A5/</link><pubDate>Wed, 10 Sep 2008 14:20:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/09/%E4%B8%AD%E6%AD%A3%E4%BB%8A%E5%A4%A9%E5%AD%B8%E6%A0%A1%E8%BA%AB%E9%AB%94%E6%AA%A2%E6%9F%A5/</guid><description>&lt;p&gt;原本昨天早上要去體檢的，後來睡過頭，加上事情很多，就沒去了，所以今天早上匆匆忙忙的爬起來，昨天晚上太晚睡了，今天起床去體檢，發現太多人了，所以先去抽血加上弄尿瓶，弄好又馬上趕去lab定便當，因為中午要開會阿，一整個很忙，然後中午跟老師開會開到兩點，然後又跑去體檢，裡面的阿姨還說，我早上不是看過妳了，你怎麼又來了，都是該死的一堆新生，怎麼那麼多人，終於體檢好了，花費550，我在抽血的時候，那個小姐摸我的手，一整個很冰，然後他以為我很緊張，後來我跟他說，我每年都來，哈哈，抽血還跟他聊天呢，爽，證明一下我不會怕抽血，哈哈，量身高體重呢，本人非常的矮，從以前到現在都是這個身高，好像沒變過&lt;/p&gt;</description></item><item><title>[轉貼][教學] Windows 2003的操作設定</title><link>https://blog.wu-boy.com/2008/09/%E8%BD%89%E8%B2%BC%E6%95%99%E5%AD%B8-windows-2003%E7%9A%84%E6%93%8D%E4%BD%9C%E8%A8%AD%E5%AE%9A/</link><pubDate>Sun, 07 Sep 2008 05:16:58 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/09/%E8%BD%89%E8%B2%BC%E6%95%99%E5%AD%B8-windows-2003%E7%9A%84%E6%93%8D%E4%BD%9C%E8%A8%AD%E5%AE%9A/</guid><description>&lt;p&gt;因為很常玩 Windows 2003 Server 版，所以找一些教學，來看看，把一些比較不好的功能拿掉，文章如下了 轉貼自： &lt;a href="http://forum.shareget.com/t72891/"&gt;http://forum.shareget.com/t72891/&lt;/a&gt; ========================================================== 本文的目的是將Windows Server 2003改造成一般使用者也能輕鬆使用的XP介面。 先聲明，Windows Server 2003目前對軟體及驅動程式的支援性是一個很大 的問題。所以我不建議一般的使用者安裝Win2003，費了一番功夫只換來一 個相容性差的XP，投資報酬率似乎有點低。 (目前手邊的軟體已知有Dr.eye 2002跟PartitionMagic v8.0無法使用)&lt;/p&gt;</description></item><item><title>[心得]2008八月份 SA@Tainan PHP 程式設計 – 初階資訊安全(8/30)</title><link>https://blog.wu-boy.com/2008/08/%E5%BF%83%E5%BE%972008%E5%85%AB%E6%9C%88%E4%BB%BD-satainan-php-%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88-%E5%88%9D%E9%9A%8E%E8%B3%87%E8%A8%8A%E5%AE%89%E5%85%A8830/</link><pubDate>Sat, 30 Aug 2008 16:07:13 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/08/%E5%BF%83%E5%BE%972008%E5%85%AB%E6%9C%88%E4%BB%BD-satainan-php-%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88-%E5%88%9D%E9%9A%8E%E8%B3%87%E8%A8%8A%E5%AE%89%E5%85%A8830/</guid><description>&lt;p&gt;今天從嘉義跑到台南聽 &lt;a href="http://phorum.study-area.org"&gt;酷！學園&lt;/a&gt; 舉辦的 &lt;a href="http://phorum.study-area.org/index.php/topic,53191.0.html"&gt;2008八月份 SA@Tainan PHP 程式設計 – 初階資訊安全(8/30)&lt;/a&gt; ，今天一大早就起床了，差點沒趕上火車，到了台南地點在社區大學，其實蠻近的，大概騎車5分鐘就到了喔，其實不會很趕，到了現場，第一次看到梁楓大大阿，感覺很有威勢，我看現場年齡層分佈好像很廣，有很多都是長輩了，不過大部分還是學生為主，然後我想大概有很多是工作人員，其實我都不太認識，我大概只知道梁楓大大，因為在酷！學園也一段時間了，哈哈，今天講的主題，我非常的有興趣，我看投影片還蠻多的，可是都是跳著講，然後一些實做的部份，然後最後一小時是在解如何拿到 Linux 的主機 /etc/passwd 的資訊。&lt;/p&gt;</description></item><item><title>[中正大學]碩博士論文系統 Ethesys2.1 系統建置</title><link>https://blog.wu-boy.com/2008/08/%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E7%A2%A9%E5%8D%9A%E5%A3%AB%E8%AB%96%E6%96%87%E7%B3%BB%E7%B5%B1-ethesys21-%E7%B3%BB%E7%B5%B1%E5%BB%BA%E7%BD%AE/</link><pubDate>Fri, 29 Aug 2008 12:28:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/08/%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E7%A2%A9%E5%8D%9A%E5%A3%AB%E8%AB%96%E6%96%87%E7%B3%BB%E7%B5%B1-ethesys21-%E7%B3%BB%E7%B5%B1%E5%BB%BA%E7%BD%AE/</guid><description>&lt;p&gt;之前幫學校轉移校內碩博士論文系統，學校是用 &lt;a href="http://ethesys.lib.nsysu.edu.tw/"&gt;Ethesys&lt;/a&gt; 這一套之前是中山大學在負責維護，可是到2006年8月以後，中山大學團隊不再提供eThesys的諮詢服務，改由 &lt;a href="http://www.tbmc.com.tw/"&gt;漢珍數位圖書公司&lt;/a&gt; 負責維護eThesys 2.1，仍將提供免費原始碼下載和安裝諮詢，詳細情形請看：&lt;a href="http://ethesys.lib.nsysu.edu.tw/code.shtml"&gt;eThesys 2.1 原始碼取得方式&lt;/a&gt;，不過話說漢珍數位圖書公司，我有寄信過去，有沒得到回應，真的有點 XXXX，他也不提供1.x版升級到2.1版的 update 說明，然後在安裝過程，因為用到 MySQL，裡面還有一些問題要自己 debug，所以沒有一些基礎，可能會花比較多時間下去裝，我是用 FreeBSD 系統 7.0 Release 版本，寫了說明書給學校，不過有些比較細節的步驟好像沒有補上，因為忘記了 XD，提供下載連結：&lt;a href="http://blog.wu-boy.com/wp-content/uploads/2008/08/ethesys21-e7b3bbe7b5b1e5bbbae7bdaee8aaaae6988ee69bb8.pdf"&gt;Ethesys2.1 系統建置說明書&lt;/a&gt;，大家可以看看。&lt;/p&gt;</description></item><item><title>[投影片]給中正網路組學弟妹的 Linux 教育訓練投影片</title><link>https://blog.wu-boy.com/2008/08/%E6%8A%95%E5%BD%B1%E7%89%87%E7%B5%A6%E4%B8%AD%E6%AD%A3%E7%B6%B2%E8%B7%AF%E7%B5%84%E5%AD%B8%E5%BC%9F%E5%A6%B9%E7%9A%84-linux-%E6%95%99%E8%82%B2%E8%A8%93%E7%B7%B4%E6%8A%95%E5%BD%B1%E7%89%87/</link><pubDate>Tue, 26 Aug 2008 16:53:44 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/08/%E6%8A%95%E5%BD%B1%E7%89%87%E7%B5%A6%E4%B8%AD%E6%AD%A3%E7%B6%B2%E8%B7%AF%E7%B5%84%E5%AD%B8%E5%BC%9F%E5%A6%B9%E7%9A%84-linux-%E6%95%99%E8%82%B2%E8%A8%93%E7%B7%B4%E6%8A%95%E5%BD%B1%E7%89%87/</guid><description>&lt;p&gt;嗯嗯，上禮拜給中正大學通訊系網路組學弟上 Linux 系統的一些教學，那底下是我給他們上課的投影片，基本上比較注重指令的部份，還有一些管線的指令，希望他們聽的懂阿，13張投影片，我講了一小時15分鐘，有點久，表達的不是很好&lt;/p&gt;
&lt;iframe src="//www.slideshare.net/slideshow/embed_code/key/enLNKHxR3dRYt5" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen&gt; &lt;/iframe&gt; &lt;div style="margin-bottom:5px"&gt; &lt;strong&gt; &lt;a href="//www.slideshare.net/appleboy/linux-presentation" title="Linux 教育訓練" target="_blank"&gt;Linux 教育訓練&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href="https://www.slideshare.net/appleboy" target="_blank"&gt;Bo-Yi Wu&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;</description></item><item><title>FreeBSD 的 security patch 跟 如何 upgrade</title><link>https://blog.wu-boy.com/2008/08/freebsd-%E7%9A%84-security-patch-%E8%B7%9F-%E5%A6%82%E4%BD%95-upgrade/</link><pubDate>Tue, 26 Aug 2008 09:38:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/08/freebsd-%E7%9A%84-security-patch-%E8%B7%9F-%E5%A6%82%E4%BD%95-upgrade/</guid><description>&lt;p&gt;剛剛看到 &lt;a href="http://chinsan2.twbbs.org"&gt;chinsan’s Blog&lt;/a&gt; 裡面提到 &lt;a href="http://chinsan2.twbbs.org/wp/2008/08/26/106/"&gt;關於 FreeBSD 的 security patch 是怎麼處理的?&lt;/a&gt;，這篇寫的非常不錯，所以順道把手上機器都全部處理了 upgrade 系統了，當然首先是要先習慣閱讀 &lt;a href="http://www.freebsd.org/cgi/cvsweb.cgi/src/UPDATING"&gt;/usr/src/UPDATING&lt;/a&gt; 跟 &lt;a href="http://www.freebsd.org/cgi/cvsweb.cgi/ports/UPDATING"&gt;/usr/ports/UPDATING&lt;/a&gt;，當然這兩個其中一個是系統的安全性更新，一個是 ports tree 安全性更新。 裡面 chinsan 大大提到的 SA(Security Advisories)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://www.freebsd.org/security/advisories.html"&gt;http://www.freebsd.org/security/advisories.html&lt;/a&gt; 相關反應管道請參考 &lt;a href="http://security.freebsd.org"&gt;http://security.freebsd.org&lt;/a&gt; 這裡的 SA 其實也可以在 &lt;a href="http://www.freebsd.org/cgi/cvsweb.cgi/src/UPDATING"&gt;/usr/src/UPDATING&lt;/a&gt; 這裡面看到，但是網頁版似乎比較好，我提供解法，做起來也不會很困難。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[轉載]MySQL 的 “SET NAMES xxx” 字元編碼問題分析</title><link>https://blog.wu-boy.com/2008/08/%E8%BD%89%E8%BC%89mysql-%E7%9A%84-set-names-xxx-%E5%AD%97%E5%85%83%E7%B7%A8%E7%A2%BC%E5%95%8F%E9%A1%8C%E5%88%86%E6%9E%90/</link><pubDate>Mon, 25 Aug 2008 10:02:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/08/%E8%BD%89%E8%BC%89mysql-%E7%9A%84-set-names-xxx-%E5%AD%97%E5%85%83%E7%B7%A8%E7%A2%BC%E5%95%8F%E9%A1%8C%E5%88%86%E6%9E%90/</guid><description>&lt;p&gt;轉載自: &lt;a href="http://www.phpchina.com/bbs/viewthread.php?tid=13861"&gt;PHPChina&lt;/a&gt; 近來接受 BBT 的培訓，做一個投票系統。系統程式碼倒不是很難，但是我的時間主要花費在了研究字符集和編碼上面。MySQL 和 Apache 兩個系統的編碼（字符集）問題讓我費勁腦筋，吃盡苦頭。網上對這些問題的解決比較零散，比較片面，大部分是提供解決方法，卻不說為什麼。於是我將這幾天收穫總結一下，避免後來者再走彎路。這篇文章對 PHP 編寫有一點幫助（看完你就知道，怎樣讓你的 PHP 程式在大部分空間提供商的伺服器裡顯示正常），但是更多幫助在於網路伺服器的架設和設置。 先說 MySQL 的字符集問題。Windows 下可透過修改 my.ini 內的&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# CLIENT SECTION
[mysql]
default-character-set=utf8
# SERVER SECTION
[mysqld]
default-character-set=utf8&lt;/pre&gt;</description></item><item><title>[高雄美食]IKEA 宜家家俱 瑞典美食餐點 food</title><link>https://blog.wu-boy.com/2008/08/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9Fikea-%E5%AE%9C%E5%AE%B6%E5%AE%B6%E4%BF%B1-%E7%91%9E%E5%85%B8%E7%BE%8E%E9%A3%9F%E9%A4%90%E9%BB%9E-food/</link><pubDate>Mon, 25 Aug 2008 04:13:14 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/08/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9Fikea-%E5%AE%9C%E5%AE%B6%E5%AE%B6%E4%BF%B1-%E7%91%9E%E5%85%B8%E7%BE%8E%E9%A3%9F%E9%A4%90%E9%BB%9E-food/</guid><description>&lt;p&gt;&lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-8668"&gt;&lt;img src="https://i0.wp.com/pic.wu-boy.com/albums/userpics/10002/normal_CIMG0019%7E9.JPG?w=500" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 上面這張圖是瑞典美食小肉丸喔，沒記錯價錢的話，大概是15顆139元，那邊其實很多餐點可以點，但是那天太晚去了，剩下德國豬腳跟瑞典美食小肉丸，這兩樣而已&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;餐廳名稱：IKEA 宜家家俱 瑞典美食 地 址：高雄市中華五路1201號 電 話：(07)5377688 營業時間：AM 10:00 ~ PM 22:00 價位範圍(每人)：100~200 網頁：&lt;a href="http://www.ikea.com.tw"&gt;http://www.ikea.com.tw&lt;/a&gt; &lt;div id="map_address2" style="width: 500px; height: 300px"&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;</description></item><item><title>[無名小站]利用unix指令 wget 抓取 wretch 圖檔</title><link>https://blog.wu-boy.com/2008/08/%E7%84%A1%E5%90%8D%E5%B0%8F%E7%AB%99%E5%88%A9%E7%94%A8unix%E6%8C%87%E4%BB%A4-wget-%E6%8A%93%E5%8F%96-wretch-%E5%9C%96%E6%AA%94/</link><pubDate>Sat, 23 Aug 2008 04:43:03 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/08/%E7%84%A1%E5%90%8D%E5%B0%8F%E7%AB%99%E5%88%A9%E7%94%A8unix%E6%8C%87%E4%BB%A4-wget-%E6%8A%93%E5%8F%96-wretch-%E5%9C%96%E6%AA%94/</guid><description>&lt;p&gt;囧～其實用 wget 就可以迅速抓到 &lt;a href="http://www.wretch.cc/"&gt;無名小站&lt;/a&gt; 的圖放到自己的伺服器上面，當然之前 &lt;a href="http://www.ptt.cc"&gt;ptt&lt;/a&gt; 的 php 版也有提供利用 curl 的方式來抓取圖，但是還要另寫另一隻讀圖程式，程式碼如下： 感謝 tsangbor＠ptt.cc 提供 DEMO: &lt;a href="http://download.easygame.com.tw/get"&gt;http://download.easygame.com.tw/get&lt;/a&gt;_wretch_img.php 輸入框請輸入 無名網友的相本 如： &lt;a href="http://www.wretch.cc/album/album.php?id=qsplmiki&amp;amp;book=130"&gt;http://www.wretch.cc/album/album.php?id=qsplmiki&amp;amp;book=130&lt;/a&gt; 程式碼：&lt;/p&gt;</description></item><item><title>[中正]2008.08.21 剪頭髮</title><link>https://blog.wu-boy.com/2008/08/%E4%B8%AD%E6%AD%A320080821-%E5%89%AA%E9%A0%AD%E9%AB%AE/</link><pubDate>Sat, 23 Aug 2008 03:10:41 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/08/%E4%B8%AD%E6%AD%A320080821-%E5%89%AA%E9%A0%AD%E9%AB%AE/</guid><description>&lt;p&gt;這次我又在中正大學學校對面南大門那邊剪頭髮了，因為自己也已經很習慣那邊的剪髮，那邊剪髮品質跟高雄的成功路一間理髮店”豔”剪起來差沒多少，因為我爸媽是這麼認為啦，所以先來看看我剪得樣子&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/2787813393/" title="0820191020"&gt;&lt;img src='https://i2.wp.com/static.flickr.com/3069/2787813393_0b5c786dcf.jpg?w=840' hspace='0' vspace='0' border='0' alt='0820191020' data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[教學]網頁簡體繁體轉換程式(Google AJAX Language API)</title><link>https://blog.wu-boy.com/2008/08/%E6%95%99%E5%AD%B8%E7%B6%B2%E9%A0%81%E7%B0%A1%E9%AB%94%E7%B9%81%E9%AB%94%E8%BD%89%E6%8F%9B%E7%A8%8B%E5%BC%8Fgoogle-ajax-language-api/</link><pubDate>Thu, 14 Aug 2008 09:14:42 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/08/%E6%95%99%E5%AD%B8%E7%B6%B2%E9%A0%81%E7%B0%A1%E9%AB%94%E7%B9%81%E9%AB%94%E8%BD%89%E6%8F%9B%E7%A8%8B%E5%BC%8Fgoogle-ajax-language-api/</guid><description>&lt;p&gt;在 &lt;a href="http://www.ptt.cc"&gt;PTT&lt;/a&gt; PHP 版看到一篇：&lt;a href="http://www.ptt.cc/bbs/PHP/M.1218595508.A.8C4.html"&gt;[請益]簡體字轉繁體字的方法&lt;/a&gt;，然後裡面其實有推文說可以用看看 &lt;a href="http://code.google.com/apis/ajaxlanguage/documentation/"&gt;Google AJAX Language API&lt;/a&gt;，然後我自己去測試，發現只要文字一多，&lt;a href="http://www.google.com"&gt;google&lt;/a&gt; 就轉換不出來了，就會出現無效果，我自己也回一篇 &lt;a href="http://www.ptt.cc/bbs/PHP/M.1218697288.A.440.html"&gt;Re: [請益]簡體字轉繁體字的方法&lt;/a&gt;，其實問題出在哪裡，我也不確定，這可能要問 &lt;a href="http://www.google.com"&gt;google&lt;/a&gt; 了，不然 google 提供的這個還蠻方便的，可以即時整合到網站裡面。 &lt;strong&gt;update：google API 不能用的原因，就是轉換的字數超過限制&lt;/strong&gt; 嗯嗯，後來改用&lt;a href="http://www.twvbb.com/vbb/thread/24/572/2/"&gt;【原創】深藍UTF-8正體簡體轉換函數 1.0&lt;/a&gt; 裡面這套 VBB 系統提供的簡體繁體轉換，大概看一下原始碼，就可以使用了，不會很難，只要在網頁 header 端加上：&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;// *by markhsu@twvbb.com *feel free to redistrub under GNU argeement
// *mozilla fix by danix@aniarc.org on Aug 27, 2005 *rev 1.2
var charPYStr = new String("啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸尽劲荆兢觉决诀绝均菌钧军君峻俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座"); 
var ftPYStr = new String("啊阿埃挨哎唉哀皚癌藹矮艾礙愛隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翺襖傲奧懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙壩霸罷爸白柏百擺佰敗拜稗斑班搬扳般頒板版扮拌伴瓣半辦絆邦幫梆榜膀綁棒磅蚌鎊傍謗苞胞包褒剝薄雹保堡飽寶抱報暴豹鮑爆杯碑悲卑北輩背貝鋇倍狽備憊焙被奔苯本笨崩繃甭泵蹦迸逼鼻比鄙筆彼碧蓖蔽畢斃毖幣庇痹閉敝弊必辟壁臂避陛鞭邊編貶扁便變卞辨辯辮遍標彪膘表鼈憋別癟彬斌瀕濱賓擯兵冰柄丙秉餅炳病並玻菠播撥缽波博勃搏鉑箔伯帛舶脖膊渤泊駁捕蔔哺補埠不布步簿部怖擦猜裁材才財睬踩采彩菜蔡餐參蠶殘慚慘燦蒼艙倉滄藏操糙槽曹草廁策側冊測層蹭插叉茬茶查碴搽察岔差詫拆柴豺攙摻蟬饞讒纏鏟産闡顫昌猖場嘗常長償腸廠敞暢唱倡超抄鈔朝嘲潮巢吵炒車扯撤掣徹澈郴臣辰塵晨忱沈陳趁襯撐稱城橙成呈乘程懲澄誠承逞騁秤吃癡持匙池遲弛馳恥齒侈尺赤翅斥熾充沖蟲崇寵抽酬疇躊稠愁籌仇綢瞅醜臭初出櫥廚躇鋤雛滁除楚礎儲矗搐觸處揣川穿椽傳船喘串瘡窗幢床闖創吹炊捶錘垂春椿醇唇淳純蠢戳綽疵茨磁雌辭慈瓷詞此刺賜次聰蔥囪匆從叢湊粗醋簇促躥篡竄摧崔催脆瘁粹淬翠村存寸磋撮搓措挫錯搭達答瘩打大呆歹傣戴帶殆代貸袋待逮怠耽擔丹單鄲撣膽旦氮但憚淡誕彈蛋當擋黨蕩檔刀搗蹈倒島禱導到稻悼道盜德得的蹬燈登等瞪凳鄧堤低滴迪敵笛狄滌翟嫡抵底地蒂第帝弟遞締顛掂滇碘點典靛墊電佃甸店惦奠澱殿碉叼雕凋刁掉吊釣調跌爹碟蝶叠諜疊丁盯叮釘頂鼎錠定訂丟東冬董懂動棟侗恫凍洞兜抖鬥陡豆逗痘都督毒犢獨讀堵睹賭杜鍍肚度渡妒端短鍛段斷緞堆兌隊對墩噸蹲敦頓囤鈍盾遁掇哆多奪垛躲朵跺舵剁惰墮蛾峨鵝俄額訛娥惡厄扼遏鄂餓恩而兒耳爾餌洱二貳發罰筏伐乏閥法琺藩帆番翻樊礬釩繁凡煩反返範販犯飯泛坊芳方肪房防妨仿訪紡放菲非啡飛肥匪誹吠肺廢沸費芬酚吩氛分紛墳焚汾粉奮份忿憤糞豐封楓蜂峰鋒風瘋烽逢馮縫諷奉鳳佛否夫敷膚孵扶拂輻幅氟符伏俘服浮涪福袱弗甫撫輔俯釜斧脯腑府腐赴副覆賦複傅付阜父腹負富訃附婦縛咐噶嘎該改概鈣蓋溉幹甘杆柑竿肝趕感稈敢贛岡剛鋼缸肛綱崗港杠篙臯高膏羔糕搞鎬稿告哥歌擱戈鴿胳疙割革葛格蛤閣隔鉻個各給根跟耕更庚羹埂耿梗工攻功恭龔供躬公宮弓鞏汞拱貢共鈎勾溝苟狗垢構購夠辜菇咕箍估沽孤姑鼓古蠱骨谷股故顧固雇刮瓜剮寡挂褂乖拐怪棺關官冠觀管館罐慣灌貫光廣逛瑰規圭矽歸龜閨軌鬼詭癸桂櫃跪貴劊輥滾棍鍋郭國果裹過哈骸孩海氦亥害駭酣憨邯韓含涵寒函喊罕翰撼捍旱憾悍焊汗漢夯杭航壕嚎豪毫郝好耗號浩呵喝荷菏核禾和何合盒貉閡河涸赫褐鶴賀嘿黑痕很狠恨哼亨橫衡恒轟哄烘虹鴻洪宏弘紅喉侯猴吼厚候後呼乎忽瑚壺葫胡蝴狐糊湖弧虎唬護互滬戶花嘩華猾滑畫劃化話槐徊懷淮壞歡環桓還緩換患喚瘓豢煥渙宦幻荒慌黃磺蝗簧皇凰惶煌晃幌恍謊灰揮輝徽恢蛔回毀悔慧卉惠晦賄穢會燴彙諱誨繪葷昏婚魂渾混豁活夥火獲或惑霍貨禍擊圾基機畸稽積箕肌饑迹激譏雞姬績緝吉極棘輯籍集及急疾汲即嫉級擠幾脊己薊技冀季伎祭劑悸濟寄寂計記既忌際繼紀嘉枷夾佳家加莢頰賈甲鉀假稼價架駕嫁殲監堅尖箋間煎兼肩艱奸緘繭檢柬堿鹼揀撿簡儉剪減薦檻鑒踐賤見鍵箭件健艦劍餞漸濺澗建僵姜將漿江疆蔣槳獎講匠醬降蕉椒礁焦膠交郊澆驕嬌嚼攪鉸矯僥腳狡角餃繳絞剿教酵轎較叫窖揭接皆稭街階截劫節莖睛晶鯨京驚精粳經井警景頸靜境敬鏡徑痙靖竟競淨炯窘揪究糾玖韭久灸九酒廄救舊臼舅咎就疚鞠拘狙疽居駒菊局咀矩舉沮聚拒據巨具距踞鋸俱句懼炬劇捐鵑娟倦眷卷絹撅攫抉掘倔爵桔傑捷睫竭潔結解姐戒藉芥界借介疥誡屆巾筋斤金今津襟緊錦僅謹進靳晉禁近燼浸盡勁荊兢覺決訣絕均菌鈞軍君峻俊竣浚郡駿喀咖卡咯開揩楷凱慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕顆科殼咳可渴克刻客課肯啃墾懇坑吭空恐孔控摳口扣寇枯哭窟苦酷庫褲誇垮挎跨胯塊筷儈快寬款匡筐狂框礦眶曠況虧盔巋窺葵奎魁傀饋愧潰坤昆捆困括擴廓闊垃拉喇蠟臘辣啦萊來賴藍婪欄攔籃闌蘭瀾讕攬覽懶纜爛濫琅榔狼廊郎朗浪撈勞牢老佬姥酪烙澇勒樂雷鐳蕾磊累儡壘擂肋類淚棱楞冷厘梨犁黎籬狸離漓理李裏鯉禮莉荔吏栗麗厲勵礫曆利傈例俐痢立粒瀝隸力璃哩倆聯蓮連鐮廉憐漣簾斂臉鏈戀煉練糧涼梁粱良兩輛量晾亮諒撩聊僚療燎寥遼潦了撂鐐廖料列裂烈劣獵琳林磷霖臨鄰鱗淋凜賃吝拎玲菱零齡鈴伶羚淩靈陵嶺領另令溜琉榴硫餾留劉瘤流柳六龍聾嚨籠窿隆壟攏隴樓婁摟簍漏陋蘆盧顱廬爐擄鹵虜魯麓碌露路賂鹿潞祿錄陸戮驢呂鋁侶旅履屢縷慮氯律率濾綠巒攣孿灤卵亂掠略掄輪倫侖淪綸論蘿螺羅邏鑼籮騾裸落洛駱絡媽麻瑪碼螞馬罵嘛嗎埋買麥賣邁脈瞞饅蠻滿蔓曼慢漫謾芒茫盲氓忙莽貓茅錨毛矛鉚卯茂冒帽貌貿麽玫枚梅酶黴煤沒眉媒鎂每美昧寐妹媚門悶們萌蒙檬盟錳猛夢孟眯醚靡糜迷謎彌米秘覓泌蜜密冪棉眠綿冕免勉娩緬面苗描瞄藐秒渺廟妙蔑滅民抿皿敏憫閩明螟鳴銘名命謬摸摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌謀牟某拇牡畝姆母墓暮幕募慕木目睦牧穆拿哪呐鈉那娜納氖乃奶耐奈南男難囊撓腦惱鬧淖呢餒內嫩能妮霓倪泥尼擬你匿膩逆溺蔫拈年碾攆撚念娘釀鳥尿捏聶孽齧鑷鎳涅您檸獰凝甯擰濘牛扭鈕紐膿濃農弄奴努怒女暖虐瘧挪懦糯諾哦歐鷗毆藕嘔偶漚啪趴爬帕怕琶拍排牌徘湃派攀潘盤磐盼畔判叛乓龐旁耪胖抛咆刨炮袍跑泡呸胚培裴賠陪配佩沛噴盆砰抨烹澎彭蓬棚硼篷膨朋鵬捧碰坯砒霹批披劈琵毗啤脾疲皮匹痞僻屁譬篇偏片騙飄漂瓢票撇瞥拼頻貧品聘乒坪蘋萍平憑瓶評屏坡潑頗婆破魄迫粕剖撲鋪仆莆葡菩蒲埔樸圃普浦譜曝瀑期欺棲戚妻七淒漆柒沏其棋奇歧畦崎臍齊旗祈祁騎起豈乞企啓契砌器氣迄棄汽泣訖掐洽牽扡釺鉛千遷簽仟謙乾黔錢鉗前潛遣淺譴塹嵌欠歉槍嗆腔羌牆薔強搶橇鍬敲悄橋瞧喬僑巧鞘撬翹峭俏竅切茄且怯竊欽侵親秦琴勤芹擒禽寢沁青輕氫傾卿清擎晴氰情頃請慶瓊窮秋丘邱球求囚酋泅趨區蛆曲軀屈驅渠取娶齲趣去圈顴權醛泉全痊拳犬券勸缺炔瘸卻鵲榷確雀裙群然燃冉染瓤壤攘嚷讓饒擾繞惹熱壬仁人忍韌任認刃妊紉扔仍日戎茸蓉榮融熔溶容絨冗揉柔肉茹蠕儒孺如辱乳汝入褥軟阮蕊瑞銳閏潤若弱撒灑薩腮鰓塞賽三三傘散桑嗓喪搔騷掃嫂瑟色澀森僧莎砂殺刹沙紗傻啥煞篩曬珊苫杉山刪煽衫閃陝擅贍膳善汕扇繕墒傷商賞晌上尚裳梢捎稍燒芍勺韶少哨邵紹奢賒蛇舌舍赦攝射懾涉社設砷申呻伸身深娠紳神沈審嬸甚腎慎滲聲生甥牲升繩省盛剩勝聖師失獅施濕詩屍虱十石拾時什食蝕實識史矢使屎駛始式示士世柿事拭誓逝勢是嗜噬適仕侍釋飾氏市恃室視試收手首守壽授售受瘦獸蔬樞梳殊抒輸叔舒淑疏書贖孰熟薯暑曙署蜀黍鼠屬術述樹束戍豎墅庶數漱恕刷耍摔衰甩帥栓拴霜雙爽誰水睡稅吮瞬順舜說碩朔爍斯撕嘶思私司絲死肆寺嗣四伺似飼巳松聳慫頌送宋訟誦搜艘擻嗽蘇酥俗素速粟僳塑溯宿訴肅酸蒜算雖隋隨綏髓碎歲穗遂隧祟孫損筍蓑梭唆縮瑣索鎖所塌他它她塔獺撻蹋踏胎苔擡台泰酞太態汰坍攤貪癱灘壇檀痰潭譚談坦毯袒碳探歎炭湯塘搪堂棠膛唐糖倘躺淌趟燙掏濤滔縧萄桃逃淘陶討套特藤騰疼謄梯剔踢銻提題蹄啼體替嚏惕涕剃屜天添填田甜恬舔腆挑條迢眺跳貼鐵帖廳聽烴汀廷停亭庭挺艇通桐酮瞳同銅彤童桶捅筒統痛偷投頭透凸禿突圖徒途塗屠土吐兔湍團推頹腿蛻褪退吞屯臀拖托脫鴕陀馱駝橢妥拓唾挖哇蛙窪娃瓦襪歪外豌彎灣玩頑丸烷完碗挽晚皖惋宛婉萬腕汪王亡枉網往旺望忘妄威巍微危韋違桅圍唯惟爲濰維葦萎委偉僞尾緯未蔚味畏胃喂魏位渭謂尉慰衛瘟溫蚊文聞紋吻穩紊問嗡翁甕撾蝸渦窩我斡臥握沃巫嗚鎢烏汙誣屋無蕪梧吾吳毋武五捂午舞伍侮塢戊霧晤物勿務悟誤昔熙析西硒矽晰嘻吸錫犧稀息希悉膝夕惜熄烯溪汐犀檄襲席習媳喜銑洗係隙戲細瞎蝦匣霞轄暇峽俠狹下廈夏嚇掀鍁先仙鮮纖鹹賢銜舷閑涎弦嫌顯險現獻縣腺餡羨憲陷限線相廂鑲香箱襄湘鄉翔祥詳想響享項巷橡像向象蕭硝霄削哮囂銷消宵淆曉小孝校肖嘯笑效楔些歇蠍鞋協挾攜邪斜脅諧寫械卸蟹懈泄瀉謝屑薪芯鋅欣辛新忻心信釁星腥猩惺興刑型形邢行醒幸杏性姓兄凶胸匈洶雄熊休修羞朽嗅鏽秀袖繡墟戌需虛噓須徐許蓄酗敘旭序畜恤絮婿緒續軒喧宣懸旋玄選癬眩絢靴薛學穴雪血勳熏循旬詢尋馴巡殉汛訓訊遜迅壓押鴉鴨呀丫芽牙蚜崖衙涯雅啞亞訝焉咽閹煙淹鹽嚴研蜒岩延言顔閻炎沿奄掩眼衍演豔堰燕厭硯雁唁彥焰宴諺驗殃央鴦秧楊揚佯瘍羊洋陽氧仰癢養樣漾邀腰妖瑤搖堯遙窯謠姚咬舀藥要耀椰噎耶爺野冶也頁掖業葉曳腋夜液一壹醫揖銥依伊衣頤夷遺移儀胰疑沂宜姨彜椅蟻倚已乙矣以藝抑易邑屹億役臆逸肄疫亦裔意毅憶義益溢詣議誼譯異翼翌繹茵蔭因殷音陰姻吟銀淫寅飲尹引隱印英櫻嬰鷹應纓瑩螢營熒蠅迎贏盈影穎硬映喲擁傭臃癰庸雍踴蛹詠泳湧永恿勇用幽優悠憂尤由郵鈾猶油遊酉有友右佑釉誘又幼迂淤於盂榆虞愚輿余俞逾魚愉渝漁隅予娛雨與嶼禹宇語羽玉域芋郁籲遇喻峪禦愈欲獄育譽浴寓裕預豫馭鴛淵冤元垣袁原援轅園員圓猿源緣遠苑願怨院曰約越躍鑰嶽粵月悅閱耘雲鄖勻隕允運蘊醞暈韻孕匝砸雜栽哉災宰載再在咱攢暫贊贓髒葬遭糟鑿藻棗早澡蚤躁噪造皂竈燥責擇則澤賊怎增憎曾贈紮喳渣劄軋鍘閘眨柵榨咋乍炸詐摘齋宅窄債寨瞻氈詹粘沾盞斬輾嶄展蘸棧占戰站湛綻樟章彰漳張掌漲杖丈帳賬仗脹瘴障招昭找沼趙照罩兆肇召遮折哲蟄轍者鍺蔗這浙珍斟真甄砧臻貞針偵枕疹診震振鎮陣蒸掙睜征猙爭怔整拯正政幀症鄭證芝枝支吱蜘知肢脂汁之織職直植殖執值侄址指止趾只旨紙志摯擲至致置幟峙制智秩稚質炙痔滯治窒中盅忠鍾衷終種腫重仲衆舟周州洲謅粥軸肘帚咒皺宙晝驟珠株蛛朱豬諸誅逐竹燭煮拄矚囑主著柱助蛀貯鑄築住注祝駐抓爪拽專磚轉撰賺篆樁莊裝妝撞壯狀椎錐追贅墜綴諄準捉拙卓桌琢茁酌啄著灼濁茲咨資姿滋淄孜紫仔籽滓子自漬字鬃棕蹤宗綜總縱鄒走奏揍租足卒族祖詛阻組鑽纂嘴醉最罪尊遵昨左佐柞做作坐座");
function traditionalized(cc){ var str=''; for(var i=0;i&lt;cc.length;i++) (charPYStr.indexOf(cc.charAt(i)) != -1) ? (str += ftPYStr.charAt(charPYStr.indexOf(cc.charAt(i)))) : (str += cc.charAt(i)); return str; } 
function simplized(cc){ var str='';	for(var i=0;i&lt;cc.length;i++) (ftPYStr.indexOf(cc.charAt(i)) != -1) ? (str += charPYStr.charAt(ftPYStr.indexOf(cc.charAt(i)))) : (str += cc.charAt(i));	return str; } 
function convert(zcs, wpid){ document.getElementById(wpid).innerHTML = ( (zcs == 0) ? (simplized(document.getElementById(wpid).innerHTML)) : (traditionalized(document.getElementById(wpid).innerHTML)) ); }[/code]




然後在文章裡面需要轉換得部份加上：



&lt;div id="xxxxxx"&gt;
 中文部份
 
&lt;/div&gt;
&lt;/pre&gt; 然後新增按鈕： 
&lt;pre class="brush: xml; title: ; notranslate" title=""&gt;&lt;input type="button" value="正體中文" onClick="convert('1', 'xxxxxx')" /&gt;
&lt;input type="button" value="簡體中文" onClick="convert('0', 'xxxxxx')" /&gt; 
&lt;/pre&gt; xxxxxx：代表你的 div 的 id 值 1：代表正體中文 0：代表簡體中文 位置放到你想要顯示的地方就可以 google 我測試如下： 
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/wp-content/google/google1.htm"&gt;http://blog.wu-boy.com/wp-content/google/google1.htm&lt;/a&gt; &amp;lt;&amp;ndash; 不能轉換 &lt;a href="http://blog.wu-boy.com/wp-content/google/google2.htm"&gt;http://blog.wu-boy.com/wp-content/google/google2.htm&lt;/a&gt; &amp;lt;&amp;ndash; 可以轉換 &lt;a href="http://code.google.com/apis/ajaxlanguage/documentation/reference.html#translateResult"&gt;http://code.google.com/apis/ajaxlanguage/documentation/reference.html#translateResult&lt;/a&gt; 這裡面寫到，錯誤原因找到了： &lt;strong&gt;the string to be translated exceeds the maximum length allowed&lt;/strong&gt; 囧 google 還沒完全開放阿～&lt;/p&gt;</description></item><item><title>[PHP]如何使用 flush() 跟 ob_flush()</title><link>https://blog.wu-boy.com/2008/07/php%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-flush-%E8%B7%9F-ob_flush/</link><pubDate>Mon, 28 Jul 2008 06:02:17 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/07/php%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-flush-%E8%B7%9F-ob_flush/</guid><description>&lt;p&gt;比如說我們想要緩衝網頁資料，如利用 &lt;a href="http://tw.php.net/sleep"&gt;sleep()&lt;/a&gt; 這個函式，那我們不想要等整個 php 執行完畢才輸出畫面，那就是需要緩衝輸出，在 &lt;a href="http://phorum.study-area.org"&gt;酷學園&lt;/a&gt; 的這篇 &lt;a href="http://phorum.study-area.org/index.php/topic,52757.0.html"&gt;http://phorum.study-area.org/index.php/topic,52757.0.html&lt;/a&gt; 有討論到，所以我實際去測試一下，大概如下：&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;&lt;?php

ob_flush();
echo "這是第一行&lt;br /&gt;";
flush();
sleep(2);

for ($i=10; $i&gt;0; $i--)
{
 echo $i . "

&lt;br /&gt;";
 ob_flush();
 flush();
 sleep(1);
}
ob_end_flush();
?&gt;&lt;/pre&gt; 我覺得相當不錯用，大家可以參考看看。酷學園那篇，我測試好像沒有這種效果，Orz，不知道我測試錯誤，還是啥的地方搞錯 http://blog.goalercn.com/blogview.asp?logID=348</description></item><item><title>[Linux] CentOS 5.1 安裝 Lighttpd + PHP5 + FastCgi + eaccelerator</title><link>https://blog.wu-boy.com/2008/07/linux-centos-51-%E5%AE%89%E8%A3%9D-lighttpd-php5-fastcgi-eaccelerator/</link><pubDate>Tue, 22 Jul 2008 07:56:09 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/07/linux-centos-51-%E5%AE%89%E8%A3%9D-lighttpd-php5-fastcgi-eaccelerator/</guid><description>&lt;p&gt;昨天網站無緣無故被擋掉，原因是我的流量網站太大，囧，因為是架設 web site，測試一下效能，我發現 &lt;a href="http://httpd.apache.org"&gt;=http://httpd.apache.org&lt;/a&gt;apache[/url] 沒辦法撐住流量跟線上人數，所以只好換成 &lt;a href="http://www.lighttpd.net"&gt;=http://www.lighttpd.net&lt;/a&gt;Lighttpd[/url] 發現效果不錯，所以又去安裝了 CentOS 版本，我是去參考底下這篇：&lt;a href="http://www.howtoforge.com/lighttpd_php5_mysql_centos5.0"&gt;Installing Lighttpd With PHP5 And MySQL Support On CentOS 5.0&lt;/a&gt;，這一篇我覺得寫的還ok，但是因為 Centos 如果你想用 yum 安裝 &lt;a href="http://www.lighttpd.net"&gt;=http://www.lighttpd.net&lt;/a&gt;Lighttpd[/url] 就要先裝 rpmforge-release package 這個東西，這樣才可以找到。 首先先看你的版本再來抓：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;RHEL5 / CentOS-5 i386: &lt;a href="http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm"&gt;http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm&lt;/a&gt; x86_64: &lt;a href="http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.x86"&gt;http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.x86&lt;/a&gt;_64.rpm RHEL4 / CentOS-4 i386: &lt;a href="http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el4.rf.i386.rpm"&gt;http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el4.rf.i386.rpm&lt;/a&gt; x86_64: &lt;a href="http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el4.rf.x86"&gt;http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el4.rf.x86&lt;/a&gt;_64.rpm RHEL3 / CentOS-3 i386: &lt;a href="http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el3.rf.i386.rpm"&gt;http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el3.rf.i386.rpm&lt;/a&gt; x86_64: &lt;a href="http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el3.rf.x86"&gt;http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el3.rf.x86&lt;/a&gt;_64.rpm RHEL2.1 / CentOS-2 i386: &lt;a href="http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el2.rf.i386.rpm"&gt;http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el2.rf.i386.rpm&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[文件]Reverse Proxy 一些資料 for Apache Lighttpd Squid</title><link>https://blog.wu-boy.com/2008/07/%E6%96%87%E4%BB%B6reverse-proxy-%E4%B8%80%E4%BA%9B%E8%B3%87%E6%96%99-for-apache-lighttpd-squid/</link><pubDate>Tue, 15 Jul 2008 12:45:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/07/%E6%96%87%E4%BB%B6reverse-proxy-%E4%B8%80%E4%BA%9B%E8%B3%87%E6%96%99-for-apache-lighttpd-squid/</guid><description>&lt;p&gt;最近都在找如何增加 WEB 效能的方式，大概找一下 Squid Reverse Proxy 跟 Apache Reverse Proxy，底下是一些文件，大概網路上找到的，整理一下 &lt;a href="http://peterkim.hellpara.org/blog/?p=356"&gt;Apache2 as a Reverse Proxy&lt;/a&gt; &lt;a href="http://lightyror.wordpress.com/2006/12/30/ruby-on-rails-%E4%BC%BA%E6%9C%8D%E5%99%A8%E6%9E%B6%E8%A8%AD%E5%8E%9F%E7%90%86/"&gt;ruby-on-rails-伺服器架設原理&lt;/a&gt; &lt;a href="http://www.study-area.org/tips/r-proxy_20030117.txt"&gt;R-Proxy – 使用Apache架設&lt;/a&gt; &lt;a href="http://www.lccnet.com.tw/commercial/e-paper/200803/new-5.html"&gt;使用 Reverse Proxy代理服務&lt;/a&gt; &lt;a href="http://www.mysqlperformanceblog.com/2008/06/17/lighttpd-as-reverse-proxy/"&gt;Lighttpd as reverse proxy&lt;/a&gt; &lt;a href="http://www.visolve.com/squid/whitepapers/reverseproxy.php"&gt;Reverse Proxy Using Squid&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[轉貼] RoR：Ruby on Rails的部署方案選擇</title><link>https://blog.wu-boy.com/2008/07/%E8%BD%89%E8%B2%BC-ror%EF%BC%9Aruby-on-rails%E7%9A%84%E9%83%A8%E7%BD%B2%E6%96%B9%E6%A1%88%E9%81%B8%E6%93%87/</link><pubDate>Thu, 10 Jul 2008 02:04:01 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/07/%E8%BD%89%E8%B2%BC-ror%EF%BC%9Aruby-on-rails%E7%9A%84%E9%83%A8%E7%BD%B2%E6%96%B9%E6%A1%88%E9%81%B8%E6%93%87/</guid><description>&lt;p&gt;我沒在玩 &lt;a href="http://www.rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt;，但是底下這一篇我覺得寫的不錯，可以參考看看，裡面有介紹一下目前當紅 web daemon 的一些基本知識&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;RoR的部署方式從架構上來說分為前端和後端： 一、前端 前端的作用就是處理靜態資源，將動態請求分發到後端，有時候也帶有一些額外的功能，例如對特定URL進行rewrite和redirect，對HTTP輸出進行gzip壓縮等等。 前端目前已知的可以選擇apache, lighttpd, litespeed, nginx, haproxy 1、apache2.2 apache是全球市場佔有率最高的web server，超過全球互聯網網站50%的網站都用apache。apache2.2 + mod_proxy_balancer是一個非常流行，非常穩定的方案。 使用apache2.2唯一的問題就是apache的性能和後面那些輕量級web server相比，差太遠了。一方面在處理靜態請求方面apache要比lighttpd慢3-5倍，內存消耗和CPU消耗也高出一個數量級，另一方面 mod_proxy_balancer的分發性能也不高，比haproxy差很遠。 2、lighttpd lighttpd 是一個輕量級高性能web server，一個在MySQL Inc工作的德國人寫的。性能很好，內存和CPU資源消耗很低，支持絕大多數apache的功能，是apache的絕好替代者。目前lighttpd已經上升到全球互聯網第四大web server，市場佔有率僅此於apache，IIS和Sun。 lighttpd唯一的問題是proxy功能不完善，因此不適合搭配mongrel來使用。lighttpd下一個版本1.5.0的proxy模塊重寫過了，將會解決這個問題。 3、litespeed 和 lighttpd差不多，商業產品，收費的。比lighttpd來說，多一個web管理界面，不用寫配置文件了。litespeed專門為單機運行的 RoR開發了一個lsapi協議，號稱性能最好，比httpd和fcgi都要好。他的proxy功能比lighttpd完善。 litespeed 的缺點我卻認為恰恰是這個lsapi。因為lsapi不是web server啟動的時候啟動固定數目的ruby進程，而是根據請求繁忙程度，動態創建和銷毀ruby進程，貌似節省資源，實則和apache2.2進程模型一樣，留下很大的黑客攻擊漏洞。只要黑客瞬時發起大量動態請求，就會讓服務器忙於創建ruby進程而導致CPU資源耗盡，失去響應。 當然，litespeed也支持httpd和fcgi，這個和lighttpd用法一樣的，到沒有這種問題。 4、nginx 一個俄國人開發的輕量級高性能web server，特點是做proxy性能很好，因此被推薦取代apache2.2的mod_proxy_balancer，來和mongrel cluster搭配。其他方面和lighttpd到差不多。 要說缺點，可能就是發展的時間比較短，至今沒有正式版本，還是beta版。沒有經過足夠網站的驗證。 5、haproxy 就是一個純粹的高性能proxy，不處理靜態資源的，所有請求統統分發到後端。 二、後端 後端就是跑ruby進程，處理RoR動態請求了。運行後端ruby進程有兩種方式： 1、fcgi方式 準確的說，不能叫做fcgi方式，其實就是啟動一個ruby進程，讓這個ruby進程監聽一個tcp/unix socket，以fcgi協議和前端通訊。所以fcgi不是指ruby進程的運行方式，而是ruby進程使用的通訊協議。這就好比你tomcat可以用 http也可以使用ajp通訊一樣，tomcat自己的運行方式都一樣的，只是通訊方式不一樣。 fcgi方式啟動ruby進程，可以使用lighttpd帶的一個spawn-fcgi工具來啟動(JavaEye目前採用這種方式)。 值得一提的是，apache2.2的mod_fastcgi的方式和上面還不太一樣，由apache動態創建fcgi進程和管理fcgi進程，這種方式和 litespeed的lsapi面臨的問題是一樣的，此外apache的mod_fastcgi自己也有很多嚴重的bug，是一種很糟糕的部署方式。這種糟糕的部署方式也敗壞了fcgi的名聲。 fastcgi只是一種協議，雖然古老，但並不是不好用，http協議也很古老。沒有必要因為 apache的mod_fastcgi的運行方式的問題而連帶把fastcgi都一同否定了。fastcgi只是一個協議(程序之間的語言)，是 apache的mod_fastcgi這個模塊有問題。打個比方，有個人英語水平很差，和你用英語對話，總是結結巴巴的，那你說是英語(fastcgi) 這種語言有問題呢？還是和你對話的這個人 (mod_fastcgi)有問題呢？ 2、http方式 也就是用mongrel去跑ruby進程，由於mongrel實際上已經是一個簡單的http server，所以也可以單獨作為web server使用。mongrel現在越來越受歡迎了。 用fcgi方式還是http方式，我個人覺得區別不大，關鍵還是看應用的場合，一般而言，推薦的搭配是： lighttpd ＋ fcgi 或者 nginx ＋mongrel，而apache因為性能差距，而不被推薦。 JavaEye為什麼用lighttpd ＋ fcgi呢？原因如下： 1) lighttpd發展了好幾年了，市場佔有率也相當高，是一個經過實踐檢驗的server，它的文檔也很全；而nginx還沒有經過足夠的市場檢驗，文檔也很缺乏 2) JavaEye的ruby進程和web server在一台機器上面跑，通過unix socket使用fcgi協議通訊可以避免tcp的網絡開銷，其通訊速度比使用tcp socket使用http協議通訊要快一些。 什麼場合使用haproxy？ 大規模部署，例如你的RoR應用到十幾台服務器上面去，你用haproxy會更好，可以方便的添加刪除應用服務器節點，proxy性能更好。 資料來源： Csdn – &lt;a href="http://news.csdn.net/n/20071229/112274.html"&gt;http://news.csdn.net/n/20071229/112274.html&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[FreeBSD] Lighttpd + PHP + mod_proxy + FastCGI</title><link>https://blog.wu-boy.com/2008/07/freebsd-lighttpd-php-mod_proxy-fastcgi/</link><pubDate>Thu, 10 Jul 2008 01:51:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/07/freebsd-lighttpd-php-mod_proxy-fastcgi/</guid><description>&lt;p&gt;最近一直在玩 &lt;a href="http://www.lighttpd.net/"&gt;Lighttpd&lt;/a&gt; 這一套 web 的 daemon，我覺得這一套還蠻好用的，不像 Apache 掛載這麼多 module 結果吃還蠻大的資源，加上 Apache 預設跑 MPM prefork 所以如果大型網站大概就會掛掉，線上人數一堆，就會快撐不住了，所以用 &lt;a href="http://httpd.apache.org/docs/2.0/mod/worker.html"&gt;MPM worker&lt;/a&gt; 或者是 &lt;a href="http://httpd.apache.org/docs/2.2/mod/event.html"&gt;MPM Event&lt;/a&gt;，然後 &lt;a href="http://www.lighttpd.net/"&gt;Lighttpd&lt;/a&gt; 本身還支援 &lt;a href="http://trac.lighttpd.net/trac/wiki/Docs%3AModRewrite"&gt;mod_rewrite&lt;/a&gt; 的功能，可以參考我之前寫的 &lt;a href="http://blog.wu-boy.com/2008/07/03/287/"&gt;[FreeBSD]Lighttpd + php5 + 解決 wordpress Permalinks 問題&lt;/a&gt;，不過最近遇到一個很奇怪問題，那就是 &lt;a href="http://www.lighttpd.net/"&gt;Lighttpd&lt;/a&gt; 會自己掛點，但是我看 message 跟 error log 底下是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2008-07-10 09:08:31: (server.c.1258) NOTE: a request for /wp-includes/js/scriptaculous/effects.js?ver=1.8.0 timed out after writing 32991 bytes. We waited 360 seconds. If this a problem increase server.max-write-idle&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[FreeBSD]解決 lighttpd log Permission denied 問題</title><link>https://blog.wu-boy.com/2008/07/freebsd%E8%A7%A3%E6%B1%BA-lighttpd-log-permission-denied-%E5%95%8F%E9%A1%8C/</link><pubDate>Fri, 04 Jul 2008 04:01:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/07/freebsd%E8%A7%A3%E6%B1%BA-lighttpd-log-permission-denied-%E5%95%8F%E9%A1%8C/</guid><description>&lt;p&gt;今天早上伺服器 lighttpd 沒有跑起來，發現是因為沒有寫入 lighttpd.access.log 的權限，所以造成不能啟動&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2008-07-04 08:37:15: (mod_accesslog.c.535) opening access-log failed: Permission denied /var/log/lighttpd/lighttpd.access.log 目前的解法大概就是不能去改 /var/log 這個資料夾權限，所以我在 /var/log 底下新增 lighttpd 這個資料夾&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[高雄美食] [推薦]高雄夢時代 Dream Mall 一樓 Cold Stone 冰品</title><link>https://blog.wu-boy.com/2008/07/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F-%E6%8E%A8%E8%96%A6%E9%AB%98%E9%9B%84%E5%A4%A2%E6%99%82%E4%BB%A3-dream-mall-%E4%B8%80%E6%A8%93-cold-stone-%E5%86%B0%E5%93%81/</link><pubDate>Fri, 04 Jul 2008 02:59:13 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/07/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F-%E6%8E%A8%E8%96%A6%E9%AB%98%E9%9B%84%E5%A4%A2%E6%99%82%E4%BB%A3-dream-mall-%E4%B8%80%E6%A8%93-cold-stone-%E5%86%B0%E5%93%81/</guid><description>&lt;p&gt;&lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-6903"&gt;&lt;img src="https://i2.wp.com/pic.wu-boy.com/albums/userpics/10002/normal_CIMG0002%7E4.JPG?w=500" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 我來推薦一下高雄的美食吧，上禮拜去高雄夢時代逛逛，發現一樓的Cold Stone 冰品店相當多人，結果想說進去試試看吧，這一間裝潢的很不錯喔，雖然說不會很安靜，可是工作人員服務的態度好的不得了，所以一定要推薦給各位朋友來去吃，那這尖兵品店，全部都是純手工製作的冰喔，雖然說價位有點高，可是偶而吃一次其實還不賴說，底下就是大概介紹一下冰淇淋的圖片&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cold Stone冰淇淋專賣店 高雄夢時代門市 ADD：高雄市前鎮區中華五路789號1樓 TEL：07-9703588&lt;div id="map_address100" style="width: 500px; height: 300px"&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;</description></item><item><title>[FreeBSD]Lighttpd + php5 + 解決 wordpress Permalinks mod_write</title><link>https://blog.wu-boy.com/2008/07/freebsdlighttpd-php5-%E8%A7%A3%E6%B1%BA-wordpress-permalinks-mod_write/</link><pubDate>Thu, 03 Jul 2008 08:55:50 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/07/freebsdlighttpd-php5-%E8%A7%A3%E6%B1%BA-wordpress-permalinks-mod_write/</guid><description>&lt;p&gt;今天轉換跑道了，最近玩 Apache 玩的很不順，因為只要線上人數一多，就會吃很多記憶體，導致必須重新開 Apache，所以今天來玩看看 &lt;a href="http://www.lighttpd.net/"&gt;lighttpd&lt;/a&gt;試試看，看看結果如何，其實轉換到 &lt;a href="http://www.lighttpd.net/"&gt;lighttpd&lt;/a&gt; 需要注意很多事情，那就是 Lighttpd 並不支援 .htaccess 檔案，所以 mode_rewrite 功能要設定到 Lighttpd.conf 裡面，然後也去找看看 Lighttpd 的 virtual host 的寫法，然後還有一點就是 wordpress 的 Permalinks 的問題，算是今天都解決了，底下來寫一下作法：&lt;/p&gt;</description></item><item><title>[FreeBSD]Apache 噴出 signal Segmentation fault (11)</title><link>https://blog.wu-boy.com/2008/07/freebsdapache-%E5%99%B4%E5%87%BA-signal-segmentation-fault-11/</link><pubDate>Tue, 01 Jul 2008 06:39:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/07/freebsdapache-%E5%99%B4%E5%87%BA-signal-segmentation-fault-11/</guid><description>&lt;p&gt;最近在玩 FreeBSD 伺服器的加強效能，其實我自己試了很多套：&lt;a href="http://eaccelerator.net/"&gt;eAccelerator&lt;/a&gt;，&lt;a href="http://pecl.php.net/package/APC"&gt;Pear APC&lt;/a&gt;，跟 &lt;a href="http://www.zend.com/en/products/guard/optimizer/"&gt;Zend Optimizer&lt;/a&gt;，這三套都是可以加速php的速度，當你的 apache 效能遇到瓶頸，就可以選用這三個來改善網頁瀏覽速度，不過應該沒有人三個都用吧，畢竟三個東西，感覺都是cache幫助，所以達成我們所想要的要求，有時候並不是全部安裝就是代表你的伺服器一定會超快，因為我的經驗是三個不能同時裝，只要裝了兩個都會出問題，這是我這幾天測試的結果，只要裝了Pear APC，就不能裝Zend Optimizer跟eAccelerator了，因為我的 httpd 的 log 會噴出底下訊息：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;signal Segmentation fault (11) 跟 pid 15879 (httpd), uid 80: exited on signal 11&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[PHP]解決網站被 SQL injection 攻擊</title><link>https://blog.wu-boy.com/2008/06/php%E8%A7%A3%E6%B1%BA%E7%B6%B2%E7%AB%99%E8%A2%AB-sql-injection-%E6%94%BB%E6%93%8A/</link><pubDate>Thu, 26 Jun 2008 08:26:51 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/06/php%E8%A7%A3%E6%B1%BA%E7%B6%B2%E7%AB%99%E8%A2%AB-sql-injection-%E6%94%BB%E6%93%8A/</guid><description>&lt;p&gt;其實這個安全性的問題，在目前台灣網站都存在這樣的問題，大家平常用 $_POST，$_GET 用得很順利，但是沒有想過帳號密碼被 SQL injection 破解，當網站被破解了，基本上你損失就是相當嚴重，網路上也有很多攻擊方式，不過這方法是最常被拿出來講的，我自己有一套解決方式，除了比較重要的地方，就是輸入帳號密碼的地方要加強防護之外，加上數字驗證碼，還要 check 帳號的特性，我底下是我驗證帳號密碼機制&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;if($user_name == '' || $user_passwd == ''){
 	ErrMsg("帳號或密碼不得空白");
 }
 if (!preg_match('/^\w+$/', $user_name)){
 	ErrMsg("請勿攻擊本站台");
 }&lt;/pre&gt;</description></item><item><title>[FreeBSD &amp; Linux]網站分流：簡易架設 HAProxy 伺服器</title><link>https://blog.wu-boy.com/2008/06/freebsd-linux%E7%B6%B2%E7%AB%99%E5%88%86%E6%B5%81%EF%BC%9A%E7%B0%A1%E6%98%93%E6%9E%B6%E8%A8%AD-haproxy-%E4%BC%BA%E6%9C%8D%E5%99%A8/</link><pubDate>Mon, 23 Jun 2008 14:07:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/06/freebsd-linux%E7%B6%B2%E7%AB%99%E5%88%86%E6%B5%81%EF%BC%9A%E7%B0%A1%E6%98%93%E6%9E%B6%E8%A8%AD-haproxy-%E4%BC%BA%E6%9C%8D%E5%99%A8/</guid><description>&lt;p&gt;最近在玩這套 Web 的 Load Balance 軟體，其實這是之前我寫的一篇：&lt;a href="http://blog.wu-boy.com/2008/06/01/274/"&gt;[筆記] FreeBSD 一張網卡多重 ip 實現 Round Robin DNS Load Balancing&lt;/a&gt;，有網友留言給我說可以玩看看 &lt;a href="http://haproxy.1wt.eu/"&gt;HAProxy&lt;/a&gt;，這樣的確改善了很多效能，而且也是正確達到 load balance 的效果，不然用 DNS Robin DNS Load Balancing 的方式的卻沒辦法做的很好，關於 HAProxy 在 google 了一下，好像國內很少人在寫這方面的教學，我自己來寫一下筆記好了，其實我還不是對設定很熟悉，只是大概知道他的原理罷了，底下我們來看看官網的一張圖 &lt;a href="https://www.flickr.com/photos/appleboy/2603471691/" title="haproxy-pmode by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm4.staticflickr.com/3211/2603471691_6d083bbeed.jpg?resize=363%2C290&amp;#038;ssl=1" alt="haproxy-pmode" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[FreeBSD]解決swap不夠的情況：Add Swap Space</title><link>https://blog.wu-boy.com/2008/06/freebsd%E8%A7%A3%E6%B1%BAswap%E4%B8%8D%E5%A4%A0%E7%9A%84%E6%83%85%E6%B3%81%EF%BC%9Aadd-swap-space/</link><pubDate>Sat, 21 Jun 2008 09:43:17 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/06/freebsd%E8%A7%A3%E6%B1%BAswap%E4%B8%8D%E5%A4%A0%E7%9A%84%E6%83%85%E6%B3%81%EF%BC%9Aadd-swap-space/</guid><description>&lt;p&gt;最近在使用 FreeBSD 架站，apache + MySQL + PHP，但是最近常常會吐出來 swap 不夠的情形，然後系統就會吐出下面訊息&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Jun 19 20:59:57 backup kernel: swap_pager_getswapspace(7): failed Jun 19 20:59:57 backup kernel: swap_pager_getswapspace(16): failed Jun 19 20:59:57 backup kernel: swap_pager_getswapspace(2): failed Jun 19 20:59:57 backup kernel: swap_pager_getswapspace(5): failed 目前上網看到的解決方法，都是增加 swap 的容量，那底下是在 FreeBSD 下面得作法：&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>基本優化 tuning apache 跟 tuning mysql 跟 php 效能</title><link>https://blog.wu-boy.com/2008/06/%E5%9F%BA%E6%9C%AC%E5%84%AA%E5%8C%96-tuning-apache-%E8%B7%9F-tuning-mysql-%E6%95%88%E8%83%BD/</link><pubDate>Wed, 18 Jun 2008 13:42:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/06/%E5%9F%BA%E6%9C%AC%E5%84%AA%E5%8C%96-tuning-apache-%E8%B7%9F-tuning-mysql-%E6%95%88%E8%83%BD/</guid><description>&lt;p&gt;最近在玩優化 Apache 跟 MySQL 部份，然後就在 google 上面找一些資料，當然對我自己的網站當然改變不少，速度有增快許多，所以來紀錄一下，其實都是還蠻基本的改 config 檔案就可以了 1. apache 部份 for FreeBSD&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# 利用 ports 安裝
# 在安裝 Apache 時，加入此參數 WITH_MPM=XXXX 即可。 
#
cd /usr/ports/www/apache22 ; make WITH_MPM=worker install clean&lt;/pre&gt; 如果是要裝在 Linux 機器的話，可能要自己編譯，在 Apache 2.0 有很多效能上得改變，所以原本預設是 prefork 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# 編譯加上 
# 
./configure --with-mpm=worker&lt;/pre&gt; 在 Ubuntu 底下作法很奇怪，利用 apt-get 方式不能安裝 mpm worker，因為你安裝 php 的時候他會幫你移除，然後裝上 prefork，所以很奇怪，這部份我還不知道怎麼解決。</description></item><item><title>[教學]修復 Windows 的開機磁區各種方法</title><link>https://blog.wu-boy.com/2008/06/%E6%81%A2%E5%BE%A9-windows-%E7%9A%84%E9%96%8B%E6%A9%9F%E7%A3%81%E5%8D%80%E6%96%B9%E6%B3%95/</link><pubDate>Mon, 16 Jun 2008 04:29:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/06/%E6%81%A2%E5%BE%A9-windows-%E7%9A%84%E9%96%8B%E6%A9%9F%E7%A3%81%E5%8D%80%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;如何恢復 Windows 開機磁區，我想這是玩 Linux 跟 Windows 多重作業系統會碰到的問題之一，也是大家最頭痛的問題，當然其實方法很解決，沒有想像的那麼困難啦，只是大家安裝完 Linux 之後，然後砍掉他們的磁區，就會造成開機 boot loader 讀不到資料，所以造成 grub 的錯誤，那可以參考鳥哥那邊的作法，當然首先要瞭解：&lt;a href="http://linux.vbird.org/linux_basic/0230filesystem.php"&gt;磁碟檔案系統&lt;/a&gt;，然後再去瞭解 &lt;a href="http://linux.vbird.org/linux_basic/0510osloader.php#grub"&gt;Boot Loader: Grub&lt;/a&gt;，當然本篇試教您如和清除開機MBR，恢復 windows 系統的 boot loader。 方法一：利用XP光碟片還原 放進去XP的原版光碟，隨便一種XP光碟即可，只要能原始安裝即可，畫面中按 R 或 F10 進入「Windows 修復主控台」，當然進去之後，她會偵測到目前的系統 C:\windows 之類的，她會詢問密碼，就直接按 enter 即可，然後打入 fixmbr 然後按 Y 確定就可以了&lt;/p&gt;</description></item><item><title>[Linux筆記]如何製作多重開機 grub</title><link>https://blog.wu-boy.com/2008/06/linux%E7%AD%86%E8%A8%98%E5%A6%82%E4%BD%95%E8%A3%BD%E4%BD%9C%E5%A4%9A%E9%87%8D%E9%96%8B%E6%A9%9F-grub/</link><pubDate>Thu, 12 Jun 2008 11:15:26 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/06/linux%E7%AD%86%E8%A8%98%E5%A6%82%E4%BD%95%E8%A3%BD%E4%BD%9C%E5%A4%9A%E9%87%8D%E9%96%8B%E6%A9%9F-grub/</guid><description>&lt;p&gt;昨天晚上原本要看 paper 的，可是幫同學處理安裝好 Fedora 7 的時候出現底下問題：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Minimal BASH-like line editing is supported. For the first word, TAB lists possible command completions. Anywhere else TAB lists the possible completions of a device/filename grub&amp;gt; 其實我自己也不知道安裝好為啥會出現這個，電腦裡面三顆硬碟，兩顆 SATA 一顆 IDE，然後用光碟開機的時候分別是 sda sdb sdc 三顆，所以安裝好之後通常會把 sda mbr 寫入開機訊息，照道理說這樣就可以開機了，可是目前看來是不行，後來是重新安裝了 mbr 我把她安裝到 IDE 那顆硬碟，底下先轉貼開機 mbr 磁區介紹：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;在硬碟最最最開始的磁區叫MBR(Master Boot Record),這是MicroSoft的正式稱呼! 有些人叫它Pre-Boot磁區或Pre-Load磁區. MBR (512 bytes)can be divided into 3 parts: (1) 前面446bytes為開機程式(即Pre-Boot程式),實際只用約200bytes (2) 接著的64bytes就是partition table,每16bytes代表一個logical HD (3) 最後2bytes一定是 55 AA (十六進位) FDISK/MBR 就是把前面446 bytes 換成乾淨的Pre-Boot 程式! 它絕不會動後面的66bytes!!! mbr位於硬碟第0軌,長度為512位元組內含偵測active partition的程式及 長64位元組的partition table(16 bytes * 4 partition records) 每一partition record紀錄partition的起始位置,是否active及os type 從這裡決定要用哪一個partition開機(active partition) 文章轉錄自： &lt;a href="http://www.pczone.com.tw/vbb3/archive/t-20579.html"&gt;http://www.pczone.com.tw/vbb3/archive/t-20579.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[生活日記]中正大學剪頭髮</title><link>https://blog.wu-boy.com/2008/06/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E5%89%AA%E9%A0%AD%E9%AB%AE/</link><pubDate>Sun, 08 Jun 2008 03:02:44 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/06/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E5%89%AA%E9%A0%AD%E9%AB%AE/</guid><description>&lt;p&gt;&lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-5474"&gt;&lt;img src="https://i0.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_0607124853.JPG?w=500" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 這次不爽給外面的剪了，因為上次剪得我不是很滿意，詳情看這裡：&lt;a href="http://blog.wu-boy.com/2008/04/30/199/"&gt;[生活日記] 四月底剪頭髮&lt;/a&gt;，我都是差不多一個月剪一次，然後都是去中正大學外面剪髮：180元，但是有時候剪得好看，有時候剪得不怎麼樣，上次就是一個不好的例子，不過學校剪髮真的很鳥，看起來就是不太會剪，然後我剪頭髮的時候，還是我在跟他說這裡怎樣剪會比較好，Orz ，不過最後有達到我的要求啦，哈哈，真爽，下次就都在學校剪就好，學校價錢：120元，比較便宜，哈哈&lt;/p&gt;</description></item><item><title>[轉錄]做小孩子的要飲水思源：教育小孩：感動了千萬人的漫畫!!</title><link>https://blog.wu-boy.com/2008/06/%E8%BD%89%E9%8C%84%E5%81%9A%E5%B0%8F%E5%AD%A9%E5%AD%90%E7%9A%84%E8%A6%81%E9%A3%B2%E6%B0%B4%E6%80%9D%E6%BA%90%EF%BC%9A%E6%95%99%E8%82%B2%E5%B0%8F%E5%AD%A9%EF%BC%9A%E6%84%9F%E5%8B%95%E4%BA%86%E5%8D%83/</link><pubDate>Sat, 07 Jun 2008 09:27:24 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/06/%E8%BD%89%E9%8C%84%E5%81%9A%E5%B0%8F%E5%AD%A9%E5%AD%90%E7%9A%84%E8%A6%81%E9%A3%B2%E6%B0%B4%E6%80%9D%E6%BA%90%EF%BC%9A%E6%95%99%E8%82%B2%E5%B0%8F%E5%AD%A9%EF%BC%9A%E6%84%9F%E5%8B%95%E4%BA%86%E5%8D%83/</guid><description>&lt;p&gt;轉貼自： &lt;a href="http://mini101.twgg.org/2008/06/07/118/"&gt;http://mini101.twgg.org/2008/06/07/118/&lt;/a&gt; &lt;a href="https://www.flickr.com/photos/appleboy/2557390179/" title="Untitled (by appleboy46)"&gt;&lt;img src="https://i2.wp.com/farm4.static.flickr.com/3155/2557390179_97d2bf4c8b.jpg?resize=500%2C333&amp;#038;ssl=1" title="Untitled (by appleboy46)" alt="Untitled (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[FreeBSD] 安裝 PHP APC 加速網頁速度</title><link>https://blog.wu-boy.com/2008/06/freebsd-%E5%AE%89%E8%A3%9D-php-apc-%E5%8A%A0%E9%80%9F%E7%B6%B2%E9%A0%81%E9%80%9F%E5%BA%A6/</link><pubDate>Thu, 05 Jun 2008 01:00:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/06/freebsd-%E5%AE%89%E8%A3%9D-php-apc-%E5%8A%A0%E9%80%9F%E7%B6%B2%E9%A0%81%E9%80%9F%E5%BA%A6/</guid><description>&lt;p&gt;最近在維護自己的機器，發現網站每秒 request 只要10幾次就會感覺吃很多資源，然後莫名 CPU 飆高到100%，後來只好去找怎麼去 tuning Apache，MySQL，PHP，至於改善 apache 跟 MySQL 我先不講了，我之後會在寫，我先處理了加速 PHP 的部份，我是安裝了 &lt;a href="http://pecl.php.net/package/APC"&gt;APC&lt;/a&gt;（Alternative PHP Cache），來改善執行 PHP 的速度，這個程式必須先安裝好 &lt;a href="http://pecl.php.net/"&gt;PECL&lt;/a&gt;(PHP Extension Community Library)，再來安裝 APC 就沒問題了。 1. 首先安裝 APC&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# 先切換到該軟體下面
#
cd /usr/ports/www/pecl-APC/; make install clean
&lt;/pre&gt;</description></item><item><title>[筆記] FreeBSD 一張網卡多重 ip 實現 Round Robin DNS Load Balancing</title><link>https://blog.wu-boy.com/2008/06/%E7%AD%86%E8%A8%98-freebsd-%E4%B8%80%E5%BC%B5%E7%B6%B2%E5%8D%A1%E5%A4%9A%E9%87%8D-ip-%E5%AF%A6%E7%8F%BE-round-robin-dns-load-balancing/</link><pubDate>Sun, 01 Jun 2008 03:34:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/06/%E7%AD%86%E8%A8%98-freebsd-%E4%B8%80%E5%BC%B5%E7%B6%B2%E5%8D%A1%E5%A4%9A%E9%87%8D-ip-%E5%AF%A6%E7%8F%BE-round-robin-dns-load-balancing/</guid><description>&lt;p&gt;來紀錄一下好了，其實這兩年前，我自己就試過了，當時在弄 web 系統 Load Balancing，因為找不到更好的方法，所以使用 Round Robin DNS Load Balancing 技術來達到這功能，可是當然這不是很準確的做到 load balance，只是能解決暫時性的問題，真正要做到 Load Balancing 可能要靠硬體的技術了。 我自己是在 FreeBSD 系統上面實做的，當然弄 Load Balancing 一定要在網卡上面綁定多重ip，Linux 作法跟 FreeBSD 不大相同&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# Linux 作法
#
ifconfig eth0:0 inet xxx.xxx.xxx.xx(1~9) netmask 255.255.255.0 broadcast xxx.xxx.xxx.255&lt;/pre&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# FreeBSD 作法
#
# /etc/rc.conf - add a new IP address to the NIC
# 在 rc.conf 加入底下 entry
ifconfig_rl0_alias0="192.168.0.57 netmask 0xffffffff" 
#
# 指令
#
ifconfig rl0 alias 192.168.0.57 netmask 0xffffffff
 &lt;/pre&gt;</description></item><item><title>[FreeBSD&amp;Linux] 如何用 mount 取代 ln 去實現連結檔(Symbolic Link)</title><link>https://blog.wu-boy.com/2008/05/freebsdlinux-%E5%A6%82%E4%BD%95%E7%94%A8-mount-%E5%8F%96%E4%BB%A3-ln-%E5%8E%BB%E5%AF%A6%E7%8F%BE%E9%80%A3%E7%B5%90%E6%AA%94symbolic-link/</link><pubDate>Wed, 28 May 2008 14:14:56 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/05/freebsdlinux-%E5%A6%82%E4%BD%95%E7%94%A8-mount-%E5%8F%96%E4%BB%A3-ln-%E5%8E%BB%E5%AF%A6%E7%8F%BE%E9%80%A3%E7%B5%90%E6%AA%94symbolic-link/</guid><description>&lt;p&gt;我們在 Linux 或者是 FreeBSD 底下如何建立連結檔(Symbolic Link) ，也就是在 Windows 底下的捷徑啦，這個在鳥哥的網站都有寫的很清楚：&lt;a href="http://linux.vbird.org/linux_basic/0230filesystem.php#ln"&gt;連結檔的介紹： ln&lt;/a&gt;，最重要搞清楚 hard link 跟 soft link 就可以了，簡單來說，hard link 只可以針對檔案，不可以對目錄，但是 soft link 就是可以對目錄了，因為她就像 Windows 底下的捷徑，那在 Linux 底下，大家常常在玩 FTP，一定會碰到需要利用 Link 的方式，但是如果你利用 ln 的方式的話，連接ftp，會沒辦法回到上一層目錄，就是有 chroot 的問題，那底下是我發現可以解決的方法，其實這算是月經題了，只是我想記錄下來。 在 Linux 底下，就是利用 mount 的指令：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# 就是利用 mount --bind
#
mount --bind olddir newdir&lt;/pre&gt; 在 FreeBSD 底下，利用 mount_nulls 指令 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# mount_nullfs olddir newdir
#
mount_nullfs olddir newdir&lt;/pre&gt; 很簡單吧，大概是這樣，FTP 就不會出現不能回到上一層目錄的問題了</description></item><item><title>[Linux&amp;FreeBSD] 備份系統資料，MySQL 資料庫，PgSQL 資料庫的自動化 bash shell script 程式</title><link>https://blog.wu-boy.com/2008/05/linuxfreebsd-%E5%82%99%E4%BB%BD%E7%B3%BB%E7%B5%B1%E8%B3%87%E6%96%99%EF%BC%8Cmysql-%E8%B3%87%E6%96%99%E5%BA%AB%EF%BC%8Cpgsql-%E8%B3%87%E6%96%99%E5%BA%AB-shell-script/</link><pubDate>Fri, 23 May 2008 03:02:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/05/linuxfreebsd-%E5%82%99%E4%BB%BD%E7%B3%BB%E7%B5%B1%E8%B3%87%E6%96%99%EF%BC%8Cmysql-%E8%B3%87%E6%96%99%E5%BA%AB%EF%BC%8Cpgsql-%E8%B3%87%E6%96%99%E5%BA%AB-shell-script/</guid><description>&lt;p&gt;來分享一個自己寫的 bash shell script，本身管理系上一些伺服器，但是要每天備份資料庫，系統檔案，以防系統整個 crash 掉，但是這個 script 可以對單一一台電腦做備份動作，當然裡面還可以加上 rsync 的動作，遠端備份到不同機器上面，我覺得這樣也可以，我在 Sayay BBS 上面的 ghost 大大版上看到 &lt;a href="http://www.zmanda.com/"&gt;[Backup] Amanda&lt;/a&gt;，這套看起來不錯，可是一直沒有時間去玩，她網站的架構圖如下： &lt;a href="https://www.flickr.com/photos/appleboy/2513451293/" title="chart-amanda-network (by appleboy46)"&gt;&lt;img src="https://i2.wp.com/farm4.static.flickr.com/3155/2513451293_ab18ac6449.jpg?resize=500%2C311&amp;#038;ssl=1" title="chart-amanda-network (by appleboy46)" alt="chart-amanda-network (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; &lt;a href="http://amanda.zmanda.com/"&gt;http://amanda.zmanda.com/&lt;/a&gt; 上面這個我還沒玩過，最近沒啥時間可以玩，不過大家可以去試試看，我目前還是用我自己寫的 script，那下面就是大概會介紹怎麼使用我的 bash script，非常簡單，很適合個人 linux 主機的備份喔。&lt;/p&gt;</description></item><item><title>[jQuery] [影片] 12歲的小孩到 Google 講 jQuery</title><link>https://blog.wu-boy.com/2008/05/jquery-%E5%BD%B1%E7%89%87-12%E6%AD%B2%E7%9A%84%E5%B0%8F%E5%AD%A9%E5%88%B0-google-%E8%AC%9B-jquery/</link><pubDate>Wed, 21 May 2008 12:40:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/05/jquery-%E5%BD%B1%E7%89%87-12%E6%AD%B2%E7%9A%84%E5%B0%8F%E5%AD%A9%E5%88%B0-google-%E8%AC%9B-jquery/</guid><description>&lt;p&gt;我在 &lt;a href="telnet://bbs.sayya.org"&gt;SayYA 資訊站&lt;/a&gt; 裡面的 qrtt1個人版看到的，這個真的是太猛了，底下是他的影片：&lt;/p&gt;</description></item><item><title>[生活日記] 我的實驗室母玫瑰蝦跟蝦寶寶～</title><link>https://blog.wu-boy.com/2008/05/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E6%88%91%E7%9A%84%E5%AF%A6%E9%A9%97%E5%AE%A4%E6%AF%8D%E7%8E%AB%E7%91%B0%E8%9D%A6%E8%B7%9F%E8%9D%A6%E5%AF%B6%E5%AF%B6%EF%BD%9E/</link><pubDate>Tue, 20 May 2008 13:13:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/05/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E6%88%91%E7%9A%84%E5%AF%A6%E9%A9%97%E5%AE%A4%E6%AF%8D%E7%8E%AB%E7%91%B0%E8%9D%A6%E8%B7%9F%E8%9D%A6%E5%AF%B6%E5%AF%B6%EF%BD%9E/</guid><description>&lt;p&gt;&lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-3535"&gt;&lt;img src="https://i0.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_P5072136.JPG?w=500" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 這是我 LAB 的魚缸喔，有三隻母玫瑰蝦抱蛋了，真開心，將來又會有新成員了，當然之前的小玫瑰蝦已經長大了，最大的已經可以看到雛型了喔 &lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-3536"&gt;&lt;img src="https://i1.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_P5072149.JPG?w=500" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Linux筆記] 利用 mount 指令解決 Read-only file system 問題</title><link>https://blog.wu-boy.com/2008/05/linux%E7%AD%86%E8%A8%98-%E5%88%A9%E7%94%A8-mount-%E6%8C%87%E4%BB%A4%E8%A7%A3%E6%B1%BA-read-only-file-system-%E5%95%8F%E9%A1%8C/</link><pubDate>Mon, 19 May 2008 02:53:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/05/linux%E7%AD%86%E8%A8%98-%E5%88%A9%E7%94%A8-mount-%E6%8C%87%E4%BB%A4%E8%A7%A3%E6%B1%BA-read-only-file-system-%E5%95%8F%E9%A1%8C/</guid><description>&lt;p&gt;之前幫別人處理機器的時候，發生這個問題，如果你針對 / 根目錄做寫入動作，她就會出現 Read-only file system，所以我去 google 到一篇文章：&lt;a href="http://moto.debian.org.tw/viewtopic.php?p=58706"&gt;如何讓file system 變成可以write, 而不是read only&lt;/a&gt;，這篇的解法就還蠻簡單的，就是只要下指令就可以了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;# 讓 root file system 可以寫入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mount -o remount,rw /
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這樣大概就解決問題，至於為甚麼會發生這個問題，這其實我不太知道，哈哈。&lt;/p&gt;</description></item><item><title>[軟體介紹] Recuva – File Recovery 救回已刪除檔案資料</title><link>https://blog.wu-boy.com/2008/05/%E8%BB%9F%E9%AB%94%E4%BB%8B%E7%B4%B9-recuva-file-recovery-%E6%95%91%E5%9B%9E%E5%B7%B2%E5%88%AA%E9%99%A4%E6%AA%94%E6%A1%88%E8%B3%87%E6%96%99/</link><pubDate>Fri, 16 May 2008 15:32:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/05/%E8%BB%9F%E9%AB%94%E4%BB%8B%E7%B4%B9-recuva-file-recovery-%E6%95%91%E5%9B%9E%E5%B7%B2%E5%88%AA%E9%99%A4%E6%AA%94%E6%A1%88%E8%B3%87%E6%96%99/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/2496549441/" title="blog_Recuva_01 (by appleboy46)"&gt;&lt;img src="https://i2.wp.com/farm3.static.flickr.com/2130/2496549441_b69a549552.jpg?resize=500%2C337&amp;#038;ssl=1" title="blog_Recuva_01 (by appleboy46)" alt="blog_Recuva_01 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;軟體名稱：Recuva File Recovery 軟體版本：Version 1.13.304 (805kb) 軟體語言：繁體中文、簡體中文（內含多國語系） 軟體性質：免費軟體 檔案大小：746KB 系統支援：Windows 98/2000/XP/2003/Vista 官方網站： &lt;a href="http://www.recuva.com/"&gt;http://www.recuva.com/&lt;/a&gt; 軟體下載：&lt;a href="http://www.recuva.com/download"&gt;按這裡&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[jQuery筆記] 時間日期外掛：timepicker | jQuery Plugins</title><link>https://blog.wu-boy.com/2008/05/jquery%E7%AD%86%E8%A8%98-%E6%99%82%E9%96%93%E6%97%A5%E6%9C%9F%E5%A4%96%E6%8E%9B%EF%BC%9Atimepicker-jquery-plugins/</link><pubDate>Tue, 13 May 2008 00:03:36 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/05/jquery%E7%AD%86%E8%A8%98-%E6%99%82%E9%96%93%E6%97%A5%E6%9C%9F%E5%A4%96%E6%8E%9B%EF%BC%9Atimepicker-jquery-plugins/</guid><description>&lt;p&gt;之前因為需要使用到日期函式，就找到一個 jQuery 的 plugin：&lt;a href="http://blog.wu-boy.com/2008/04/30/194/"&gt;[jQuery筆記] 好用的日期函式 datepicker&lt;/a&gt;，然後現在又需要用到時間的外掛，因為 datepicker 只有日期，我需要使用到時間部份，24小時幾分幾秒之類的，所以又去找到了 &lt;a href="http://plugins.jquery.com/"&gt;jQuery plugin&lt;/a&gt; 裡面的 &lt;a href="http://plugins.jquery.com/project/timepicker"&gt;timepicker&lt;/a&gt;，官方提供的這個外掛，我用起來不能使用，一直給我吐錯誤訊息給我，所以我也裝不起來，後來解決方法，就是去找別人改寫好的 timepicker 來用，所以我覺得還蠻奇怪的，為啥官網提供的外掛不能使用，Orz。 然而我是去網路上再去找有人另外寫好的，底下是他的版權：&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate" title=""&gt;/*
 * Copyright (c) 2006 Sam Collett (http://www.texotela.co.uk)
 * Licensed under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 */
 
/*
 * A time picker for jQuery
 * Based on original timePicker by Sam Collet (http://www.texotela.co.uk)
 * @name timePicker
 * @version 0.1 
 * @author Anders Fajerson (http://perifer.se)
 * @example $("#mytime").timePicker();
 * @example $("#mytime").timePicker({step:30, startTime:"15:00", endTime:"18:00"}); 
 */
&lt;/pre&gt;</description></item><item><title>[DataBase] 備份 MySQL 3.23.49 轉到 MySQL 5 utf8 轉換到 utf8</title><link>https://blog.wu-boy.com/2008/05/database-%E5%82%99%E4%BB%BD-mysql-32349-%E8%BD%89%E5%88%B0-mysql-5-utf8-%E8%BD%89%E6%8F%9B%E5%88%B0-utf8/</link><pubDate>Fri, 09 May 2008 01:00:53 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/05/database-%E5%82%99%E4%BB%BD-mysql-32349-%E8%BD%89%E5%88%B0-mysql-5-utf8-%E8%BD%89%E6%8F%9B%E5%88%B0-utf8/</guid><description>&lt;p&gt;最近在幫友人處理他們web跟資料庫的轉移，然後發現他們的資料庫是很古早的資料庫 MySQL 3.23.49 版本，相當古老吧，因為那個時候我才正值大二時代，剛開始接觸電腦的時候而已，連最基本的資料庫都不知道是什麼，哈哈經過這麼久終於發展到 MySQL 5版本了，不過從 MySQL 4.x 開始支援的 Unicode 系統，所以當時也有很多人遇到轉換問題，我今天也遇到相同問題，不過是在轉換到 Linux Centos 5.1 版本底下，原本機器使用 Red Hat Linux 7.3，真是一個很舊的版本，因為 Red Hat Linux 已經到 9.0 版本了，而且目前不維護了。 之前版本轉換都沒有什麼問題，就是 4.x 轉到 5.x 版本，參可我之前寫的這篇 &lt;a href="http://blog.wu-boy.com/2007/04/08/92/"&gt;[Mysql] 資料庫備份[big5]utf8轉換成utf-8&lt;/a&gt;，如果這篇文章解決不了的話，那就可能用我底下的方法了，不過過上面那個方法不適合用在 3.23 轉到 5.x 版，因為還是會發生亂碼現象，可是這只會發生在 Linux 底下，因為我用 FreeBSD 7.0 R 版，在這環境底下是沒有問題的，所以今天很囧，都在處理 Linux 的部份，哈哈，所以大家還是去用 FreeBSD 吧&lt;/p&gt;</description></item><item><title>[台南美食] 五花馬 水餃館 (大同店) 手工水餃，超級好吃</title><link>https://blog.wu-boy.com/2008/05/%E5%8F%B0%E5%8D%97%E7%BE%8E%E9%A3%9F-%E4%BA%94%E8%8A%B1%E9%A6%AC-%E6%B0%B4%E9%A4%83%E9%A4%A8-%E5%A4%A7%E5%90%8C%E5%BA%97-%E6%89%8B%E5%B7%A5%E6%B0%B4%E9%A4%83%EF%BC%8C%E8%B6%85%E7%B4%9A%E5%A5%BD/</link><pubDate>Wed, 07 May 2008 04:59:20 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/05/%E5%8F%B0%E5%8D%97%E7%BE%8E%E9%A3%9F-%E4%BA%94%E8%8A%B1%E9%A6%AC-%E6%B0%B4%E9%A4%83%E9%A4%A8-%E5%A4%A7%E5%90%8C%E5%BA%97-%E6%89%8B%E5%B7%A5%E6%B0%B4%E9%A4%83%EF%BC%8C%E8%B6%85%E7%B4%9A%E5%A5%BD/</guid><description>&lt;p&gt;&lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-3424"&gt;&lt;img src="https://i0.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_CIMG0057%7E1.JPG?w=500" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 最近去台南玩，當然就是不忘了美食，然而今天我去吃的東西，相當棒，那就是五花馬水餃館，這一間在台南相當有名，在網路上很多人推，那就一定要去吃看看，最主要是他們的手工水餃喔，超級好吃，雖然是不便宜，可是一份10顆也相當有飽足感了，其實那邊有很多東西可以選，也有陽春乾麵，卷餅，蒸餃，還蠻多樣的喔。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;餐廳名稱：[台南美食] 五花馬 水餃館 (大同店) 手工水餃 地址： 台南市大同路一段143號 電話：06-2136461 營業時間：不確定 價位範圍(每人)：50-100之間 可刷卡（可/不可）：不確定 有無包廂：沒有 推薦菜色：手工水餃&lt;div id="map_address101" style="width: 500px; height: 300px"&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;</description></item><item><title>[中正大學美食] 大吃的 山庄烤鴨 山真現炒</title><link>https://blog.wu-boy.com/2008/05/%E4%B8%AD%E6%AD%A3%E7%BE%8E%E9%A3%9F-%E5%A4%A7%E5%90%83%E7%9A%84-%E5%B1%B1%E5%BA%84%E7%83%A4%E9%B4%A8-%E5%B1%B1%E7%9C%9F%E7%8F%BE%E7%82%92/</link><pubDate>Mon, 05 May 2008 16:03:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/05/%E4%B8%AD%E6%AD%A3%E7%BE%8E%E9%A3%9F-%E5%A4%A7%E5%90%83%E7%9A%84-%E5%B1%B1%E5%BA%84%E7%83%A4%E9%B4%A8-%E5%B1%B1%E7%9C%9F%E7%8F%BE%E7%82%92/</guid><description>&lt;p&gt;&lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-3530"&gt;&lt;img src="https://i2.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_0504193030.JPG?w=500" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 今天要來介紹好吃的，在中正大學那麼久了，第一次吃到這麼好吃的，跟這麼飽的餐點，中正大學是個偏僻的地方，在正門前面的大吃，幾乎都是晚上才營業，不過這一家山庄烤鴨中午就有營業了喔，而且還有冷氣，大吃有冷氣的沒幾家，呼呼，這一家非常的好吃，我相當推薦，如果晚上沒有什麼地方好吃，記得來吃這家，因為保證可以讓你吃得很爽跟很飽，真的我沒騙大家喔，不好吃，我讓大家打，囧～&lt;/p&gt;</description></item><item><title>[網路廣告] BlogAD 網路廣告活動 – 東方快線拉拉王</title><link>https://blog.wu-boy.com/2008/05/%E7%B6%B2%E8%B7%AF%E5%BB%A3%E5%91%8A-blogad-%E7%B6%B2%E8%B7%AF%E5%BB%A3%E5%91%8A%E6%B4%BB%E5%8B%95-%E6%9D%B1%E6%96%B9%E5%BF%AB%E7%B7%9A%E6%8B%89%E6%8B%89%E7%8E%8B/</link><pubDate>Mon, 05 May 2008 03:01:26 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/05/%E7%B6%B2%E8%B7%AF%E5%BB%A3%E5%91%8A-blogad-%E7%B6%B2%E8%B7%AF%E5%BB%A3%E5%91%8A%E6%B4%BB%E5%8B%95-%E6%9D%B1%E6%96%B9%E5%BF%AB%E7%B7%9A%E6%8B%89%E6%8B%89%E7%8E%8B/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/2466735184/" title="Default_01 (by appleboy46)"&gt;&lt;img src="https://i0.wp.com/farm4.static.flickr.com/3235/2466735184_6a4fe834ec.jpg?resize=427%2C169&amp;#038;ssl=1" title="Default_01 (by appleboy46)" alt="Default_01 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 之前在三月初的時候參加了 &lt;a href="http://www.blogad.com.tw/"&gt;BlogAD&lt;/a&gt; 舉辦網路廣告活動：東方快線拉拉王，我還為了宣傳這個，寫一篇如何參加廣告活動的教學：&lt;a href="http://blog.wu-boy.com/2008/03/26/163/"&gt;[BlogAD活動] 活動報名教學&lt;/a&gt;，當然這個活動，我覺得相當不錯，又可以讓自己賺錢，也可以讓網友們的得到一點利益，只要填寫問卷就可以拿到 5-10 的獎金，我覺得這樣你填寫問卷也會比較開心，不會想要去亂填，這樣感覺很不賴，然後在上禮拜收到 &lt;a href="http://www.blogad.com.tw/"&gt;BlogAD&lt;/a&gt; 發通知信給我，說我可能名列前三名，我以為我不太可能前三名說。&lt;/p&gt;</description></item><item><title>[生活日記] YA 我的魚缸玫瑰蝦抱蛋了</title><link>https://blog.wu-boy.com/2008/05/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-ya-%E6%88%91%E7%9A%84%E9%AD%9A%E7%BC%B8%E7%8E%AB%E7%91%B0%E8%9D%A6%E6%8A%B1%E8%9B%8B%E4%BA%86/</link><pubDate>Sat, 03 May 2008 16:04:22 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/05/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-ya-%E6%88%91%E7%9A%84%E9%AD%9A%E7%BC%B8%E7%8E%AB%E7%91%B0%E8%9D%A6%E6%8A%B1%E8%9B%8B%E4%BA%86/</guid><description>&lt;p&gt;&lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-3363"&gt;&lt;img src="https://i2.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_P5032087.JPG?w=500" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 今天去台南回來就知道這個好消息了，感謝 LAB 同學宗翰，告知我這消息，然後還把他拍圖給我看，太棒了，之前忘記把蝦跟孔雀魚分開，我發現有一些小蝦都被吃了吧，哈哈，所以稱現在只有蝦子的魚缸，要多生一點喔，現在魚缸已經有很多新成員了，真開心&lt;/p&gt;</description></item><item><title>[MLB] 王建民開幕六連勝，本季美聯第一位六勝投手</title><link>https://blog.wu-boy.com/2008/05/mlb-%E7%8E%8B%E5%BB%BA%E6%B0%91%E9%96%8B%E5%B9%95%E5%85%AD%E9%80%A3%E5%8B%9D%EF%BC%8C%E6%9C%AC%E5%AD%A3%E7%BE%8E%E8%81%AF%E7%AC%AC%E4%B8%80%E4%BD%8D%E5%85%AD%E5%8B%9D%E6%8A%95%E6%89%8B/</link><pubDate>Sat, 03 May 2008 15:05:49 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/05/mlb-%E7%8E%8B%E5%BB%BA%E6%B0%91%E9%96%8B%E5%B9%95%E5%85%AD%E9%80%A3%E5%8B%9D%EF%BC%8C%E6%9C%AC%E5%AD%A3%E7%BE%8E%E8%81%AF%E7%AC%AC%E4%B8%80%E4%BD%8D%E5%85%AD%E5%8B%9D%E6%8A%95%E6%89%8B/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/2461011373/" title="Wang headline (by appleboy46)"&gt;&lt;img src="https://i0.wp.com/farm3.static.flickr.com/2324/2461011373_22683e3037.jpg?resize=500%2C371&amp;#038;ssl=1" title="Wang headline (by appleboy46)" alt="Wang headline (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 今天這一場王建民表現的太好了，除了對付鈴木一朗比較難纏之外，其他選手對他可是一籌莫展阿，加上自家的打擊有發揮，終於拿到第六勝了，相當不簡單，當然現任美聯第一位六勝投手，這場比賽，王建民也表現了他的K功，太強了，投球太犀利了，變化幅度好大阿，看了我頭都暈了，能打的到才有鬼，不愧是洋基的止敗的投手了，不然每次洋基都是LOB大隊，雖然這場LOB也有16，還好小王穩住了，不然就完了。&lt;/p&gt;</description></item><item><title>[jQuery筆記] 好用的日期函式 datepicker</title><link>https://blog.wu-boy.com/2008/04/jquery%E7%AD%86%E8%A8%98-%E5%A5%BD%E7%94%A8%E7%9A%84%E6%97%A5%E6%9C%9F%E5%87%BD%E5%BC%8F/</link><pubDate>Wed, 30 Apr 2008 09:37:51 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/jquery%E7%AD%86%E8%A8%98-%E5%A5%BD%E7%94%A8%E7%9A%84%E6%97%A5%E6%9C%9F%E5%87%BD%E5%BC%8F/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/2453730129/" title="100 (by appleboy46)"&gt;&lt;img src="https://i2.wp.com/farm3.static.flickr.com/2222/2453730129_e1682dc187.jpg?resize=200%2C201&amp;#038;ssl=1" title="100 (by appleboy46)" alt="100 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 最近在學習 javascript，當然首推的就是 &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; 了，之前因為懶得做日期表單，因為日期表單需要三種欄位，一個是年，一個是月，一個是日，相當麻煩，一直在那邊 for 迴圈也不是辦法，雖然那是個解決方法，然後我之前用了&lt;a href="http://www.xt-commerce.cn/index.php"&gt;xt:Commerce&lt;/a&gt; 這套 opensource的程式碼，把日期函式取出來：&lt;a href="http://blog.wu-boy.com/2007/08/08/115/"&gt;[Html] javascript 好用的時間日曆表&lt;/a&gt;，不過我認為這方法也太麻煩，因為 jQuery 一行就可以解決的事情，幹麼還要用那個方法呢？&lt;/p&gt;</description></item><item><title>[生活日記] 四月底剪頭髮</title><link>https://blog.wu-boy.com/2008/04/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E5%9B%9B%E6%9C%88%E5%BA%95%E5%89%AA%E9%A0%AD%E9%AB%AE/</link><pubDate>Wed, 30 Apr 2008 02:31:42 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E5%9B%9B%E6%9C%88%E5%BA%95%E5%89%AA%E9%A0%AD%E9%AB%AE/</guid><description>&lt;p&gt;今天又跑去剪頭髮了，頭髮太長了啦，不過今天剪得有點短，害大家以為我是因為感情吵架，而剪短頭髮，哈哈，當然不是因為這個，是因為頭髮太長，所以跑去剪短了，這次好像剪得比較短，呼呼，看起來像要去成功嶺了，哈哈 &lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-3334"&gt;&lt;img src="https://i1.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_0430210643.JPG?w=300" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[美食日記] 台北帝拉摩義式餐廳- 南京店 – 大學同學會聚餐</title><link>https://blog.wu-boy.com/2008/04/%E7%BE%8E%E9%A3%9F%E6%97%A5%E8%A8%98-%E5%8F%B0%E5%8C%97%E5%B8%9D%E6%8B%89%E6%91%A9%E7%BE%A9%E5%BC%8F%E9%A4%90%E5%BB%B3-%E5%8D%97%E4%BA%AC%E5%BA%97-%E5%A4%A7%E5%AD%B8%E5%90%8C%E5%AD%B8%E6%9C%83/</link><pubDate>Tue, 29 Apr 2008 03:40:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/%E7%BE%8E%E9%A3%9F%E6%97%A5%E8%A8%98-%E5%8F%B0%E5%8C%97%E5%B8%9D%E6%8B%89%E6%91%A9%E7%BE%A9%E5%BC%8F%E9%A4%90%E5%BB%B3-%E5%8D%97%E4%BA%AC%E5%BA%97-%E5%A4%A7%E5%AD%B8%E5%90%8C%E5%AD%B8%E6%9C%83/</guid><description>&lt;p&gt;&lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-3315"&gt;&lt;img src="https://i1.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_DSCF0425.JPG?w=500" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 今年三月29號是我們大學同學會，當然要以大家都可以的時間，所以大家都在台北，當然在南部的只有我跟阿旗，所以我跟阿旗上去台北會比較好，當天我就搭統連去台北了，這家餐廳 &lt;a href="http://www.telamo.com.tw/"&gt;台北帝拉摩義式餐廳&lt;/a&gt;，是阿胖精心挑選的，挑的地方還不錯啦，因為要很多人聚會，所以比較難找吧 集合時間:2008.3.29 5:30PM 集合地點:捷運南京東路站旁的KFC(肯德基)店門口 用餐地點:&lt;a href="http://www.telamo.com.tw"&gt;帝拉摩義式餐廳&lt;/a&gt;– 南京店 02-2731-8730 台北市南京東路三段194巷1 號&lt;/p&gt;</description></item><item><title>[MLB] 王建民第五勝 &amp; 9K，5局上Cabrera陽春彈</title><link>https://blog.wu-boy.com/2008/04/mlb-%E7%8E%8B%E5%BB%BA%E6%B0%91%E7%AC%AC%E4%BA%94%E5%8B%9D%EF%BC%8C5%E5%B1%80%E4%B8%8Acabrera%E9%99%BD%E6%98%A5%E5%BD%88/</link><pubDate>Mon, 28 Apr 2008 01:37:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/mlb-%E7%8E%8B%E5%BB%BA%E6%B0%91%E7%AC%AC%E4%BA%94%E5%8B%9D%EF%BC%8C5%E5%B1%80%E4%B8%8Acabrera%E9%99%BD%E6%98%A5%E5%BD%88/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/2448164918/" title="0428-mlb (by appleboy46)"&gt;&lt;img src="https://i0.wp.com/farm3.static.flickr.com/2137/2448164918_56109fcbf1.jpg?resize=500%2C371&amp;#038;ssl=1" title="0428-mlb (by appleboy46)" alt="0428-mlb (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 中文官方網站圖片： &lt;a href="http://mlb.im.tv/"&gt;http://mlb.im.tv/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[wordpress] 快速升級 Upgrade 2.5.0 -&gt; 2.5.1 for Linux &amp; FreeBSD</title><link>https://blog.wu-boy.com/2008/04/wordpress-%E5%BF%AB%E9%80%9F%E5%8D%87%E7%B4%9A-upgrade-250-251-for-linux-freebsd/</link><pubDate>Sun, 27 Apr 2008 06:13:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/wordpress-%E5%BF%AB%E9%80%9F%E5%8D%87%E7%B4%9A-upgrade-250-251-for-linux-freebsd/</guid><description>&lt;p&gt;今天看到 &lt;a href="http://wordpress.org/"&gt;wordpress&lt;/a&gt; 已經 release 出 Version 2.5.1，大家可以去官網下載 &lt;a href="http://wordpress.org/download/"&gt;wordpress 2.5.1&lt;/a&gt;，不過這次出來的，好像沒有解決 &lt;a href="http://blog.wu-boy.com/2008/04/16/179/"&gt;WordPress 2.5 版本 RSS 摘要無法斷行&lt;/a&gt;，所以我又繼續用了大陸人寫的外掛 &lt;a href="http://yskin.net/2006/07/mulberrykit.html"&gt;wp-CJK-excerpt&lt;/a&gt;，官方網有提供升級方法：&lt;a href="http://codex.wordpress.org/Upgrading_WordPress_Extended#Detailed_Upgrade_Instructions_for_1.5.x.2C_2.0.x.2C_2.1.x.2C_2.2.x.2C_2.3.x.2C_or_2.5.2C_to_2.5.1"&gt;官網複雜升級方法&lt;/a&gt;，其實我之前有寫一篇也是算是蠻笨的方法：&lt;a href="http://blog.wu-boy.com/2008/04/16/177/"&gt;[Wordpress] Upgrade 2.2.x to 2.5 無痛升級法 For Linux or FreeBSD&lt;/a&gt;，然後今天升級的時候，用幾個步驟就可以完成升級的動作了喔，底下就來看看我的升級方法。&lt;/p&gt;</description></item><item><title>[生活日記] 剛剛爸爸打來</title><link>https://blog.wu-boy.com/2008/04/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E5%89%9B%E5%89%9B%E7%88%B8%E7%88%B8%E6%89%93%E4%BE%86/</link><pubDate>Sat, 26 Apr 2008 03:42:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E5%89%9B%E5%89%9B%E7%88%B8%E7%88%B8%E6%89%93%E4%BE%86/</guid><description>&lt;p&gt;今天下午，我爸爸打電話給我，跟我說，兒子你好久沒有打電話回家了喔，哈哈，因為我爸生病，好像生病一個禮拜，被我媽媽傳染的，然後我爸生病那天，打給我，我就發覺他感冒了，講話都怪怪的，所以我就msn給我哥哥，叫他打回家，結果我哥哥天天都打，每天都是打回去關心，然後我都沒有，哈哈，我爸剛剛就說我都沒打回家，哥哥天天打，囧要不是我跟哥哥說，不然他也不知道吧，話說我沒跟我爸說，我今天也是頭暈暈的，剛剛下午還出去開會，囧～，一整個很累，雖然我點奶油鬆餅，很好吃，哈哈，不過吃到最後沒有食慾，但是還是硬把它吃完，囧～真是貪吃，不過吃完頭又變重了，囧，體重會增加嗎？哈哈，頭真的很重，奇怪，頭幹麼那麼重，怪怪的，呼呼。&lt;/p&gt;</description></item><item><title>[FreeBSD &amp; Linux Ubuntu] Proftpd 支援 UTF-8 + MYSQL 虛擬帳號 + Quota 限制</title><link>https://blog.wu-boy.com/2008/04/freebsd-linux-ubuntu-proftpd-%E6%94%AF%E6%8F%B4-utf-8-mysql-%E8%99%9B%E6%93%AC%E5%B8%B3%E8%99%9F-quota-%E9%99%90%E5%88%B6/</link><pubDate>Fri, 25 Apr 2008 15:26:56 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/freebsd-linux-ubuntu-proftpd-%E6%94%AF%E6%8F%B4-utf-8-mysql-%E8%99%9B%E6%93%AC%E5%B8%B3%E8%99%9F-quota-%E9%99%90%E5%88%B6/</guid><description>&lt;p&gt;今天突然想到要玩一下 &lt;a href="http://www.proftpd.org/"&gt;Proftpd&lt;/a&gt; 的 MYSQL 虛擬帳號認證部份，我是用 FreeBSD 7.0 Release 下去安裝的，剛剛去看了一下官方網站，從 1.3.1rc1 版開始，支援 UTF-8 傳送跟接收了，請看 &lt;a href="http://www.proftpd.org/docs/RELEASE_NOTES-1.3.1rc1"&gt;RELEASE_NOTES-1.3.1rc1&lt;/a&gt;，所以1.2.10版本之前的都不支援 UTF-8 不過台灣有人 patch 出來可以支援 Big5，現在都不用了，裡面有一段簡介&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;UseUTF8 Disables use of UTF8 encoding for file paths. If the –enable-nls configure option is used, then UTF8 encoding support will be enabled by default. 如果你的 server 是用此版本，或者是更高，請在編譯的時候加入 –enable-nls&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;–enable-nls This configure option enables handling of translated message catalogs for response messages, and also enables handling of UTF8 paths in client commands.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[WordPress plugin] 好用的 CodeColorer 跟 AddQuicktag 搭配使用</title><link>https://blog.wu-boy.com/2008/04/wordpress-plugin-%E5%A5%BD%E7%94%A8%E7%9A%84-codecolorer-%E8%B7%9F-addquicktag-%E6%90%AD%E9%85%8D%E4%BD%BF%E7%94%A8/</link><pubDate>Thu, 24 Apr 2008 14:48:41 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/wordpress-plugin-%E5%A5%BD%E7%94%A8%E7%9A%84-codecolorer-%E8%B7%9F-addquicktag-%E6%90%AD%E9%85%8D%E4%BD%BF%E7%94%A8/</guid><description>&lt;p&gt;最近在使用 wordpress 的時候，自己在寫文章的時候，常常會用到一些 html 的 tag，可是自己打 html 的時候又很麻煩，所以找到了 &lt;a href="http://wordpress.org/extend/plugins/addquicktag/"&gt;AddQuicktag&lt;/a&gt; 這個外掛，這外掛非常好用，可以自訂一些自己喜歡的 tag 在後台編寫文章的介面喔，如下圖： &lt;a href="https://www.flickr.com/photos/appleboy/2433531240/" title="wordpress_edit (by appleboy46)"&gt;&lt;img src="https://i0.wp.com/farm3.static.flickr.com/2269/2433531240_359a3746ff.jpg?resize=500%2C68&amp;#038;ssl=1" title="wordpress_edit (by appleboy46)" alt="wordpress_edit (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[MLB] 紐約洋基 王建民 50 勝到手了，郭泓志吞首敗</title><link>https://blog.wu-boy.com/2008/04/mlb-%E7%8E%8B%E5%BB%BA%E6%B0%91-50-%E5%8B%9D%E5%88%B0%E6%89%8B%E4%BA%86%EF%BC%8C%E9%83%AD%E6%B3%93%E5%BF%97%E5%90%9E%E9%A6%96%E6%95%97/</link><pubDate>Wed, 23 Apr 2008 04:01:21 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/mlb-%E7%8E%8B%E5%BB%BA%E6%B0%91-50-%E5%8B%9D%E5%88%B0%E6%89%8B%E4%BA%86%EF%BC%8C%E9%83%AD%E6%B3%93%E5%BF%97%E5%90%9E%E9%A6%96%E6%95%97/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/2435314319/" title="o1189688508 (by appleboy46)"&gt;&lt;img src="https://i2.wp.com/farm4.static.flickr.com/3289/2435314319_559755b0ec.jpg?resize=500%2C375&amp;#038;ssl=1" title="o1189688508 (by appleboy46)" alt="o1189688508 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 感謝 &lt;a href="mailto:vinx@ptt.cc"&gt;vinx@ptt.cc&lt;/a&gt; 製作 &lt;a href="https://www.flickr.com/photos/appleboy/2435892408/" title="safepic (by appleboy46)"&gt;&lt;img src="https://i2.wp.com/farm3.static.flickr.com/2235/2435892408_309056f3a5.jpg?resize=500%2C371&amp;#038;ssl=1" title="safepic (by appleboy46)" alt="safepic (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 今天兩位同時登版，可是郭泓志吞首敗，但是王建民贏得50勝，亞洲最快50勝到手，太強了，今天多虧了打線阿，這才是真正的洋基，全壘打超多，阿布瑞由打出滿貫砲一發，領先了敵隊，然後 Jony Damon 後來的三分炮，大心，太感謝他們了，還有 Giambi 的 Solo 全壘打，真爽，今天如果看比賽一定會超級爽的，恭喜王建民50勝喔。&lt;/p&gt;</description></item><item><title>[申請教學] hinet 用戶網路空間申請教學，email 申請</title><link>https://blog.wu-boy.com/2008/04/%E7%94%B3%E8%AB%8B%E6%95%99%E5%AD%B8-hinet-%E7%94%A8%E6%88%B6%E7%B6%B2%E8%B7%AF%E7%A9%BA%E9%96%93%E7%94%B3%E8%AB%8B%E6%95%99%E5%AD%B8/</link><pubDate>Tue, 22 Apr 2008 13:45:01 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/%E7%94%B3%E8%AB%8B%E6%95%99%E5%AD%B8-hinet-%E7%94%A8%E6%88%B6%E7%B6%B2%E8%B7%AF%E7%A9%BA%E9%96%93%E7%94%B3%E8%AB%8B%E6%95%99%E5%AD%B8/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/2434045140/" title="blog_hinet_01 (by appleboy46)"&gt;&lt;img src="https://i2.wp.com/farm3.static.flickr.com/2162/2434045140_f3796be883.jpg?resize=500%2C317&amp;#038;ssl=1" title="blog_hinet_01 (by appleboy46)" alt="blog_hinet_01 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 最近在申請 &lt;a href="http://www.myweb.hinet.net/"&gt;hinet 網路空間&lt;/a&gt;的時候，發現 &lt;a href="http://www.myweb.hinet.net/"&gt;hinet 網路空間&lt;/a&gt;改版了，其實改版改的還算不錯，比較好用一點，申請的時候還是必須先去申請一個他們專屬的 &lt;a href="mailto:xxxx@msa.hinet.net"&gt;xxxx@msa.hinet.net&lt;/a&gt;，雖然我知道廣告信很多，可是還是要去申請，因為他是透過信箱才可以申請 &lt;a href="http://www.myweb.hinet.net/"&gt;hinet 網路空間&lt;/a&gt;，那底下就是網路空間申請教學。&lt;/p&gt;</description></item><item><title>[FreeBSD &amp; Linux] 架設時間伺服器 ntpd</title><link>https://blog.wu-boy.com/2008/04/freebsd-linux-%E6%9E%B6%E8%A8%AD%E6%99%82%E9%96%93%E4%BC%BA%E6%9C%8D%E5%99%A8-ntpd/</link><pubDate>Tue, 22 Apr 2008 01:36:53 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/freebsd-linux-%E6%9E%B6%E8%A8%AD%E6%99%82%E9%96%93%E4%BC%BA%E6%9C%8D%E5%99%A8-ntpd/</guid><description>&lt;p&gt;最近在調整系統時間，所以我利用了 Ntpd 伺服器，來微調系統時間，如果不利用這個方式，那可以利用我之前寫的調整系統時間：&lt;a href="http://blog.wu-boy.com/2007/06/22/112/"&gt;[FreeBSD] 修改系統時間 UTC -&amp;gt; CST&lt;/a&gt;，然而 Ntpd 會用一份時間伺服器的清單來間歇的檢查系統時間，它會取得這些時間伺服器的平均值，然後漸漸的調整系統時間。 FreeBSD 啟用 Ntpd 的方式： 步驟一：建立 /etc/ntp 這個目錄&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# 建立目錄
#
mkdir /etc/ntp
&lt;/pre&gt;</description></item><item><title>[WordPress] 好用的網站人數計數器喔 histats</title><link>https://blog.wu-boy.com/2008/04/wordpress-%E5%A5%BD%E7%94%A8%E7%9A%84%E7%B6%B2%E7%AB%99%E4%BA%BA%E6%95%B8%E8%A8%88%E6%95%B8%E5%99%A8%E5%96%94-histats/</link><pubDate>Sun, 20 Apr 2008 08:43:54 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/wordpress-%E5%A5%BD%E7%94%A8%E7%9A%84%E7%B6%B2%E7%AB%99%E4%BA%BA%E6%95%B8%E8%A8%88%E6%95%B8%E5%99%A8%E5%96%94-histats/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/2426748211/" title="wordpress_hit_01 (by appleboy46)"&gt;&lt;img src="https://i2.wp.com/farm3.static.flickr.com/2258/2426748211_ac79ddff26.jpg?resize=500%2C143&amp;#038;ssl=1" title="wordpress_hit_01 (by appleboy46)" alt="wordpress_hit_01 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 這是專門統計網站流量的網站，&lt;a href="http://www.histats.com/"&gt;官方網站&lt;/a&gt;，我自己用起來覺得非常的棒，自己在找軟體的時候找不到好的可以給 &lt;a href="http://wordpress.org/"&gt;wordpress&lt;/a&gt; 用的，當然我不確定 &lt;a href="http://wordpress.org/extend/plugins/"&gt;wordpress plugin&lt;/a&gt; 有沒有比較好的外掛，這套統計軟體，可以統計當天資料，referer，我覺得不輸給 &lt;a href="https://www.google.com/analytics"&gt;google analytics&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>[高雄美食] 正園雞腿飯</title><link>https://blog.wu-boy.com/2008/04/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F-%E6%AD%A3%E5%9C%92%E9%9B%9E%E8%85%BF%E9%A3%AF/</link><pubDate>Sat, 19 Apr 2008 03:54:17 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/%E9%AB%98%E9%9B%84%E7%BE%8E%E9%A3%9F-%E6%AD%A3%E5%9C%92%E9%9B%9E%E8%85%BF%E9%A3%AF/</guid><description>&lt;p&gt;上禮拜春假回高雄，跟小蚊子一起去吃得，其實在吃之前 survey PTT 的 Kaohsiung 版很久，看到一篇 &lt;a href="http://blog.xuite.net/cassie1029/cassie/15252645"&gt;【食】正園雞腿飯─鄧園連鎖 (高雄)&lt;/a&gt;，看到之後就想要馬上去吃了，所以就決定好晚上跟小蚊子一起去吃了。 這家主推雞腿飯，所以我就點雞腿飯，小蚊子點雞排飯，她很愛吃雞排，哈哈，其實我的雞腿飯，相片如下： &lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-3063"&gt;&lt;img src="https://i0.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_0404183143.JPG?w=300" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[生活日記] 中正大學通訊網路組烤肉活動</title><link>https://blog.wu-boy.com/2008/04/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E9%80%9A%E8%A8%8A%E7%B6%B2%E8%B7%AF%E7%B5%84%E7%83%A4%E8%82%89%E6%B4%BB%E5%8B%95/</link><pubDate>Fri, 18 Apr 2008 03:52:07 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E9%80%9A%E8%A8%8A%E7%B6%B2%E8%B7%AF%E7%B5%84%E7%83%A4%E8%82%89%E6%B4%BB%E5%8B%95/</guid><description>&lt;p&gt;&lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-3248"&gt;&lt;img src="https://i2.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_P4131860.JPG?w=300" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 就在 2008年4月13號 那天，網路組的烤肉活動，是個小團體烤肉，因為這是臨時起義的，就是在拔草那天，度爛名跟老師說可以烤肉，老師說可以，我們就去買了，哈哈，那天買的時候相當趕，因為什麼都沒有，烤肉架，土司，肉片一堆東西都要自己買，然後當天我跟至宣又在討論他們比賽的東西，就是 MySQL 的一點小問題而已，又小拖了一下才出門，出門的時候都下午4點了，結果因為度爛名太龜毛了，所以我們跑了很多家，家樂福，還有民雄的一些店，買到晚上七點才要回lab，我們差點被殺了，因為大家都快餓爆了，還好在車上我有偷吃了一些土司，哈哈，真爽&lt;/p&gt;</description></item><item><title>[MLB]洋基贏球，王建民無關勝負 A-rod 第4發全壘打</title><link>https://blog.wu-boy.com/2008/04/mlb%E6%B4%8B%E5%9F%BA%E8%B4%8F%E7%90%83%EF%BC%8C%E7%8E%8B%E5%BB%BA%E6%B0%91%E7%84%A1%E9%97%9C%E5%8B%9D%E8%B2%A0-a-rod-%E7%AC%AC4%E7%99%BC%E5%85%A8%E5%A3%98%E6%89%93/</link><pubDate>Thu, 17 Apr 2008 16:45:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/mlb%E6%B4%8B%E5%9F%BA%E8%B4%8F%E7%90%83%EF%BC%8C%E7%8E%8B%E5%BB%BA%E6%B0%91%E7%84%A1%E9%97%9C%E5%8B%9D%E8%B2%A0-a-rod-%E7%AC%AC4%E7%99%BC%E5%85%A8%E5%A3%98%E6%89%93/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/2421432264/" title="0417-mlb (by appleboy46)"&gt;&lt;img src="https://i2.wp.com/farm3.static.flickr.com/2389/2421432264_ce41faa0ef.jpg?resize=500%2C371&amp;#038;ssl=1" title="0417-mlb (by appleboy46)" alt="0417-mlb (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 昨天的比賽，雖然王建民投的不是很好，可是她也盡力了，她壓力很大，畢竟50勝的大關卡，不過這沒關西，下次在加油就好了，第一局就看到 A-rod 打全壘打，真是開心，底下就是 A-rod 第4支全壘打&lt;/p&gt;</description></item><item><title>[軟體] 好用的浮水印軟體，支援圖片浮水印跟文字浮水印 FastStone Photo Resizer</title><link>https://blog.wu-boy.com/2008/04/%E8%BB%9F%E9%AB%94-%E5%A5%BD%E7%94%A8%E7%9A%84%E6%B5%AE%E6%B0%B4%E5%8D%B0%E8%BB%9F%E9%AB%94%EF%BC%8C%E6%94%AF%E6%8F%B4%E5%9C%96%E7%89%87%E6%B5%AE%E6%B0%B4%E5%8D%B0%E8%B7%9F%E6%96%87%E5%AD%97/</link><pubDate>Thu, 17 Apr 2008 05:39:25 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/%E8%BB%9F%E9%AB%94-%E5%A5%BD%E7%94%A8%E7%9A%84%E6%B5%AE%E6%B0%B4%E5%8D%B0%E8%BB%9F%E9%AB%94%EF%BC%8C%E6%94%AF%E6%8F%B4%E5%9C%96%E7%89%87%E6%B5%AE%E6%B0%B4%E5%8D%B0%E8%B7%9F%E6%96%87%E5%AD%97/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/2419749999/" title="FastStone Photo Resizer_01 (by appleboy46)"&gt;&lt;img src="https://i2.wp.com/farm4.static.flickr.com/3006/2419749999_d9557398a9.jpg?resize=500%2C362&amp;#038;ssl=1" title="FastStone Photo Resizer_01 (by appleboy46)" alt="FastStone Photo Resizer_01 (by appleboy46)" data-recalc-dims="1" /&gt;&lt;/a&gt; 今天去 ptt 軟體版找浮水印的軟體，找到的這套我自己用起來感覺不錯，所以就寫一下教學給大家使用&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;軟體名稱： 浮水印軟體 FastStone Photo Resizer 官方網站： &lt;a href="http://www.faststone.org/FSResizerDetail.htm"&gt;英文網站&lt;/a&gt; 下載連結： &lt;a href="http://www.faststone.org/FSResizerDownload.htm"&gt;軟體下載&lt;/a&gt; 軟體版本： Version 2.5 軟體分類： 文書處理 執行平台： Windows 語言介面： 英文版 軟體特色： 小巧簡潔 推薦原因： 如果想要防盜圖的話，這軟體我相當推薦 誰適合用： 很適合大家使用&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>解決 WordPress 2.5 版本 RSS 摘要無法斷行</title><link>https://blog.wu-boy.com/2008/04/%E8%A7%A3%E6%B1%BA-wordpress-25-%E7%89%88%E6%9C%AC-rss-%E6%91%98%E8%A6%81%E7%84%A1%E6%B3%95%E6%96%B7%E8%A1%8C/</link><pubDate>Wed, 16 Apr 2008 12:41:20 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/%E8%A7%A3%E6%B1%BA-wordpress-25-%E7%89%88%E6%9C%AC-rss-%E6%91%98%E8%A6%81%E7%84%A1%E6%B3%95%E6%96%B7%E8%A1%8C/</guid><description>&lt;p&gt;今天在升級我的blog：&lt;a href="http://blog.wu-boy.com"&gt;小惡魔電腦技術 – AppleBOY’s Blog&lt;/a&gt; 跟 &lt;a href="http://life.wu-boy.com"&gt;小惡魔的生活日記&lt;/a&gt;，利用自己寫的： &lt;a href="http://blog.wu-boy.com/2008/04/16/177/"&gt;[Wordpress] Upgrade 2.2.x to 2.5 無痛升級法 For Linux or FreeBSD&lt;/a&gt; 這篇升級，但是升級好之後還去 &lt;a href="http://www.robbin.cc/vb/index.php"&gt;WordPress歡樂正體中文交流所&lt;/a&gt; 把教學貼過去，然後順便看看其他文章，看到這篇 &lt;a href="http://www.robbin.cc/vb/showthread.php?t=1493"&gt;更新至2.5後 RSS Reader問題&lt;/a&gt;，然後我自己去測試也發現同樣問題，裡面有一個人說沒問題，我是不知道他怎麼測試的，我自己是發生同樣問題。&lt;/p&gt;</description></item><item><title>[WordPress] Upgrade 2.2.x to 2.5 無痛升級法 For Linux or FreeBSD</title><link>https://blog.wu-boy.com/2008/04/wordpress-upgrade-22x-to-25-%E7%84%A1%E7%97%9B%E5%8D%87%E7%B4%9A%E6%B3%95-for-linux-or-freebsd/</link><pubDate>Wed, 16 Apr 2008 07:55:22 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/wordpress-upgrade-22x-to-25-%E7%84%A1%E7%97%9B%E5%8D%87%E7%B4%9A%E6%B3%95-for-linux-or-freebsd/</guid><description>&lt;p&gt;今天終於決定升級 &lt;a href="http://wordpress.org/"&gt;wordpress&lt;/a&gt; 的版本了，之前剛安裝好，都沒有時間去升級，剛剛去升級一下，發現其實步驟不會很複雜，所以一下子都弄好了，除非你的外掛很多，不然升級一定還蠻快的，我最後花的時間幾乎都是在升級 &lt;a href="http://wordpress.org/extend/plugins/"&gt;wordpress plugin&lt;/a&gt;，當然我是先去測試我的另一個生活部落格：&lt;a href="http://life.wu-boy.com"&gt;life.wu-boy.com&lt;/a&gt;，目前看起來是沒有什麼問題，所以待會會來生及其他的 &lt;a href="http://blog.wu-boy.com/"&gt;wordpress blog&lt;/a&gt;，底下來操作一遍吧 步驟一：備份資料庫，可以參考這篇 &lt;a href="http://blog.wu-boy.com/2007/04/08/92/"&gt;[Mysql] 資料庫備份[big5]utf8轉換成utf-8&lt;/a&gt;&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# 備份方式
#
mysqldump -u root -p database_name &gt; db_backup_name.sql
&lt;/pre&gt;</description></item><item><title>[SSHFS] 好用的 SSH Filesystem fusefs-sshfs in FreeBSD or Linux</title><link>https://blog.wu-boy.com/2008/04/linux-freebsd-%E5%A5%BD%E7%94%A8%E7%9A%84-ssh-filesystem-fusefs-sshfs-in-freebsd-or-linux/</link><pubDate>Tue, 15 Apr 2008 21:02:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/linux-freebsd-%E5%A5%BD%E7%94%A8%E7%9A%84-ssh-filesystem-fusefs-sshfs-in-freebsd-or-linux/</guid><description>&lt;p&gt;今天在 &lt;a href="http://www.ptt.cc"&gt;ptt&lt;/a&gt; &lt;a href="http://www.linux.org/"&gt;Linux&lt;/a&gt; 連線版文章看到有人問說，如何傳一檔案到其他的 linux 機器，有人推了一個軟體，我覺得相當不錯，就拿來玩看看了，這軟體就是 &lt;a href="http://fuse.sourceforge.net/sshfs.html"&gt;sshfs&lt;/a&gt; 這是一套可以直接掛載遠端機器目錄的軟體，走 ssh 協定，剛剛安裝了一下，發覺還蠻好用的，我在 &lt;a href="http://www.linux.org/"&gt;Linux&lt;/a&gt; 跟 &lt;a href="http://www.freebsd.org/"&gt;FreeBSD&lt;/a&gt; 上面都安裝好了，來紀錄一下步驟。 首先是安裝步驟 For FreeBSD，直接利用 ports 安裝即可：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# ports 安裝
#
# Port: fusefs-sshfs-1.8
# Path: /usr/ports/sysutils/fusefs-sshfs
# Info: Mount remote directories over ssh
# Maint: amistry@am-productions.biz
# pkg-config-0.22_1
# WWW: http://sourceforge.net/projects/fuse/

cd /usr/ports/sysutils/fusefs-sshfs; make install clean
&lt;/pre&gt;</description></item><item><title>[軟體] 擷取 Word 檔內圖片工具 [免安裝]</title><link>https://blog.wu-boy.com/2008/04/%E8%BB%9F%E9%AB%94-%E6%93%B7%E5%8F%96-word-%E6%AA%94%E5%85%A7%E5%9C%96%E7%89%87%E5%B7%A5%E5%85%B7-%E5%85%8D%E5%AE%89%E8%A3%9D/</link><pubDate>Sun, 13 Apr 2008 15:41:34 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/%E8%BB%9F%E9%AB%94-%E6%93%B7%E5%8F%96-word-%E6%AA%94%E5%85%A7%E5%9C%96%E7%89%87%E5%B7%A5%E5%85%B7-%E5%85%8D%E5%AE%89%E8%A3%9D/</guid><description>&lt;p&gt;今天在弄 office word 2003 需要裡面的圖檔，但是一直找不到有哪個功能可以把圖片存下來，所以就找了下面這個軟體，這軟體相當好用，免安裝，又可以儲存很多格式的圖片，png jpg gif 都可以喔，相當方便，所以介紹給大家使用&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;軟體名稱： 擷取 Word 檔內圖片工具 官方網站： &lt;a href="http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!825.entry"&gt;中文網站&lt;/a&gt; 下載連結： &lt;a href="http://tlcheng.twbbs.org/Tools/WordPic/WordPic.zip"&gt;軟體下載&lt;/a&gt; 軟體版本： v3.1.417 軟體分類： 文書處理 執行平台： Windows 語言介面： 繁體中文 軟體特色： 小巧簡潔 推薦原因： 抓 word 檔裡面的圖很好用 誰適合用： 很適合大家使用&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[MLB] 王建民第三勝 洋基 VS 紅襪第一戰 完投 9局</title><link>https://blog.wu-boy.com/2008/04/mlb-%E7%8E%8B%E5%BB%BA%E6%B0%91%E7%AC%AC%E4%B8%89%E5%8B%9D-%E6%B4%8B%E5%9F%BA-vs-%E7%B4%85%E8%A5%AA%E7%AC%AC%E4%B8%80%E6%88%B0-%E5%AE%8C%E6%8A%95-9%E5%B1%80/</link><pubDate>Sat, 12 Apr 2008 03:36:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/mlb-%E7%8E%8B%E5%BB%BA%E6%B0%91%E7%AC%AC%E4%B8%89%E5%8B%9D-%E6%B4%8B%E5%9F%BA-vs-%E7%B4%85%E8%A5%AA%E7%AC%AC%E4%B8%80%E6%88%B0-%E5%AE%8C%E6%8A%95-9%E5%B1%80/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/2406526693/" title="80324258EG022_NEW_YORK_YANK (by appleboy46tream)"&gt;&lt;img src="https://i0.wp.com/farm4.static.flickr.com/3242/2406526693_91ccfafaea.jpg?resize=500%2C362&amp;#038;ssl=1" title="80324258EG022_NEW_YORK_YANK (by appleboy46tream)" alt="80324258EG022_NEW_YORK_YANK (by appleboy46tream)" data-recalc-dims="1" /&gt;&lt;/a&gt; 今天早上 9點半起床，第一件事情就是看王建民投的如何，結果發現，投8局用了79個球，被打一隻安打，會不會太厲害了，對方可是紅襪，去年的冠軍隊伍，結果最後結果是完投9局，看來王建民越來越穩了，跟洋基其他投手比起來，差真多阿，不愧是台灣之光阿。&lt;/p&gt;</description></item><item><title>[軟體教學] zShare 使用 RapidUp 空間分享教學及 FreeGrab 下載教學</title><link>https://blog.wu-boy.com/2008/04/%E8%BB%9F%E9%AB%94-zshare-%E4%BD%BF%E7%94%A8-rapidup-%E7%A9%BA%E9%96%93%E5%88%86%E4%BA%AB%E6%95%99%E5%AD%B8%E5%8F%8A-freegrab-%E4%B8%8B%E8%BC%89%E6%95%99%E5%AD%B8/</link><pubDate>Fri, 11 Apr 2008 17:41:48 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/%E8%BB%9F%E9%AB%94-zshare-%E4%BD%BF%E7%94%A8-rapidup-%E7%A9%BA%E9%96%93%E5%88%86%E4%BA%AB%E6%95%99%E5%AD%B8%E5%8F%8A-freegrab-%E4%B8%8B%E8%BC%89%E6%95%99%E5%AD%B8/</guid><description>&lt;p&gt;&lt;img src="https://i0.wp.com/www.zshare.net/images/logo.gif?w=840" alt="null" data-recalc-dims="1" /&gt; 我想在目前網路上，最流行的分享空間，那就是 &lt;a href="http://www.hinet.net"&gt;hinet&lt;/a&gt; 空間跟 &lt;a href="http://www.zshare.net/"&gt;zShare&lt;/a&gt; 空間了，這兩個非常好用，第一 &lt;a href="http://www.hinet.net"&gt;Hinet&lt;/a&gt; 下載速度非常快，然後 &lt;a href="http://www.zshare.net/"&gt;zShare&lt;/a&gt; 則是非常穩定，不過本篇重點不是 Hinet 而是 zShare 空間，現在要是不會下載 zShare 空間的話，那你就落伍了，因為利用它可以找到很多好東西，而且大家都是利用這個空間做分享檔案。 首先先介紹下載的軟體：&lt;a href="http://vizshala.googlepages.com/freegrab"&gt;FreeGrab&lt;/a&gt; 【軟體名稱】FreeGrab v1.2.3.4.4 build Beta2 最新版模組腳本2008/04/10 【官方網址】http://vizshala.googlepages.com/freegrab 【軟體語言】繁體中文 【存放空間】BDG 【存放限期】30 天以上 【檔案格式】RAR 【檔案大小】1.3 MB 【下載工具】IE 【其他聲明】歡迎轉貼 【解壓密碼】：無&lt;/p&gt;</description></item><item><title>[軟體]Solid Converter PDF Professional PDF 轉 WORD 使用教學</title><link>https://blog.wu-boy.com/2008/04/%E8%BB%9F%E9%AB%94solid-converter-pdf-professional-v31417-pdf-%E8%BD%89-word-%E8%BB%9F%E9%AB%94%E5%85%8D%E5%AE%89%E8%A3%9D%E7%89%88/</link><pubDate>Thu, 10 Apr 2008 15:53:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/%E8%BB%9F%E9%AB%94solid-converter-pdf-professional-v31417-pdf-%E8%BD%89-word-%E8%BB%9F%E9%AB%94%E5%85%8D%E5%AE%89%E8%A3%9D%E7%89%88/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/2403628288/" title="PDF_2 (by appleboy46tream)"&gt;&lt;img src="https://i2.wp.com/farm3.static.flickr.com/2232/2403628288_e37a13878f.jpg?resize=500%2C290&amp;#038;ssl=1" title="PDF_2 (by appleboy46tream)" alt="PDF_2 (by appleboy46tream)" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;軟體名稱： Solid Converter PDF Professional PDF 轉 WORD 軟體 官方網站： &lt;a href="http://www.solidpdf.com/"&gt;http://www.solidpdf.com/&lt;/a&gt; 下載連結： &lt;a href="http://toget.pchome.com.tw/intro/business_wordprocessing/23417.html"&gt;PChome 軟體下載&lt;/a&gt; 軟體版本： v3.1.417 軟體分類： 文書處理 執行平台： Windows 語言介面： 繁體中文 軟體特色： 小巧簡潔 推薦原因： 我想大家很需要吧，尤其是研究生 誰適合用： 很適合大家使用&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[Ubuntu＆Fedora] 開機 網路卡 MAC 變動亂跳 [解決方法]</title><link>https://blog.wu-boy.com/2008/04/ubuntu%EF%BC%86fedora-%E9%96%8B%E6%A9%9F-%E7%B6%B2%E8%B7%AF%E5%8D%A1-mac-%E8%AE%8A%E5%8B%95%E4%BA%82%E8%B7%B3-%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95/</link><pubDate>Wed, 09 Apr 2008 06:35:59 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/ubuntu%EF%BC%86fedora-%E9%96%8B%E6%A9%9F-%E7%B6%B2%E8%B7%AF%E5%8D%A1-mac-%E8%AE%8A%E5%8B%95%E4%BA%82%E8%B7%B3-%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;最近在幫 lab 同學處理他安裝好的 &lt;a href="http://www.ubuntu.org.tw/"&gt;ubuntu&lt;/a&gt; linux，結果發現一個問題，就是只要重新開機，網路卡的 mac 就會改變，還真是奇怪，後來在 google 找到一篇文章：&lt;a href="http://www.karayou.com/redirect.php?tid=206006&amp;amp;goto=lastpost"&gt;Ubuntu的MAC一直亂跳嗎?&lt;/a&gt; 或者是ubuntu官方論壇：&lt;a href="http://ubuntuforums.org/showthread.php?p=4156690#post4156690"&gt;解決方法&lt;/a&gt;，才終於解決這個問題。 在主機板 GA-M56S-S3 這個系列板子都會有這種問題，至少我測試過兩張主機板都會這樣，所以看了那些解決方法，可以解決 ubuntu 的問題，但是不能解決 fedora core 的問題，我解決 fedora 的方法，其實很簡單，只要你會利用文字介面設定網路，就可以了 fedora 解法：前提是你不會讓機器開機亂跳動 ethx，所以你要按照上面的解法，解決前半部份 先在 root 底下新增一個檔案 ifcfg-eth0，然後寫入&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# Broadcom Corporation NetXtreme BCM5721 Gigabit Ethernet PCI Express
DEVICE=eth0
BOOTPROTO=none
BROADCAST=140.123.107.255
HWADDR=00:15:F2:A7:37:42
IPADDR=140.123.107.*
IPV6_AUTOCONF=yes
NETMASK=255.255.255.0
NETWORK=140.123.107.0
ONBOOT=yes
GATEWAY=140.123.107.249
TYPE=Ethernet
&lt;/pre&gt;</description></item><item><title>[Ubuntu] 快速修復開機選單，雙作業系統</title><link>https://blog.wu-boy.com/2008/04/ubuntu-%E5%BF%AB%E9%80%9F%E4%BF%AE%E5%BE%A9%E9%96%8B%E6%A9%9F%E9%81%B8%E5%96%AE%EF%BC%8C%E9%9B%99%E4%BD%9C%E6%A5%AD%E7%B3%BB%E7%B5%B1/</link><pubDate>Tue, 08 Apr 2008 05:22:18 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/ubuntu-%E5%BF%AB%E9%80%9F%E4%BF%AE%E5%BE%A9%E9%96%8B%E6%A9%9F%E9%81%B8%E5%96%AE%EF%BC%8C%E9%9B%99%E4%BD%9C%E6%A5%AD%E7%B3%BB%E7%B5%B1/</guid><description>&lt;p&gt;我想這應該是最基本的問題，在學linux之前，大家都會遇到的問題，比如說要先安裝linux，才安裝windows，或者是相反，當然初學者我是建議先裝 Windows 再來安裝 linux 系列，因為這樣 linux 系統會幫忙製作開機選單，當然如果之後重新安裝 linux 之後，自己就要去修復開機選單了，其實也難啦，先準備一片 ubuntu desktop cd 即可 放入光碟機，開機到桌面之後，先打開 terminal，作法如下&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# 切換到 root 權限
#
sudo su -

#
# 輸入 grub
#
grub
&lt;/pre&gt; 它就會切到 grub&gt; 底下了 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#
# 輸入"find /boot/grub/stage1"。會出現如同"(hd0)"樣的結果，在我的電腦上是"(hd1,4)"
#
find /boot/grub/stage1
#
#輸入"root (hd1,4)"。
#
root (hd1,4)
#
#輸入"setup (hd1,4)"，這是直接輸入到 Linux 的分割區，如果要輸入到 MBR 的話，那就是 setup (hd1)
#
setup (hd1)
&lt;/pre&gt; 然後重開機取出光碟片，重新開機就好了</description></item><item><title>美國職棒大連盟 MLB 080407 TB vs NYY 王建民第二勝</title><link>https://blog.wu-boy.com/2008/04/%E5%BD%B1%E7%89%87%E7%BE%8E%E5%9C%8B%E8%81%B7%E6%A3%92%E5%A4%A7%E9%80%A3%E7%9B%9F-mlb-080407-tb-vs-nyy-%E7%8E%8B%E5%BB%BA%E6%B0%91%E7%AC%AC%E4%BA%8C%E5%8B%9D/</link><pubDate>Mon, 07 Apr 2008 16:22:28 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/%E5%BD%B1%E7%89%87%E7%BE%8E%E5%9C%8B%E8%81%B7%E6%A3%92%E5%A4%A7%E9%80%A3%E7%9B%9F-mlb-080407-tb-vs-nyy-%E7%8E%8B%E5%BB%BA%E6%B0%91%E7%AC%AC%E4%BA%8C%E5%8B%9D/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/2396371208/" title="safepic (by appleboy46tream)"&gt;&lt;img src="https://i1.wp.com/farm3.static.flickr.com/2412/2396371208_ed1babaed8.jpg?resize=500%2C371&amp;#038;ssl=1" title="safepic (by appleboy46tream)" alt="safepic (by appleboy46tream)" data-recalc-dims="1" /&gt;&lt;/a&gt; 這場相當精彩，除了王建民部份，其他隊友也幫了很多忙，今天表現的相當棒，也幫助洋基隊止敗了，果然是洋基的 ace，當然後援投手也相當厲害，張伯倫，加上 Cano，太強了，第一時間雙殺，第七局必看阿。&lt;/p&gt;</description></item><item><title>[叔叔] 希望你在另外一個世界能夠過的開心</title><link>https://blog.wu-boy.com/2008/04/%E5%8F%94%E5%8F%94-%E5%B8%8C%E6%9C%9B%E4%BD%A0%E5%9C%A8%E5%8F%A6%E5%A4%96%E4%B8%80%E5%80%8B%E4%B8%96%E7%95%8C%E8%83%BD%E5%A4%A0%E9%81%8E%E7%9A%84%E9%96%8B%E5%BF%83/</link><pubDate>Mon, 07 Apr 2008 03:55:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/%E5%8F%94%E5%8F%94-%E5%B8%8C%E6%9C%9B%E4%BD%A0%E5%9C%A8%E5%8F%A6%E5%A4%96%E4%B8%80%E5%80%8B%E4%B8%96%E7%95%8C%E8%83%BD%E5%A4%A0%E9%81%8E%E7%9A%84%E9%96%8B%E5%BF%83/</guid><description>&lt;p&gt;總統大選那禮拜5早上坐著火車回到高雄，我請我爸爸開車來接我，2008.03.21號，在車上，我爸跟我說一件很沈重的事情，那就是，我叔叔去世了，我聽到很傻眼，因為真的很短，很短，去年12月第一次在大林慈濟看到叔叔，進去醫院化療，然而在這4個月裡面的變化竟然這麼大，癌症，我真的搞不懂你，因為你真的很厲害，完全殺不死你，你繼續蔓延在我叔叔的身體裡面，結果帶走了我叔叔的生命，也許這樣很好，這是我叔叔的一種解脫，聽到我爸講到一些比較令人震撼的事情，我聽到完全傻眼，原來我在電視上看到的情節，完全對應到我叔叔真實的世界。&lt;/p&gt;</description></item><item><title>[中正美食] 活動中心地下街咕咕雞排骨飯，大吃市竹軒排骨飯，宗翰的魚缸</title><link>https://blog.wu-boy.com/2008/04/%E4%B8%AD%E6%AD%A3%E7%BE%8E%E9%A3%9F-%E6%B4%BB%E5%8B%95%E4%B8%AD%E5%BF%83%E5%9C%B0%E4%B8%8B%E8%A1%97%E5%92%95%E5%92%95%E9%9B%9E%E6%8E%92%E9%AA%A8%E9%A3%AF%EF%BC%8C%E5%A4%A7%E5%90%83%E5%B8%82/</link><pubDate>Wed, 02 Apr 2008 03:57:52 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/%E4%B8%AD%E6%AD%A3%E7%BE%8E%E9%A3%9F-%E6%B4%BB%E5%8B%95%E4%B8%AD%E5%BF%83%E5%9C%B0%E4%B8%8B%E8%A1%97%E5%92%95%E5%92%95%E9%9B%9E%E6%8E%92%E9%AA%A8%E9%A3%AF%EF%BC%8C%E5%A4%A7%E5%90%83%E5%B8%82/</guid><description>&lt;p&gt;來寫一下中正美食好了，基本上，我能不吃炸的，就不吃炸的，畢竟吃炸的對身體不好吧，這次去吃中正大學活動中心地下街的咕咕雞美食的排骨飯，因為自助餐沒開，所以我才會跑去吃咕咕雞，其實去吃了之後發現還不錯啦，只是我不太喜歡吃套餐，是因為不能選菜，所以我怕吃到不喜歡吃得菜，比如說苦瓜，茄子，筍干之類的，我很挑食吧 底下先介紹咕咕雞的排骨飯 &lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-2735"&gt;&lt;img src="https://i0.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_0315131804.JPG?w=300" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 整體樣子&lt;/p&gt;</description></item><item><title>[棒球] 王建民第一場勝利到手</title><link>https://blog.wu-boy.com/2008/04/%E6%A3%92%E7%90%83-%E7%8E%8B%E5%BB%BA%E6%B0%91%E7%AC%AC%E4%B8%80%E5%A0%B4%E5%8B%9D%E5%88%A9%E5%88%B0%E6%89%8B/</link><pubDate>Tue, 01 Apr 2008 18:28:10 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/%E6%A3%92%E7%90%83-%E7%8E%8B%E5%BB%BA%E6%B0%91%E7%AC%AC%E4%B8%80%E5%A0%B4%E5%8B%9D%E5%88%A9%E5%88%B0%E6%89%8B/</guid><description>&lt;p&gt;&lt;img src="https://i1.wp.com/farm3.static.flickr.com/2063/2384498302_43d5ca018e.jpg?w=840&amp;#038;ssl=1" data-recalc-dims="1" /&gt; 開幕戰最大功臣非 A-rod 莫屬了，當天 3之2 打下洋基第一分打點，所以我就用了他的圖片，圖片提供者是：kisswatch at ptt.cc，感謝他的照片，照起來還真是清楚，想必相機一定不錯吧。&lt;/p&gt;</description></item><item><title>[相簿] Coppermine Photo Gallery Album Expander</title><link>https://blog.wu-boy.com/2008/04/%E7%9B%B8%E7%B0%BF-coppermine-photo-gallery-album-expander/</link><pubDate>Tue, 01 Apr 2008 07:48:01 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/04/%E7%9B%B8%E7%B0%BF-coppermine-photo-gallery-album-expander/</guid><description>&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/2378954219/" title="js_1 by appleboy46, on Flickr"&gt;&lt;img src="https://i0.wp.com/farm4.static.flickr.com/3022/2378954219_945799366e.jpg?resize=500%2C340&amp;#038;ssl=1" alt="js_1" data-recalc-dims="1" /&gt;&lt;/a&gt; 今天看到 gslin大神 文章：&lt;a href="http://blog.gslin.org/archives/2008/04/01/1463/"&gt;PIXNET Album Expander&lt;/a&gt;，然後裝了一下，發覺非常好用，而我自己本身也有架設相簿，相簿程式是 open source &lt;a href="http://coppermine-gallery.net/"&gt;Coppermine Photo Gallery&lt;/a&gt;，想說就自己練習看看，寫一個自己上傳相簿之後，可以快速瀏覽相簿，而這隻程式要先安裝好外掛 &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/748"&gt;Greasemonkey&lt;/a&gt;，這隻外掛我之前有介紹過：&lt;a href="http://blog.wu-boy.com/2008/02/23/140/"&gt;firefox and IE 的 greasemonkey&lt;/a&gt;，大家可以看看，google 上面也有很多文章 script：&lt;a href="http://userscripts.org/scripts/show/24610"&gt;Coppermine Photo Gallery Album Expander&lt;/a&gt; 測試相簿：&lt;a href="http://pic.wu-boy.com"&gt;我的相簿 Angel &amp;amp; Devil&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[分享] Windows Live Messenger 9.0+繁體中文化 + PLUS!4.5 +shell4.2大整合</title><link>https://blog.wu-boy.com/2008/03/%E5%88%86%E4%BA%AB-windows-live-messenger-90%E7%B9%81%E9%AB%94%E4%B8%AD%E6%96%87%E5%8C%96/</link><pubDate>Mon, 31 Mar 2008 10:12:37 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/%E5%88%86%E4%BA%AB-windows-live-messenger-90%E7%B9%81%E9%AB%94%E4%B8%AD%E6%96%87%E5%8C%96/</guid><description>&lt;p&gt;MSN9.0 Beta 主要新功能： 1. 可支援多點登錄，不同電腦或裝置可同時登入傳訊。 2. 更完整的音效設定，不同事件可設定不同音效 3. 登入時，可設定讓朋友聽到不同的登入音效 4. 回報SPAM垃圾訊息功能 5. 支援動態GIF圖大頭貼功能（大頭貼可以放Gif動畫） 6. 其他… MSN PLUS! 4.5 藉由完整的規劃來加強你即時傳訊的使用經驗。在不造成你不便的情況下，Plus! 為 Windows Live Messenger 增加了許多功能。你隨時可以從 Messenger 視窗的 Plus! 清單與 Messenger 介面的新按鈕來使用它們，增強的你的聊天經驗: 讓它們更有效率也更有趣 新功能: Skinning 原有的分頁模式 文字顏色 自訂音效 快捷文字等功能，都相當實用 kMSNShell 4.2.28.32 版 MSNShell 是一個為了支持 Windows Live Messenger 的發展，提供多種擴展服務及功能的免費增强包。它能幫助您的 MSN/WLM 實現多用戶登錄、加密聊天、截圖工能、查看最近聯繫人、滾動個性簽名、幻燈頭像等方便、實用的功能。 下載： &lt;a href="http://share.wu-boy.com/88329"&gt;http://share.wu-boy.com/88329&lt;/a&gt; 密碼：5vxk1&lt;/p&gt;</description></item><item><title>[FreeBSD] 利用 perl and shell script 大量建制帳號及 Quota</title><link>https://blog.wu-boy.com/2008/03/freebsd-%E5%88%A9%E7%94%A8-perl-and-shell-script-%E5%A4%A7%E9%87%8F%E5%BB%BA%E5%88%B6%E5%B8%B3%E8%99%9F%E5%8F%8A-quota/</link><pubDate>Fri, 28 Mar 2008 07:39:56 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/freebsd-%E5%88%A9%E7%94%A8-perl-and-shell-script-%E5%A4%A7%E9%87%8F%E5%BB%BA%E5%88%B6%E5%B8%B3%E8%99%9F%E5%8F%8A-quota/</guid><description>&lt;p&gt;最近幫繫上處理 &lt;a href="http://www.freebsd.org/"&gt;FreeBSD&lt;/a&gt; 機器，要碰到大量建制帳號跟 quota，所以上網找了一下教學，網路上就很多教學了，只不過要懂一些 &lt;a href="http://cpan.perl.org/"&gt;perl&lt;/a&gt; 跟 &lt;a href="http://linux.vbird.org/linux_basic/0340bashshell-scripts.php"&gt;shell script&lt;/a&gt; 的基本觀念，在弄起來會比較方便，時間也會縮短許多。 首先開帳號的話，就是利用 &lt;a href="http://www.freebsd.org/cgi/man.cgi?query=pw&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=FreeBSD+7.0-RELEASE&amp;amp;format=html"&gt;pw&lt;/a&gt; 這個指令了，這個裡指令非常強大，可以新增使用者，或者是修改使用者的特性，如登入的 shell，comment….等等 先產生一個 passwd.txt 裡面內容格式就是 “帳號,密碼”，這樣的格式&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;biomat,"xxxx"
biomed,"xxxx"
surface,"xxxx"
tissue,"xxxx"&lt;/pre&gt; 然後在寫一個 shell 檔去把它讀進來，shell 檔如下：</description></item><item><title>[轉貼] 兩塊錢的啟示–態度決定一個人的高度</title><link>https://blog.wu-boy.com/2008/03/%E8%BD%89%E8%B2%BC-%E5%85%A9%E5%A1%8A%E9%8C%A2%E7%9A%84%E5%95%9F%E7%A4%BA-%E6%85%8B%E5%BA%A6%E6%B1%BA%E5%AE%9A%E4%B8%80%E5%80%8B%E4%BA%BA%E7%9A%84%E9%AB%98%E5%BA%A6/</link><pubDate>Thu, 27 Mar 2008 04:00:03 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/%E8%BD%89%E8%B2%BC-%E5%85%A9%E5%A1%8A%E9%8C%A2%E7%9A%84%E5%95%9F%E7%A4%BA-%E6%85%8B%E5%BA%A6%E6%B1%BA%E5%AE%9A%E4%B8%80%E5%80%8B%E4%BA%BA%E7%9A%84%E9%AB%98%E5%BA%A6/</guid><description>&lt;p&gt;這是我朋友轉信給我的，所以我不太知道誰是原始作者是誰，不過這篇文章寫的還不錯，給各位大家參考看看，我也寫一些自己的想法。 文章內容如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;兩塊錢的啟示 有個年輕人到公司應聘會計，這位剛剛本科畢業的大學生在面試時就遭到拒絕，因為 他實在太年輕了。 公司找的是要有豐富工作經驗的資深會計人員，年輕人一再堅持，他對主考官說： 「請給我一次機會，讓我參加你們的筆試。」 主考官拗不過他，只好答應了他的請求，結果這為位年輕人居然通過了筆試，由人事 經理親自複試。 人事經理對這位年輕人非常有好感，因為他的筆試成績是最好的，不過年輕人的話 呢？ 讓經理極為失望，他坦率的對經理說自己沒有工作過，唯一的經驗就是在校時掌管學 生會的財務。 找一個毫無工作經驗的人做會計無疑是很不划算的，經理決定收兵。 他對年輕人說：「今天就到這裡吧!如有消息我們會打電話通知你。」 年輕人從座位上站起來，向經理點點頭，從口袋裡掏出兩塊錢雙手遞給經理：「不管 你們是否錄取我，請都給我打電話。」 經理從來沒有遇見過這種情況，竟一時呆了。不過他很快回過神來，問：「你怎麼知 道我們不給沒錄取的人打電話呢？」 「你剛才說有消息打電話，那言下之意就是說沒錄取的人就不打電話了。」 經理對這位年輕人產生了興趣，接著問：「如果你沒被錄取，我們打電話給你，你想 知道什麼呢？」 「請你們告訴我在什麼地方不能達到你們的要求，我在那方面不夠好，這樣我好加以 改進。」 「這兩塊錢是……」 年輕人微微一笑：「給沒錄取的人打電話不屬於貴公司的日常開 支，所以由我來付，請你們一定給我打電話。 「經理也微微一笑：「請你把這兩塊錢收回去，我們不會打電話給你了，我現在就通 知你，你被錄取了。」 很多人都不理解為什麼要找一個剛剛畢業的大學生，經理在工作會議上說： 「一開始就被拒絕，仍堅持參加筆試，說明他有堅強的毅力。 清算帳務 是一件十分繁瑣的工作，沒有足夠的耐心和堅強的毅力是不可能做好 的，坦言相告自己沒有工作經驗，則顯示他的誠實， 這對於從事財務會計的人尤為重要，即使不能錄取也希望得到別人的評價，證明他有 面對不足的勇氣和取於承擔責任及力求更好的上進心。 員工不可能在工作中不出現差錯，也不可能把每項工作都做得十分完美，我們可以接 受員工的失誤，卻不能接受員工滿於現狀止步不前。」 「 我們需要員工和企業共同前進，自己掏電話費，反應出他公私分明的良好意識。 堅強的毅力，可貴的誠實，敢於承擔責任的勇氣，力求更好的上進心，公私分明的做 人原則，都是公司所需要的， 經驗不足可以積累，公司發展的希望就寄託在這些優秀的年輕人身上。 」 ——態度，決定一個人的高度。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[BlogAD活動] 活動報名教學</title><link>https://blog.wu-boy.com/2008/03/blogad%E6%B4%BB%E5%8B%95-%E6%B4%BB%E5%8B%95%E5%A0%B1%E5%90%8D%E6%95%99%E5%AD%B8/</link><pubDate>Tue, 25 Mar 2008 16:54:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/blogad%E6%B4%BB%E5%8B%95-%E6%B4%BB%E5%8B%95%E5%A0%B1%E5%90%8D%E6%95%99%E5%AD%B8/</guid><description>&lt;p&gt;最近在本站台右邊拉了 &lt;a href="http://www.blogad.com.tw/"&gt;BlogAD&lt;/a&gt; 的廣告，最近該公司發起了一個抽獎活動，其實這抽獎活動目的就是拉越多人進來越好，然而加入會員的人也可以參加抽獎活動喔，而最主要的目的就是每拉一個人，我就可以得到額外50元的獎金，我覺得這相當不錯，如果想贊助本站台，也可以透過這個方式然達成這個目的，註冊的網站就是 &lt;a href="http://www.panelpower.com.tw/"&gt;東方快線網路市調&lt;/a&gt;，這網站你加入之後，她會不定時讓您參加問卷調查，調查完之後，會給你額外的獎金，不論是5元或者是10元，我覺得都相當不錯，累積到一定的程度之後，就可以兌換現金。 活動報名如下： &lt;a href="http://www.blogad.com.tw/Events/20080311_Eol/Edm.aspx?N=appleboy"&gt;&lt;img border="0" width="546" src="http://www.blogad.com.tw/Transfer/ToadEol.aspx?F_ID=15810&amp;#038;P_ID=50&amp;#038;WebLoginName=appleboy&amp;#038;A_ID=257&amp;#038;pic=546.gif" /&gt;&lt;/a&gt; 報名方式如下：&lt;/p&gt;</description></item><item><title>幫表弟組新電腦～</title><link>https://blog.wu-boy.com/2008/03/%E5%B9%AB%E8%A1%A8%E5%BC%9F%E7%B5%84%E6%96%B0%E9%9B%BB%E8%85%A6%EF%BD%9E/</link><pubDate>Mon, 24 Mar 2008 06:52:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/%E5%B9%AB%E8%A1%A8%E5%BC%9F%E7%B5%84%E6%96%B0%E9%9B%BB%E8%85%A6%EF%BD%9E/</guid><description>&lt;p&gt;禮拜五早上8點10分的火車回高雄，為了就是要幫表弟組一台新電腦，早上回到家裏，過一小時之後又跟我爸開車去買電腦了，在買電腦前，當然不會忘記先去原價屋看看價錢，估計一下自己買的預算，不過表弟是跟我說它預算2萬5左右，所以我就給它買到2萬5剛剛好，哈哈，還算蠻頂級的配備，底下有我買的配備表 &lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-2950"&gt;&lt;img src="https://i0.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_0321154837.JPG?w=300" border="0" alt="點選圖片以觀看原圖" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[FreeBSD] SNMP 統計流量分析 mrtg</title><link>https://blog.wu-boy.com/2008/03/freebsd-snmp-%E7%B5%B1%E8%A8%88%E6%B5%81%E9%87%8F%E5%88%86%E6%9E%90-mrtg/</link><pubDate>Thu, 20 Mar 2008 14:05:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/freebsd-snmp-%E7%B5%B1%E8%A8%88%E6%B5%81%E9%87%8F%E5%88%86%E6%9E%90-mrtg/</guid><description>&lt;p&gt;最近處理系上伺服器，安裝的是 &lt;a href="http://www.freebsd.org"&gt;FreeBSD&lt;/a&gt; 7.0 Release 版本，想說來裝個 &lt;a href="http://www.mrtg.com/"&gt;mrtg&lt;/a&gt; 來統計流量，因為目前 SNMP 已經納入 FreeBSD base 系統裡面了，所以在安裝 mrtg 就相當方便了，我之前有寫過三篇關於統計流量的教學 &lt;a href="http://blog.wu-boy.com/2006/12/05/51/"&gt;MRTG Server performace&lt;/a&gt; &lt;a href="http://blog.wu-boy.com/2006/11/28/47/"&gt;[Linux] Mrtg 實做 war3 線上人數統計&lt;/a&gt; &lt;a href="http://blog.wu-boy.com/2006/11/08/32/"&gt;[FreeBSD] 安裝基本mrtg主機流量統計圖&lt;/a&gt; &lt;a href="http://blog.wu-boy.com/2006/09/26/19/"&gt;[FC4] snmpd + mrtg 安裝教學「注意事項」&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[筆記] ssh Tunnel 運用在 Linux and Windows FireFox</title><link>https://blog.wu-boy.com/2008/03/%E7%AD%86%E8%A8%98-ssh-tunnel-%E9%81%8B%E7%94%A8%E5%9C%A8-linux-and-windows/</link><pubDate>Wed, 19 Mar 2008 05:11:34 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/%E7%AD%86%E8%A8%98-ssh-tunnel-%E9%81%8B%E7%94%A8%E5%9C%A8-linux-and-windows/</guid><description>&lt;p&gt;今天在看 &lt;a href="http://blog.gslin.org/"&gt;gslin&lt;/a&gt; 部落格的一篇文章：&lt;a href="http://blog.gslin.org/archives/2005/08/17/43/"&gt;穿越公司的 FireWall&lt;/a&gt;，看完之後我覺得相當不錯，可以解決我想要的 forwarding 的問題，以及繞過防火牆的機制，剛剛自己測試一下，發現還蠻好用的，其實利用這個方式還可以遠端管理很多伺服器，如：&lt;a href="http://www.mysql.com/"&gt;Mysql&lt;/a&gt; 伺服器…. SSH Tunnel必須建立於一個SSH連線上，它可以讓我們穿透防火牆，建立一個安全加密的傳輸。 例如：我們現在要透過 A主機去對 smtp 或者是 http 做連接的動作，那我們就必須先建立一個到A主機的SSH連線，然後在透過它建立 Tunnel 我們會使用到的putty和plink都可以在 &lt;a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html"&gt;這裡下載&lt;/a&gt;， 不過我更喜歡&lt;a href="http://www.csie.ntu.edu.tw/~piaip/pietty/"&gt;pietty&lt;/a&gt;，由&lt;a href="http://www.csie.ntu.edu.tw/~piaip/"&gt;piaip&lt;/a&gt;長輩製作。&lt;/p&gt;</description></item><item><title>[C/C++] 實做 C 語言 substr 功能，模擬計算機功能</title><link>https://blog.wu-boy.com/2008/03/cc-%E5%AF%A6%E5%81%9A-c-%E8%AA%9E%E8%A8%80-substr-%E5%8A%9F%E8%83%BD%EF%BC%8C%E6%A8%A1%E6%93%AC%E8%A8%88%E7%AE%97%E6%A9%9F%E5%8A%9F%E8%83%BD/</link><pubDate>Mon, 17 Mar 2008 14:05:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/cc-%E5%AF%A6%E5%81%9A-c-%E8%AA%9E%E8%A8%80-substr-%E5%8A%9F%E8%83%BD%EF%BC%8C%E6%A8%A1%E6%93%AC%E8%A8%88%E7%AE%97%E6%A9%9F%E5%8A%9F%E8%83%BD/</guid><description>&lt;p&gt;前天在幫學弟寫程式，寫一個計算機程式，題目如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;寫一程式模擬簡單的計算機 每個資料列含下列的運算子中的一個及其右運算元 假設左運算元存在累加器中(初值為0) 需要函式scan_data 有2個輸出參數回傳 從資料列讀入的運算子元和右運算元 亦需函式do_next_op 執行運算子的功能 此函式有2個輸入參數(運算子和運算元) 及一個輸入/輸出參數(累加器) 有效運算子有 + 加 – 減 * 乘 / 除 ^ 次方 q 結束 此計算器在每次運算後要顯示累加器之值 一個執行範例如下 +5.0 result so far is 5.0 ^2 result so far is 25.0 /2.0 result so far is 12.5 q0 final ressult is 12.5
上面是我學弟的題目，不過他有傳一份他朋友的作業給我看，我本身不太喜歡用 scanf，我比較喜歡用 fgets，但是後來遇到要切割文字的問題，也就是 C 語言沒有 substr 取字串的函式，所以利用底下來實做：&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[網路組] 電子專刊 3 月份</title><link>https://blog.wu-boy.com/2008/03/%E7%B6%B2%E8%B7%AF%E7%B5%84-%E9%9B%BB%E5%AD%90%E5%B0%88%E5%88%8A-3-%E6%9C%88%E4%BB%BD/</link><pubDate>Sun, 16 Mar 2008 07:33:11 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/%E7%B6%B2%E8%B7%AF%E7%B5%84-%E9%9B%BB%E5%AD%90%E5%B0%88%E5%88%8A-3-%E6%9C%88%E4%BB%BD/</guid><description>&lt;p&gt;&lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-2743"&gt;&lt;img src="https://i0.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_0315221418.JPG?w=300" alt="Click to view full size image" border="0" data-recalc-dims="1" /&gt;&lt;/a&gt; 在去年9月入學的時候，阿伯就把工作交接給我了，那時候才知道組刊每個月有開會一次，在我接下這任務之前，都是阿伯在操刀的，然後在他們那時候成員小幹，蜂哥，還有阿伯一起弄好一個新的 &lt;a href="http://journal.cn.ee.ccu.edu.tw/"&gt;journal&lt;/a&gt; 系統，之後就交接給我，也留下了一些 Bug 等我去解決，在我接手之後，我自己也有規劃了一下整個網路組的 Web 服務，目前是要弄成整合性的服務，就是先把所有 web 的網站整合在一台服務，然後後端跑 database 的服務一台，順便在對兩台伺服器做 data 的備份服務，&lt;a href="http://www.samba.org/rsync/"&gt;rsync&lt;/a&gt; 3.0 已經修正了一個 bug，也不算 bug，但是這對單一目錄，很多檔案或資料夾有效能上重大更新，所以加快備份服務，不過在這系統上面不會看到這個效能，所以大家看看就好。&lt;/p&gt;</description></item><item><title>[生活日記]三月中剪頭髮</title><link>https://blog.wu-boy.com/2008/03/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E4%B8%89%E6%9C%88%E4%B8%AD%E5%89%AA%E9%A0%AD%E9%AB%AE/</link><pubDate>Sun, 16 Mar 2008 04:01:03 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E4%B8%89%E6%9C%88%E4%B8%AD%E5%89%AA%E9%A0%AD%E9%AB%AE/</guid><description>&lt;p&gt;今天呢，跑去剪了頭髮，雖然說實驗室的同學都說我頭髮很短了，可是我已經留快1個半月的頭髮了，所以長得有點雜亂，就跟我們網路組的花圃一樣，都是需要修剪的，這樣才比較好看，底下了是我前幾天自己的髮型，還沒有剪過的，所以就留了一下紀錄來比較看看 &lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-2686"&gt;&lt;img src="https://i2.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_0315125226.JPG?w=300" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 宿舍拍的啦&lt;/p&gt;</description></item><item><title>[筆記][FreeBSD] 升級系統 upgrade FreeBSD 6.2 release to 7.0 release</title><link>https://blog.wu-boy.com/2008/03/%E7%AD%86%E8%A8%98freebsd-%E5%8D%87%E7%B4%9A%E7%B3%BB%E7%B5%B1-upgrade-freebsd-62-release-to-70-release/</link><pubDate>Fri, 14 Mar 2008 14:14:46 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/%E7%AD%86%E8%A8%98freebsd-%E5%8D%87%E7%B4%9A%E7%B3%BB%E7%B5%B1-upgrade-freebsd-62-release-to-70-release/</guid><description>&lt;p&gt;今天在 Sayya BBS 看到 JoeHorn 的個人版，裡面寫到 “[筆記] remote upgrade FreeBSD 6.2 -&amp;gt; 7.0” 這一篇文章，裡面寫的作法，我自己實做到我自己的機器，就成功了，作法如下 首先修改 /usr/share/examples/cvsup/stable-supfile，找到&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# Defaults that apply to all the collections
#
# IMPORTANT: Change the next line to use one of the CVSup mirror sites
# listed at http://www.freebsd.org/doc/handbook/mirrors.html.
*default host=CHANGE_THIS.FreeBSD.org
*default base=/var/db
*default prefix=/usr
# The following line is for 7-stable. If you want 6-stable, 5-stable,
# 4-stable, 3-stable, or 2.2-stable, change to "RELENG_6", "RELENG_5",
# "RELENG_4", "RELENG_3", or "RELENG_2_2" respectively.
*default release=cvs tag=RELENG_6
*default delete use-rel-suffix
&lt;/pre&gt;</description></item><item><title>[PHP][Xoops] 外掛 AMS 系統 bug ?</title><link>https://blog.wu-boy.com/2008/03/phpxoops-%E5%A4%96%E6%8E%9B-ams-%E7%B3%BB%E7%B5%B1-bug/</link><pubDate>Thu, 13 Mar 2008 14:40:01 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/phpxoops-%E5%A4%96%E6%8E%9B-ams-%E7%B3%BB%E7%B5%B1-bug/</guid><description>&lt;p&gt;上學期接任 &lt;a href="http://journal.cn.ee.ccu.edu.tw/"&gt;CN Journal&lt;/a&gt; 組刊管理者，上任網管阿伯，留下一堆bug給我解決，不過還好去 trace 一下 AMS 的 code 之後發現一些 code 怪怪的，也不知道是不是 AMS 系統的問題&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[BUG1]Preview button funcation error 修改AMS的編輯模組改為Koivi Editor，即可以解決無法正常預覽的功能 [BUG2]面板線上修改功能，只能看不能修改 這個問題是編寫該文章的作者，如要再次編輯修改該文章內容，需指定版本控制，否則無法修改 [BUG3]線上編輯有問題會PO上去出現空格過多(&lt;/br&gt;)&amp;lt;預覽跟po上去網頁不同&amp;gt; 建議先轉換成html複製在筆記本上編輯,編好在貼回去比較安全 [BUG4]封面下文字(前言)無法對齊有不規律跳行或莫名的空格 建議把前言文字先用筆記本貼成一排然後在貼到編輯區裏,即可恢復你想要的排版 如果只要有裝 AMS 跟 使用他內建的編輯器 Koivi 會出現很多斷行問題，因為他使用 html 編輯，所以按一次 enter 之後，他會出現 &lt;br /&gt;一次，然後系統又使用 nl2br，所以等於斷行兩次，當然我檢查了一下 AMS 裡面的 code 修改：modules/AMS/class/class.newsstory.php&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;function hometext($format="Show")
{
 $myts =&amp;#038; MyTextSanitizer::getInstance();
 $html = 1;
 $smiley = 1;
 $xcodes = 1;
 if ( $this-&gt;nohtml() ) {
 $html = 0;
 }
 if ( $this-&gt;nosmiley() ) {
 $smiley = 0;
 }
 switch ( $format ) {
 case "Show":
 $hometext = $myts-&gt;displayTarea($this-&gt;hometext,$html,$smiley,$xcodes);
 break;
 case "Edit":
 $hometext = $myts-&gt;htmlSpecialChars($this-&gt;hometext);
 break;
 case "Preview":
 $hometext = $myts-&gt;previewTarea($this-&gt;hometext,$html,$smiley,$xcodes);
 break;
 case "InForm":
 $hometext = $myts-&gt;htmlSpecialChars( $myts-&gt;stripSlashesGPC($this-&gt;hometext));
 break;
 case "N":
 $hometext = stripslashes($this-&gt;hometext);
 break;
 }
 return $hometext;
}
&lt;/pre&gt;</description></item><item><title>[WWW] FTP 的主動模式( active )和被動模式( passive )</title><link>https://blog.wu-boy.com/2008/03/www-ftp-%E7%9A%84%E4%B8%BB%E5%8B%95%E6%A8%A1%E5%BC%8F-active-%E5%92%8C%E8%A2%AB%E5%8B%95%E6%A8%A1%E5%BC%8F-passive/</link><pubDate>Wed, 12 Mar 2008 01:59:06 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/www-ftp-%E7%9A%84%E4%B8%BB%E5%8B%95%E6%A8%A1%E5%BC%8F-active-%E5%92%8C%E8%A2%AB%E5%8B%95%E6%A8%A1%E5%BC%8F-passive/</guid><description>&lt;p&gt;這一篇轉錄自 &lt;a href="http://forum.icst.org.tw/phpBB2/viewtopic.php?t=79"&gt;http://forum.icst.org.tw/phpBB2/viewtopic.php?t=79&lt;/a&gt; 目前 FTP 已經是大家必備的東西，那架站之前你必須先瞭解什麼是 主動模式( active )和被動模式( passive )&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;FTP 的主動模式( active )和被動模式( passive ) FTP 是一種檔傳輸協定 (File Transfer Protocol)，它的連線模式有兩種﹕ 主動模式( active )和被動模式( passive )。以下說明 FTP 的連線是怎樣建立的﹕ 在 active 模式下 (一般預設的模式)﹕ 1. FTP client 開啟一個隨機選擇的TCP port 呼叫 FTP server 的 port 21請求連線。當順 　利完成 Three-Way Handshake 之後，連線就成功建立，但這僅是命令通道的建立 　。 2.當兩端需要傳送資料的時候，client 透過命令通道用一個 port command 告訴 server 　，client可以用另一個TCP port 做數據通道。 3.然後 server 用 port 20 和剛才 client 所告知的 TCP port 建立數據連線。請注意：連 　線方向這是從 server 到 client 的，TCP 封包會有一個 SYN flag。 4.然後 client 會返回一個帶 ACK flag的確認封包﹐並完成另一次的 Three-Way 　Handshake 手續。這時候，數據通道才能成功建立。 5.開始數據傳送。 在 passive 模式下 1.FTP client 開啟一個隨機選擇的TCP port 呼叫 FTP server 的 port 21請求連線，並完 　成命令通道的建立。 2.當兩端需要傳送資料的時候，client 透過命令通道送一個 PASV command 給 　server，要求進入 passive 傳輸模式。 3.然後 server 像上述的正常模式之第 2 步驟那樣，挑一個TCP port ，並用命令通道 　告訴 client。 4.然後 client 用另一個TCP port 呼叫剛才 server 告知的 TCP port 來建立數據通道。此 　時封包帶 SYN flag。 5.server 確認後回應一個 ACK 封包。並完成所有交握手續?成功建立數據通道。 6.開始數據傳送。 在實際使用上, active mode 用來登入一些開設在主機上及沒有安裝防火牆的 FTP server，或是開設於 client side 的 FTP server！ Passive mode （簡稱 PASV）用來登入一些架設於防火牆保護下而又是開設於主機上的 FTP server！ 如果您覺得太深奧而弄不清楚, 那就先用預設的 active mode 登入, 失敗改用 passive mode 登入就是了。 PS: 並不是每套 FTP 軟體都支援 passive mode 登入&lt;/p&gt;</description></item><item><title>[Java] 正規取代表示法</title><link>https://blog.wu-boy.com/2008/03/java-%E6%AD%A3%E8%A6%8F%E5%8F%96%E4%BB%A3%E8%A1%A8%E7%A4%BA%E6%B3%95/</link><pubDate>Mon, 10 Mar 2008 04:21:42 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/java-%E6%AD%A3%E8%A6%8F%E5%8F%96%E4%BB%A3%E8%A1%A8%E7%A4%BA%E6%B3%95/</guid><description>&lt;p&gt;最近弄國科會計畫，所以都在碰 java 的東西，都在弄 &lt;a href="http://www.w3.org/TR/rdf-sparql-query/"&gt;sparql&lt;/a&gt; 跟 &lt;a href="http://www.w3.org/TR/rdf-schema/"&gt;rdf&lt;/a&gt; 的東西，昨天弄懂一些基本的 &lt;a href="http://www.w3.org/TR/rdf-sparql-query/"&gt;sparql&lt;/a&gt;，然而利用 sarql 語法取出來的數值不是我想要的，所以利用正規表示，把字串取代了。 我想取代的字串如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;( ?url = “LAB221″^^xsd:string ) 我只想要中間的 LAB221 的部份，然後我上網找了方法，總共可以使用兩種方法 第一種&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="brush: java; title: ; notranslate" title=""&gt;String result = "( ?url = \"LAB221\"^^xsd:string )";
// compile pattern
Pattern p = Pattern.compile("[^\"]+\"([^\"]+)\"[^\"]+");

// get matcher
Matcher m = p.matcher(result.replaceAll("[

&lt;li&gt;
 
&lt;/li&gt;]",""));

// test if match
if (m.matches()) {
 System.out.println(m.group(1));
}
else
{
 System.out.println("error");
}

/* 正規比對 */
&lt;/pre&gt; 上面感謝 ptt qrtt1 給我的一點啟示</description></item><item><title>[生活日記] 中正電機通訊網路組花圃</title><link>https://blog.wu-boy.com/2008/03/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E4%B8%AD%E6%AD%A3%E9%9B%BB%E6%A9%9F%E9%80%9A%E8%A8%8A%E7%B6%B2%E8%B7%AF%E7%B5%84%E8%8A%B1%E5%9C%83/</link><pubDate>Sun, 09 Mar 2008 04:02:13 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E4%B8%AD%E6%AD%A3%E9%9B%BB%E6%A9%9F%E9%80%9A%E8%A8%8A%E7%B6%B2%E8%B7%AF%E7%B5%84%E8%8A%B1%E5%9C%83/</guid><description>&lt;p&gt;上禮拜五跟這裡拜五整理了一下花圃，因為這花圃是大家網路組共同維護的，但是目前是由我的老師負責維護，好像其他老師都不太會管這方面的事情，所以我們老師很熱心的每個禮拜都跟我們一起整理花圃，這學期呢，交接給我們碩一這群學生，不過現在還是只有我們老師的學生下來整理花圃，希望以後可以號招更多人下來幫忙，底下就是我們的花圃照片 &lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-2301"&gt;&lt;img src="https://i1.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_0229161654.JPG?w=300" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 宗翰在整理花圃 &lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-2306"&gt;&lt;img src="https://i0.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_0229161814.JPG?w=300" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 我們的花圃跟後面的不太一樣吧，我們的比較整齊 &lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-2309"&gt;&lt;img src="https://i2.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_0229161921.JPG?w=300" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 我的老師在那邊整理，哈哈，被我偷拍&lt;/p&gt;</description></item><item><title>[Ubuntu] 安裝 apache php5 遇到的問題</title><link>https://blog.wu-boy.com/2008/03/ubuntu-%E5%AE%89%E8%A3%9D-apache-php5-%E9%81%87%E5%88%B0%E7%9A%84%E5%95%8F%E9%A1%8C/</link><pubDate>Fri, 07 Mar 2008 14:49:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/ubuntu-%E5%AE%89%E8%A3%9D-apache-php5-%E9%81%87%E5%88%B0%E7%9A%84%E5%95%8F%E9%A1%8C/</guid><description>&lt;p&gt;很奇怪的，今天在安裝 apache2 跟 php5 想說很簡單，可是安裝好，寫測試檔測試的時候，發現當會變成下載 php5 的檔案，然後我看了一下 apache2.conf 觀察到如下 &lt;IfModule mod_php5.c&gt; AddType application/x-httpd-php .php .phtml .php3 AddType application/x-httpd-php-source .phps &lt;/IfModule&gt; LoadModule php5_module /usr/lib/apache2/modules/libphp5.so 然後我去 /usr/lib/apache2/modules/ 底下看，也有看到 libphp5.so 這個檔案，但是就是不能執行 php，後來在 ubuntu 官網找到解答，解答方法如下&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;檢查 /etc/apache2/mods-enabled 內有沒有php5.conf , php5.load若沒有, 請 sudo a2enmod php5 重新啟動 apahce2 sudo /etc/init.d/apache2 restart
&lt;a href="http://www.ubuntu.org.tw/modules/newbb/viewtopic.php?viewmode=flat&amp;amp;type=&amp;amp;topic_id=5298&amp;amp;forum=9"&gt; http://www.ubuntu.org.tw/modules/newbb/viewtopic.php?viewmode=flat&amp;amp;type=&amp;amp;topic_id=5298&amp;amp;forum=9&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[phpBB2] 2.0.22 -&gt; 2.0.23 安全性修正版本釋出</title><link>https://blog.wu-boy.com/2008/03/phpbb2-2022-2023-%E5%AE%89%E5%85%A8%E6%80%A7%E4%BF%AE%E6%AD%A3%E7%89%88%E6%9C%AC%E9%87%8B%E5%87%BA/</link><pubDate>Thu, 06 Mar 2008 16:35:52 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/phpbb2-2022-2023-%E5%AE%89%E5%85%A8%E6%80%A7%E4%BF%AE%E6%AD%A3%E7%89%88%E6%9C%AC%E9%87%8B%E5%87%BA/</guid><description>&lt;p&gt;我在&lt;a href="http://phpbb-tw.net/phpbb/"&gt;竹貓星球&lt;/a&gt;看到這個消息的，自己本身有在玩 phpBB2 的系統，其實這套是我學 php 的開始，當初架設漫畫網站，就是提供給大家一個漫畫平台，不過後來倒了，因為自己 php 功力沒有像今天有基本的基礎，所以就沒在繼續經營了，不過我想這不會影響我用 phpBB 這套免費的系統，然而我還在這系統開發跟 &lt;a href="http://www.g6ftpserver.com/"&gt;Gene6 FTP Server&lt;/a&gt; 整合的外掛，自己無聊亂寫的，不過這不是正題，底下就是轉錄自&lt;a href="http://phpbb-tw.net/phpbb/"&gt;竹貓星球&lt;/a&gt;的文章。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[Fix] Correctly re-assign group moderator on user deletion (Bug #280) [Fix] Deleting a forum with multiple polls included (Bug #6740) [Fix] Fixed postgresql query for obtaining group moderator in groupcp.php (Bug #6550) [Fix] Selected field on first entry by default for font size within posting_body.tpl (Bug #7124) [Fix] Adjusted maxlength parameters in admin/styles_edit_body.tpl (Bug #81) [Fix] Fixed html output in make_forum_select if no forums present (Bug #436) [Fix] Fixed spelling error(s) in lang_admin.php (Bug #7172, #6978) [Fix] Correctly display censored words in admin panel (Bug #12271) [Fix] Do not allow soft hyphen \xAD in usernames (reported by Bander00) [Fix] Fixed the group permission system’s use of array access [Fix] Simple group permissions now work properly [Fix] Fix inability to export smilies (Bug #2265) [Fix] Fixing some problems with PHP5 and register_long_arrays off [Sec] Fix possible XSRF Vulnerability in private messaging and groups handling 資料來源: &lt;a href="http://www.phpbb.com/community/viewtopic.php?f=14&amp;amp;t=772285"&gt;http://www.phpbb.com/community/viewtopic.php?f=14&amp;amp;t=772285&lt;/a&gt; &lt;a href="http://phpbb-tw.net/phpbb/viewtopic.php?f=2&amp;amp;t=50362"&gt;http://phpbb-tw.net/phpbb/viewtopic.php?f=2&amp;amp;t=50362&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Java] 判斷字串是否是整數</title><link>https://blog.wu-boy.com/2008/03/java-%E5%88%A4%E6%96%B7%E5%AD%97%E4%B8%B2%E6%98%AF%E5%90%A6%E6%98%AF%E6%95%B4%E6%95%B8/</link><pubDate>Wed, 05 Mar 2008 13:53:25 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/java-%E5%88%A4%E6%96%B7%E5%AD%97%E4%B8%B2%E6%98%AF%E5%90%A6%E6%98%AF%E6%95%B4%E6%95%B8/</guid><description>&lt;p&gt;有時候必須知道輸入的字串是否是整數，如果不是的話，就要重新輸入，這有兩種作法 第一種是使用 try … catch … finally 的方法，如下&lt;/p&gt;
&lt;pre class="brush: java; title: ; notranslate" title=""&gt;public class test
{ 
	public static void main(String args[])
 {
 BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); 
 try{
 System.out.print("請輸入你要的數字:");
 int test = Integer.parseInt(buf.readLine()); 
 }
 catch(ArrayIndexOutOfBoundsException e)
 {
 System.out.println(e.toString() + "陣列程式發生錯誤"); 
 }
 catch(ArithmeticException e)
 {
 System.out.println(e.toString() + "數學發生錯誤"); 
 }
 catch(Exception e)
 {
 System.out.println(e.toString() + "程式發生錯誤");
 }
 finally
 {
 System.out.println("執行成功"); 
 }
	
 }
}
&lt;/pre&gt; 另外一種方法，是利用 while 然後利用 Character.isDigit 的方法 
&lt;pre class="brush: java; title: ; notranslate" title=""&gt;public class test2
{ 
	public static void main(String args[])
 {
 BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
 String price;
 boolean num = false;
 try{
 while(!num)
 {
 System.out.print("請輸入你要的數字:");
 price = buf.readLine();
 char[] price_array = price.toCharArray();
 for(int index=0; index &lt; price.length(); index++) 
 {
 if(!Character.isDigit(price_array[index])) 
 {
 System.out.println("您不是輸入數字");
 break;
 }
 else
 {
 System.out.println("您輸入正確的數字了");
 num =true;
 }
 }
 } 
 }
 catch(Exception e)
 {
 System.out.println(e.toString() + "程式發生錯誤");
 } 
 }
}
[/code]
PTT 的 java 版的 TonyQ 提供另一種寫法




public class test3
{ 
	public static void main(String args[])
 {
 try
 {
 BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
 System.out.print("請輸入數字：");
 String inputStr = input.readLine();

 while (inputStr == null || !inputStr.matches("[0-9]+"))
 {
 System.out.print("輸入錯誤，請重新輸入數字：");
 inputStr = input.readLine();
 }

 int num=Integer.parseInt(inputStr);

 System.out.println("輸入的數字是："+num);
 }
 catch (IOException e) //for readLine()
 {
 e.printStackTrace();
 }
 }
}
&lt;/pre&gt; 然後在 javaworld 版，看到有人介紹 String與基本資料型態(int byte...等)之間的轉換 如下 
&lt;blockquote&gt;
&lt;p&gt;轉錄自java連線版 發信人: TAHO, 看板: java 精華區 標 題: String與基本資料型態(int byte&amp;hellip;等)之間的轉換 發信站: 140.126.22.6 竹師風之坊 Origin: Local 1. 由 基本資料型態轉換成 String String 類別中已經提供了將基本資料型態轉換成 String 的 static 方法 也就是 String.valueOf() 這個參數多載的方法 有下列幾種 String.valueOf(boolean b) : 將 boolean 變數 b 轉換成字串 String.valueOf(char c) : 將 char 變數 c 轉換成字串 String.valueOf(char[] data) : 將 char 陣列 data 轉換成字串 String.valueOf(char[] data, int offset, int count) : 將 char 陣列 data 中 由 data[offset] 開始取 count 個元素 轉換成字串 String.valueOf(double d) : 將 double 變數 d 轉換成字串 String.valueOf(float f) : 將 float 變數 f 轉換成字串 String.valueOf(int i) : 將 int 變數 i 轉換成字串 String.valueOf(long l) : 將 long 變數 l 轉換成字串 String.valueOf(Object obj) : 將 obj 物件轉換成 字串, 等於 obj.toString() 用法如: int i = 10; String str = String.valueOf(i); 這時候 str 就會是 &amp;ldquo;10&amp;rdquo; 2. 由 String 轉換成 數字的基本資料型態 要將 String 轉換成基本資料型態轉 大多需要使用基本資料型態的包裝類別 比如說 String 轉換成 byte 可以使用 Byte.parseByte(String s) 這一類的方法如果無法將 s 分析 則會丟出 NumberFormatException byte : Byte.parseByte(String s) : 將 s 轉換成 byte Byte.parseByte(String s, int radix) : 以 radix 為基底 將 s 轉換為 byte 比如說 Byte.parseByte(&amp;ldquo;11&amp;rdquo;, 16) 會得到 17 double : Double.parseDouble(String s) : 將 s 轉換成 double float : Double.parseFloat(String s) : 將 s 轉換成 float int : Integer.parseInt(String s) : 將 s 轉換成 int long : Long.parseLong(String s) : 將 s 轉換成 long 用法如:&lt;/p&gt;</description></item><item><title>[中正大學] 上課無聊拍</title><link>https://blog.wu-boy.com/2008/03/%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8-%E4%B8%8A%E8%AA%B2%E7%84%A1%E8%81%8A%E6%8B%8D/</link><pubDate>Mon, 03 Mar 2008 04:03:07 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8-%E4%B8%8A%E8%AA%B2%E7%84%A1%E8%81%8A%E6%8B%8D/</guid><description>&lt;p&gt;這是載我生日的當天上課被拍的，雖然大家都不知道我生日，所以我要低調阿，這學期這堂課第一次上課，宗翰拿著我的手機亂拍，照片如下 &lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-2287"&gt;&lt;img src="https://i1.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_0225143150.JPG?w=300" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 這是後面吧～ &lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-2289"&gt;&lt;img src="https://i0.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_0225143216.JPG?w=300" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 這張是側面，我發現我不管哪一面都還不錯阿，哈哈 &lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-2288"&gt;&lt;img src="https://i0.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_0225143209.JPG?w=300" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 這是我朋友小夢，哈哈，裝啥鬼臉 &lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-2290"&gt;&lt;img src="https://i0.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_0225143233.JPG?w=300" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 宗翰的手機吊飾 &lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-2294"&gt;&lt;img src="https://i2.wp.com/pic.wu-boy.com/albums/userpics/10001/normal_0226111220.JPG?w=300" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt; 我喝水的瓶子&lt;/p&gt;</description></item><item><title>[java] 在 linux 底下使用 java 來執行 Linux 指令</title><link>https://blog.wu-boy.com/2008/03/java-%E5%9C%A8-linux-%E5%BA%95%E4%B8%8B%E4%BD%BF%E7%94%A8-java-%E4%BE%86%E5%9F%B7%E8%A1%8C-linux-%E6%8C%87%E4%BB%A4/</link><pubDate>Sat, 01 Mar 2008 14:14:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/java-%E5%9C%A8-linux-%E5%BA%95%E4%B8%8B%E4%BD%BF%E7%94%A8-java-%E4%BE%86%E5%9F%B7%E8%A1%8C-linux-%E6%8C%87%E4%BB%A4/</guid><description>&lt;p&gt;其實可以在 linux 底下去寫 shell script 然後去執行 java 程式，而並非用 java 去執行 Linux 指令，不過java也是可以做到執行 shell command，底下就是我寫的 java 測試 code，去列出自己所在的目錄底下的檔案 ls 這個指令&lt;/p&gt;
&lt;pre class="brush: java; title: ; notranslate" title=""&gt;import java.io.*;
import java.net.*;
import java.util.*;

public class runstart{
 public static void main(String a[]) throws Exception{
 Process pl = Runtime.getRuntime().exec("/bin/ls");
 String line = "";
 BufferedReader p_in = new BufferedReader(new InputStreamReader(pl.getInputStream()));
 while((line = p_in.readLine()) != null){
 System.out.println(line);
 }
 p_in.close();
 }
}
&lt;/pre&gt; 參考 
&lt;p&gt;&lt;a href="http://debut.cis.nctu.edu.tw/~ching/Course/JavaCourse/05_input_output/02_input_output.htm"&gt;http://debut.cis.nctu.edu.tw/~ching/Course/JavaCourse/05_input_output/02_input_output.htm&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[C/C++] 判斷字串是否為數字</title><link>https://blog.wu-boy.com/2008/03/cc-%E5%88%A4%E6%96%B7%E5%AD%97%E4%B8%B2%E6%98%AF%E5%90%A6%E7%82%BA%E6%95%B8%E5%AD%97/</link><pubDate>Sat, 01 Mar 2008 08:39:09 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/03/cc-%E5%88%A4%E6%96%B7%E5%AD%97%E4%B8%B2%E6%98%AF%E5%90%A6%E7%82%BA%E6%95%B8%E5%AD%97/</guid><description>&lt;p&gt;常常在寫 C 語言，有時候想判斷輸入的是否為數字，如果不是的話，要重新輸入，所以寫一下怎麼判斷的，ptt提供了下面很多函式&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;isalnum ctype.h 測試某一整數值是否為’A’-‘Z’,’a’-‘z’,’0′-‘9’等文數字之一。 isalpha ctype.h 測試某一整數值是否為’A’-‘Z’,’a’-‘z’,等字母之一。 isascii ctype.h 如果ch的值判於0-127，則傳回非零整數(0x00-0x7F)。 iscntrl ctype.h 如果ch是一刪除字元或一般控制字元，則傳回非零整數(0x7F或0x00-0x1F)。 isdigit ctype.h 如果ch是一數字，則傳回非零整數。 isgraph ctype.h 如果ch是為可列印字元，則傳回非零整數。 islower ctype.h ch若為小寫字母，則傳回非零整數。 isprint ctype.h ch若為可列印字元，則傳回非零整數。其功能與isgraph相似。 ispunct ctype.h ch若為標點符號，則傳回非零整數。 isspace ctype.h ch若為空白字元或定位字元(Tab)，歸位字元(Enter鍵)，新列字元，垂直定位字元，換頁字元，則傳回非零整數。 isupper ctype.h ch若為大寫字母，則傳回非零整數。 isxdigit ctype.h ch若為一個十六進位數字，則傳回非零整數
用程式去判斷會更快，因為上面的函式，都是要單一字元去檢查，非常不方便，所以就寫了底下的程式&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[C/C++] 判斷年份是否閏年</title><link>https://blog.wu-boy.com/2008/02/cc-%E5%88%A4%E6%96%B7%E5%B9%B4%E4%BB%BD%E6%98%AF%E5%90%A6%E9%96%8F%E5%B9%B4/</link><pubDate>Sat, 01 Mar 2008 05:57:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/02/cc-%E5%88%A4%E6%96%B7%E5%B9%B4%E4%BB%BD%E6%98%AF%E5%90%A6%E9%96%8F%E5%B9%B4/</guid><description>&lt;p&gt;無聊幫同學寫作業，其實這還蠻簡單的，判斷閏年的方法如下&lt;/p&gt;
&lt;p&gt;1、可以被4整除但不可以被100整除。 2、可以被400整除。&lt;/p&gt;
&lt;p&gt;程式碼如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-15"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-16"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-17"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-18"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-18"&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-19"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-19"&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-20"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-20"&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-21"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-21"&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-22"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-22"&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-23"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-23"&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-24"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-24"&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-25"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-25"&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-26"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-26"&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-27"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-27"&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-28"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-28"&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-29"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-29"&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-30"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-30"&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-31"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-31"&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-32"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-32"&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-33"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-33"&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-34"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-34"&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-35"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-35"&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#include&lt;/span&gt; &lt;span style="color:#1e889b"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#1e889b"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#include&lt;/span&gt; &lt;span style="color:#1e889b"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span style="color:#1e889b"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#include&lt;/span&gt; &lt;span style="color:#1e889b"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span style="color:#1e889b"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; &lt;span style="color:#008b45"&gt;leap&lt;/span&gt;(&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; year);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; &lt;span style="color:#008b45"&gt;leap&lt;/span&gt;(&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; year)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;if&lt;/span&gt;((year%&lt;span style="color:#b452cd"&gt;4&lt;/span&gt;)==&lt;span style="color:#b452cd"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; (year%&lt;span style="color:#b452cd"&gt;100&lt;/span&gt;)!=&lt;span style="color:#b452cd"&gt;0&lt;/span&gt; || (year%&lt;span style="color:#b452cd"&gt;400&lt;/span&gt;) ==&lt;span style="color:#b452cd"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;printf&lt;/span&gt; (&lt;span style="color:#cd5555"&gt;&amp;#34;%d是閏年&lt;/span&gt;&lt;span style="color:#cd5555"&gt;\n&lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;,year);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;printf&lt;/span&gt; (&lt;span style="color:#cd5555"&gt;&amp;#34;%d不是閏年&lt;/span&gt;&lt;span style="color:#cd5555"&gt;\n&lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;,year);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; &lt;span style="color:#008b45"&gt;main&lt;/span&gt;(&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; argc,&lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; *argv[])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; *p; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; year[&lt;span style="color:#b452cd"&gt;20&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;printf&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;請輸入您要查詢的年份『輸入exit離開』: &amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;while&lt;/span&gt;(&lt;span style="color:#008b45"&gt;fgets&lt;/span&gt;(year, &lt;span style="color:#8b008b;font-weight:bold"&gt;sizeof&lt;/span&gt;(year), stdin))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;if&lt;/span&gt; ((p = &lt;span style="color:#008b45"&gt;strchr&lt;/span&gt;(year, &lt;span style="color:#cd5555"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;)) != &lt;span style="color:#658b00"&gt;NULL&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; *p = &lt;span style="color:#cd5555"&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;if&lt;/span&gt;(!&lt;span style="color:#008b45"&gt;strcmp&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;exit&amp;#34;&lt;/span&gt;, year))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;leap&lt;/span&gt;(&lt;span style="color:#008b45"&gt;atoi&lt;/span&gt;(year)); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;printf&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;請輸入您要查詢的年份『輸入exit離開』: &amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>[blog] 部落格線上傳送訊息到 google talk</title><link>https://blog.wu-boy.com/2008/02/blog-%E9%83%A8%E8%90%BD%E6%A0%BC%E7%B7%9A%E4%B8%8A%E5%82%B3%E9%80%81%E8%A8%8A%E6%81%AF%E5%88%B0-google-talk/</link><pubDate>Thu, 28 Feb 2008 08:18:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/02/blog-%E9%83%A8%E8%90%BD%E6%A0%BC%E7%B7%9A%E4%B8%8A%E5%82%B3%E9%80%81%E8%A8%8A%E6%81%AF%E5%88%B0-google-talk/</guid><description>&lt;p&gt;這個訊息是在 &lt;a href="http://briian.com/"&gt;重灌狂人&lt;/a&gt; 那邊看到的，我用起來相當不錯，所以套用了我的 &lt;a href="http://blog.wu-boy.com/"&gt;電腦blog&lt;/a&gt; 跟 &lt;a href="http://life.wu-boy.com/"&gt;生活blog&lt;/a&gt;，那底下就來介紹怎麼把這個功能用在部落格上面 目前我是弄在 &lt;a href="http://wordpress.org"&gt;wordpress&lt;/a&gt; 上面，有可以達到我的需求，首先登入 &lt;a href="http://www.google.com/talk/service/badge/New"&gt;網頁版的Google Talk聊天面板&lt;/a&gt;，然後自己設定一下名稱按送出，他會給你一段 frame 的程式碼，然後你要把他寫到 wordpress 的 theme 程式裡面 到 /wp-content/your_theme/sidebar.php 檔案裡面，每個 theme 設計方式不同，所以大家注意一下&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;&lt;li class="sidebox"&gt;
 &lt;h2&gt;
 &lt;?php _e('Categories'); ?&gt;
 &lt;/h2&gt;
 	
 
 &lt;ul&gt;
 &lt;?php 
		if (function_exists('wp_list_categories')) 
		{	
			wp_list_categories('show_count=1&amp;#038;title_li='); 
		}
		else 
		{ 
			wp_list_cats('optioncount=1'); 
		} 
		?&gt;
 	
 &lt;/ul&gt;
 
&lt;/li&gt;
&lt;/pre&gt; 在這後面加入 
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;&lt;li class="sidebox"&gt;
 &lt;h2&gt;
 &lt;?php _e('google 線上交談'); ?&gt;
 &lt;/h2&gt;
 	
 
 &lt;ul&gt;
 
 &lt;/ul&gt;
 
&lt;/li&gt;
&lt;/pre&gt; 你會在你 blog 上面發現底下這圖案 
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/2297991458/" title="google by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm4.static.flickr.com/3100/2297991458_abeb0033c2_o.jpg?resize=206%2C106&amp;#038;ssl=1" alt="google" border="0" data-recalc-dims="1" /&gt;&lt;/a&gt; 如果你 google talk 在線上，他就會顯示藍色的喔，這樣就代表成功了&lt;/p&gt;</description></item><item><title>[Java] 安裝好 Jdk 設定 path 跟 classpath 路徑</title><link>https://blog.wu-boy.com/2008/02/java-%E5%AE%89%E8%A3%9D%E5%A5%BD-jdk-%E8%A8%AD%E5%AE%9A-path-%E8%B7%AF%E5%BE%91/</link><pubDate>Wed, 27 Feb 2008 10:40:39 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/02/java-%E5%AE%89%E8%A3%9D%E5%A5%BD-jdk-%E8%A8%AD%E5%AE%9A-path-%E8%B7%AF%E5%BE%91/</guid><description>&lt;p&gt;今天剛裝好 jdk 新版 jdk1.6.0_04，如要下載請到 &lt;a href="http://java.sun.com/javase/downloads/index.jsp"&gt;這裡&lt;/a&gt; 下載，裝好之後當然底下要找編譯檔案，就是要去 bin 這個資料夾，然後找到 javac 跟 java 執行檔就可以了，不過如果你要在任何地方都要使用這個執行檔，就要去修改 path，設定方法如下 &lt;a href="https://www.flickr.com/photos/appleboy/2296039572/" title="java_1 by appleboy46, on Flickr"&gt;&lt;img src="https://i2.wp.com/farm4.static.flickr.com/3283/2296039572_21e85b77f0_o.jpg?resize=419%2C479&amp;#038;ssl=1" alt="java_1" border="0" data-recalc-dims="1" /&gt;&lt;/a&gt; 我的電腦右鍵-&amp;gt;內容 k&lt;/p&gt;</description></item><item><title>[生活日記] 回到中正一個多禮拜了</title><link>https://blog.wu-boy.com/2008/02/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E5%9B%9E%E5%88%B0%E4%B8%AD%E6%AD%A3%E4%B8%80%E5%80%8B%E5%A4%9A%E7%A6%AE%E6%8B%9C%E4%BA%86/</link><pubDate>Wed, 27 Feb 2008 04:06:49 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/02/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E5%9B%9E%E5%88%B0%E4%B8%AD%E6%AD%A3%E4%B8%80%E5%80%8B%E5%A4%9A%E7%A6%AE%E6%8B%9C%E4%BA%86/</guid><description>&lt;p&gt;在這個禮拜，非常的忙，也不知道自己在忙什麼，不過過的很充實就是了，這學期修了六門課，在加上一門專題演講，這對研究所來說，算很大了，感覺一天24小時不夠用，不過很希望自己能夠進步，尤其是英文阿，我看 paper 速度還不夠快啦，所以要警惕自己，畢竟再過一學期，就要升上碩二了，更加要讓自己更有實力，這樣我在接別人傳承下來的工作，才可以繼續保持下去阿。&lt;/p&gt;</description></item><item><title>[WWW] firefox and IE 的 greasemonkey</title><link>https://blog.wu-boy.com/2008/02/www-firefox-and-ie-%E7%9A%84-greasemonkey/</link><pubDate>Sat, 23 Feb 2008 08:30:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/02/www-firefox-and-ie-%E7%9A%84-greasemonkey/</guid><description>&lt;p&gt;最近發現這種新玩意，那就是猴子外掛 &lt;a href="http://zh.wikipedia.org/wiki/Greasemonkey"&gt;Greasemonkey&lt;/a&gt;，這一套我在 FireFox 有找到，用起來還不錯，可是一些 for ie 的網站，就使用不到了，所以我又另外去找了 &lt;a href="http://zh.wikipedia.org/wiki/Greasemonkey"&gt;Greasemonkey&lt;/a&gt; for ie 的版本，不過 for ie 的版本有兩套，一套是我想要，另一套我測試起來不是我想要的。 先介紹 for ie 的 &lt;a href="http://zh.wikipedia.org/wiki/Greasemonkey"&gt;Greasemonkey&lt;/a&gt;，總共有兩套 1.&lt;a href="http://www.gm4ie.com/"&gt;gm4ie&lt;/a&gt; 這一套了，其實相當不錯，不過有一個缺點，就是如果你的網站是用 iframe 做的化，他必需要重新 reload 整個網站，才會有作用，所以我並不打算用這套，不然他還是蠻方便的 2.&lt;a href="http://www.bhelpuri.net/Trixie/"&gt;Trixie&lt;/a&gt; 這個，就有符合到我的要求了，不過他在設定上面格式都要先寫好&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate" title=""&gt;// ==UserScript==
// @name Server2
// @description	 .
// @namespace http://musicplayer.sourceforge.net/greasemonkey
// @include http://xxxxxxxxx/index2/main_down.php*
// @include http://xxxxxxxxx/index2/main_down.php*
&lt;/pre&gt; 所有套用的網站，都要寫在 // @include 這個裡面才會有作用，然後在用 ie alt+t +x 就可以更改 reload 設定了 3. 
&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/748"&gt;Greasemonkey :: Firefox Add-ons&lt;/a&gt; FireFox 的部份，這個外掛裝好，你在啟動他的時候，會要求你選擇編輯 js 的軟體，請務必選 notepad.exe ，不然你選擇其他程式，你就會編輯不到檔案，那他檔案的放置位置如下 C:\Documents and Settings\你的帳號\Application Data\Mozilla\Firefox\Profiles\qvq3wzwh.default\gm_scripts&lt;/p&gt;</description></item><item><title>[轉錄文章] 如果你沒有心，我憑什麼教你</title><link>https://blog.wu-boy.com/2008/02/%E8%BD%89%E9%8C%84%E6%96%87%E7%AB%A0-%E5%A6%82%E6%9E%9C%E4%BD%A0%E6%B2%92%E6%9C%89%E5%BF%83%EF%BC%8C%E6%88%91%E6%86%91%E4%BB%80%E9%BA%BC%E6%95%99%E4%BD%A0/</link><pubDate>Tue, 19 Feb 2008 04:09:49 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/02/%E8%BD%89%E9%8C%84%E6%96%87%E7%AB%A0-%E5%A6%82%E6%9E%9C%E4%BD%A0%E6%B2%92%E6%9C%89%E5%BF%83%EF%BC%8C%E6%88%91%E6%86%91%E4%BB%80%E9%BA%BC%E6%95%99%E4%BD%A0/</guid><description>&lt;p&gt;這是我在 &lt;a href="telnet://bbs.sayya.org"&gt;Sayya BBS&lt;/a&gt; 的 longtime 板文章裡面看到的，看完我也有一些感覺，底下就是這一篇文章&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;網路上流傳很廣的一篇文章 每次看都會有一些不同的體會…… 你看過日本一個很受歡迎「搶救貧窮大作戰」嗎？ 在那個依照案例做不同規劃的單元節目中，總跑不掉幾個公式： 貧窮原因的分析、為了擺脫所做的努力、和最後的成功。 而不斷上演的樣版中，所謂的大師與料理名人，總是龜毛、變態、吹毛求疵、 甚至極盡所能的虐待試圖搶救貧窮的個體。 每每發生這樣悽慘的景況，我那年幼被保護極好的姪子都會問我： 「他就不能對他好一點嗎？」 而我也總是說著一樣的答案：「憑什麼別人要把成功的技巧教給你？」 是的，「憑什麼？」這句話我自己也同樣深深的體會過。 從18歲進入職場，經常遇到肯「虐待」我的主管； 要不就是賺得很多，卻摳得要死的老闆， 極盡所能的要求我為他無償加班或犧牲休假；要不就是遇到龜毛至極的主管， 要求我遵守他的生活習慣與處事哲學；更多的，是混到無與倫比， 卻總讓我做到死的老大級豬頭。 每每遇到這種角色， 我都為了「怎麼可能會賺錢？」這個問題而困擾的想死， 每次離開那個職位時，總是出去大快朵頤一番，來犒勞自己這段日子的辛勞奉獻， 但，我卻總是掉入所謂「勝者的詛咒」，自以為脫逃，卻又什麼都拿不到的痛苦中。 於是，我曾經發誓要做個極為體貼而人性化的上司，對待我的員工要視如己出。 但從因為砍掉新人而哭了三天的小主管，到現在，我也成為龜毛且殘酷的人， 這條路教會了我一件非常重要的事：「如果你沒有心，我憑什麼教你？」 一位目前是副機長的朋友曾經說過，降落的技巧每個人都不一樣， 必須透過所有前輩的教導， 才能夠從中揣摩自己的方式，但是要怎麼才能夠學到， 必須要靠你主動的去問、去學、無論對方願不願教你， 你也要睜大眼睛去看。而往往要取悅正駕駛教你， 你必須極盡所能的配合他的要求與習慣， 也要以最大的耐性和肯學的謙卑去與他溝通。 到現在，每個月坐擁十萬收入，購屋、買房、 降落經驗職達千次以上的他， 比起七年前剛從美國拿到執照回台的狂妄， 現在的他，多了謙卑、和緩、與容忍的耐性。 也許，你現在也遇到了這樣的主管，常常讓你有生不如死的痛苦。 也許，你正為了老闆的無理要求覺得自尊比發展重要。 但，在這樣的景氣和競爭的環境下，他能活著，就比你有出息、有辦法， 而且，有許多生存的技巧與方式，值得你去虛心請教。 只要一天，你尚未達成自己的夢想與目標， 都要記得這句話：「別人憑什麼教你」。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[生活日記] 新手機 BenQ-Siemens S88</title><link>https://blog.wu-boy.com/2008/02/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E6%96%B0%E6%89%8B%E6%A9%9F-benq-siemens-s88/</link><pubDate>Mon, 18 Feb 2008 04:07:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/02/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E6%96%B0%E6%89%8B%E6%A9%9F-benq-siemens-s88/</guid><description>&lt;p&gt;&lt;a href="http://pic.wu-boy.com/displayimage.php?pos=-2052"&gt;&lt;img src="https://i1.wp.com/pic.wu-boy.com/albums/userpics/10002/normal_0214220233.JPG?w=300" border="0" alt="Click to view full size image" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Apache] mod_rewrite 進階用法，網域 redirect</title><link>https://blog.wu-boy.com/2008/02/apache-mod_rewrite-%E9%80%B2%E9%9A%8E%E7%94%A8%E6%B3%95%EF%BC%8C%E7%B6%B2%E5%9F%9F-redirect/</link><pubDate>Sun, 17 Feb 2008 15:48:10 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/02/apache-mod_rewrite-%E9%80%B2%E9%9A%8E%E7%94%A8%E6%B3%95%EF%BC%8C%E7%B6%B2%E5%9F%9F-redirect/</guid><description>&lt;p&gt;我對 mod_rewrite 的技術相當有興趣，最近又有人在 ptt Linux 版上問到這相關的問題，如下&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我用的是虛擬主機 (web hosting) 他的管理是這樣的, 不論代管哪個domain 一律都是對應到 /home/user/public_html 這個目錄下 也就是說, 1.com 跟 2.com 都會對到 ~/public_html 問題是: –&amp;gt; 我希望有人輸入 “1.com” 時, 就是讀 ~/public_html/data1 –&amp;gt; 有人讀 “2.com” 時, 就是讀 ~/public_html/data2 當然目前如果都不做設定, 那就是要用 http;//1.com/data1/ 跟 http;//2.com/data2/ 才能答成相同功能. 請問 .htaccess 有辦法改寫這樣的狀況嗎.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[生活日記] 中正大學上學期成績單到我家裏了～</title><link>https://blog.wu-boy.com/2008/02/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E4%B8%8A%E5%AD%B8%E6%9C%9F%E6%88%90%E7%B8%BE%E5%96%AE%E5%88%B0%E6%88%91%E5%AE%B6%E8%A3%8F%E4%BA%86%EF%BD%9E/</link><pubDate>Thu, 14 Feb 2008 04:09:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/02/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E4%B8%8A%E5%AD%B8%E6%9C%9F%E6%88%90%E7%B8%BE%E5%96%AE%E5%88%B0%E6%88%91%E5%AE%B6%E8%A3%8F%E4%BA%86%EF%BD%9E/</guid><description>&lt;p&gt;這學期成績單，寄過來了，拿到成績單之前，其實就有網路查過成績了，這學期成績普普，沒有特別好，也沒有很差，不過我在組上排名，算倒數的吧，哈哈，我果然很不會唸書，我成績好的科目，都是有期末 project 的，沒辦法，我對讀書不太行，應該是說理論背景，我很弱，老師還說，地基沒有穩，蓋出來的房子，一定會倒塌，其實說得很有道理，要對自己改進改進了，底下列一下我這學期成績&lt;/p&gt;</description></item><item><title>[C/C++] 如何計算陣列大小/個數</title><link>https://blog.wu-boy.com/2008/02/cc-%E5%A6%82%E4%BD%95%E8%A8%88%E7%AE%97%E9%99%A3%E5%88%97%E5%A4%A7%E5%B0%8F%E5%80%8B%E6%95%B8/</link><pubDate>Mon, 04 Feb 2008 06:50:37 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/02/cc-%E5%A6%82%E4%BD%95%E8%A8%88%E7%AE%97%E9%99%A3%E5%88%97%E5%A4%A7%E5%B0%8F%E5%80%8B%E6%95%B8/</guid><description>&lt;p&gt;最近在寫 BCB 的時候遇到的，不過忘記之前怎麼寫的，所以又上去找了一下，發現可以利用 sizeof 這個函式，來計算陣列的個數，我去查了一下 BCB 的 manual，裡面寫的還蠻詳細的，如下&lt;/p&gt;
&lt;p&gt;Example for sizeof operator&lt;/p&gt;
&lt;p&gt;/ &lt;em&gt;USE THE sizeof OPERATOR TO GET SIZES OF DIFFERENT DATA TYPES.&lt;/em&gt; /&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-15"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-16"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-17"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-18"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-18"&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-19"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-19"&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-20"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-20"&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-21"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-21"&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-22"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-22"&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-23"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-23"&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-24"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-24"&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-25"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-25"&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-26"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-26"&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-27"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-27"&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-28"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-28"&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-29"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-29"&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-30"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-30"&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-31"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-31"&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-32"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-32"&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#include&lt;/span&gt; &lt;span style="color:#1e889b"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#1e889b"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;struct&lt;/span&gt; st {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;char&lt;/span&gt; *name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; age;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;double&lt;/span&gt; height;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;struct&lt;/span&gt; st St_Array[]= { &lt;span style="color:#228b22"&gt;/* AN ARRAY OF structs */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#cd5555"&gt;&amp;#34;Jr.&amp;#34;&lt;/span&gt;, &lt;span style="color:#b452cd"&gt;4&lt;/span&gt;, &lt;span style="color:#b452cd"&gt;34.20&lt;/span&gt; }, &lt;span style="color:#228b22"&gt;/* St_Array[0] */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#cd5555"&gt;&amp;#34;Suzie&amp;#34;&lt;/span&gt;, &lt;span style="color:#b452cd"&gt;23&lt;/span&gt;, &lt;span style="color:#b452cd"&gt;69.75&lt;/span&gt; }, &lt;span style="color:#228b22"&gt;/* St_Array[1] */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b;font-weight:bold"&gt;int&lt;/span&gt; &lt;span style="color:#008b45"&gt;main&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;long&lt;/span&gt; &lt;span style="color:#00688b;font-weight:bold"&gt;double&lt;/span&gt; LD_Array[] = { &lt;span style="color:#b452cd"&gt;1.3&lt;/span&gt;, &lt;span style="color:#b452cd"&gt;501.09&lt;/span&gt;, &lt;span style="color:#b452cd"&gt;0.0007&lt;/span&gt;, &lt;span style="color:#b452cd"&gt;90.1&lt;/span&gt;, &lt;span style="color:#b452cd"&gt;17.08&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;printf&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#cd5555"&gt;\n&lt;/span&gt;&lt;span style="color:#cd5555"&gt;Number of elements in LD_Array = %d&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;sizeof&lt;/span&gt;(LD_Array) / &lt;span style="color:#8b008b;font-weight:bold"&gt;sizeof&lt;/span&gt;(LD_Array[&lt;span style="color:#b452cd"&gt;0&lt;/span&gt;]));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#228b22"&gt;/**** THE NUMBER OF ELEMENTS IN THE St_Array. ****/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;printf&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#cd5555"&gt;\n&lt;/span&gt;&lt;span style="color:#cd5555"&gt;St_Array has %d elements&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;sizeof&lt;/span&gt;(St_Array)/&lt;span style="color:#8b008b;font-weight:bold"&gt;sizeof&lt;/span&gt;(St_Array[&lt;span style="color:#b452cd"&gt;0&lt;/span&gt;]));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#228b22"&gt;/**** THE NUMBER OF BYTES IN EACH St_Array ELEMENT. ****/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;printf&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#cd5555"&gt;\n&lt;/span&gt;&lt;span style="color:#cd5555"&gt;St_Array[0] = %d&amp;#34;&lt;/span&gt;, &lt;span style="color:#8b008b;font-weight:bold"&gt;sizeof&lt;/span&gt;(St_Array[&lt;span style="color:#b452cd"&gt;0&lt;/span&gt;]));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#228b22"&gt;/**** THE TOTAL NUMBER OF BYTES IN St_Array. ****/&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#008b45"&gt;printf&lt;/span&gt;(&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#cd5555"&gt;\n&lt;/span&gt;&lt;span style="color:#cd5555"&gt;St_Array=%d&amp;#34;&lt;/span&gt;, &lt;span style="color:#8b008b;font-weight:bold"&gt;sizeof&lt;/span&gt;(St_Array));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8b008b;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#b452cd"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Output&lt;/p&gt;</description></item><item><title>[MySQL] outer join 使用</title><link>https://blog.wu-boy.com/2008/01/mysql-outer-join-%E4%BD%BF%E7%94%A8/</link><pubDate>Sun, 27 Jan 2008 06:56:17 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/01/mysql-outer-join-%E4%BD%BF%E7%94%A8/</guid><description>&lt;p&gt;之前我遇到問題，有兩個表格 a 跟 b，分別利用 id 當作連接，當你使用 where a.id = b.id 的時候，當 b 資料表沒有對應到的時候，撈出來的資料就會少一筆，問題如下&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;: 想請教各位大大， : 如果我現在有兩個table t1,t2 : Table t1: : uid INT : name NCHAR(10) : Table t2: : uid INT : t1_id INT 參考到t1.uid : 我下一個SQL query: : SELECT t1.name, COUNT(t2.uid) : FROM t1,t2 : WHERE t2.t1_id=t1.uid : GROUP BY t1.name : 這樣會計算出每個t1.name項目在t2中所出現的次數。 : 但是如果次數為零時就不會顯示出來。 : 想請教大家，怎樣修改可以讓次數為零的t1.name也顯示出來呢? 解決方法：就是利用 outer join&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="brush: sql; title: ; notranslate" title=""&gt;$sql = "SELECT t1.t_name, count(t2.uid) as aa FROM " . $xoopsDB-&gt;prefix('teacher') . " as t1 LEFT OUTER JOIN " . $xoopsDB-&gt;prefix('student') . " as t2 on t1.tid = t2.st_teacher group by t1.t_name";
&lt;/pre&gt; Xoops 寫法</description></item><item><title>[MySQL] 內建函式 MySQL Replace 功能</title><link>https://blog.wu-boy.com/2008/01/mysql-%E5%85%A7%E5%BB%BA%E5%87%BD%E5%BC%8F-mysql-replace-%E5%8A%9F%E8%83%BD/</link><pubDate>Sun, 27 Jan 2008 05:16:51 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/01/mysql-%E5%85%A7%E5%BB%BA%E5%87%BD%E5%BC%8F-mysql-replace-%E5%8A%9F%E8%83%BD/</guid><description>&lt;p&gt;今天老師寄信給我，說我轉移的 &lt;a href="http://journal.cn.ee.ccu.edu.tw/"&gt;journal.CN&lt;/a&gt; 的文章，出現以前的文章，不能看到圖片，我去查了一下，發現 AMS 文章系統的編輯軟體，相當爛，它的插入圖片，竟然是用絕對網址，然後他會先讀取 mainfile.php 裡面的&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;define('XOOPS_URL', 'http://journal.cn.ee.ccu.edu.tw');
&lt;/pre&gt; 然後把圖片的網址寫死，而不是動態的，就是利用相對路徑，所以我利用了 replace 的功能來解決全部文章圖片的問題，語法如下 
&lt;pre class="brush: sql; title: ; notranslate" title=""&gt;update `xoops_ams_text` set `hometext` = replace(`hometext`,'140.123.107.38/~cnews','journal.cn.ee.ccu.edu.tw');
&lt;/pre&gt; 上面是說，取代 hometext 這個欄位的，找到 140.123.107.38/~cnews 取代成 journal.cn.ee.ccu.edu.tw 這語法相當好用，大家可以嘗試看看，畢竟如果用 php 的 replace 語法，還要利用陣列方式，比較麻煩</description></item><item><title>[生活日記]星期一的網路安全期末報告</title><link>https://blog.wu-boy.com/2008/01/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E6%98%9F%E6%9C%9F%E4%B8%80%E7%9A%84%E7%B6%B2%E8%B7%AF%E5%AE%89%E5%85%A8%E6%9C%9F%E6%9C%AB%E5%A0%B1%E5%91%8A/</link><pubDate>Wed, 23 Jan 2008 04:11:02 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/01/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E6%98%9F%E6%9C%9F%E4%B8%80%E7%9A%84%E7%B6%B2%E8%B7%AF%E5%AE%89%E5%85%A8%E6%9C%9F%E6%9C%AB%E5%A0%B1%E5%91%8A/</guid><description>&lt;p&gt;這星期一，是我這學期最後一科期末的 project 了，這個 project，因為老師說可以用錄影的方式，不然怎麼 demo，把所有學生抓去我 lab 看嗎？好像也不是，所以老師才說用影片最快，不過我看大家的期末報告，都弄投影片而已，好像沒啥看到影片，跟實做方面，而我們這組，晚上花了一個多小時吧，錄製好影片，拿到課堂上放，裡面還蠻多搞笑的地方，不過真的就是我們 demo 的實際過程，最後果然我們拿到第一分，最後期末成績的50%，我們拿了滿分，所以我總成績為 39 + 50 = 89分，這是我上大學以來最高分的時候了，還蠻開心的。&lt;/p&gt;</description></item><item><title>[BCB] 如何利用連結 MySQL 5以上跟 MSSQL Server</title><link>https://blog.wu-boy.com/2008/01/bcb-%E5%A6%82%E4%BD%95%E5%88%A9%E7%94%A8%E9%80%A3%E7%B5%90-mysql-5%E4%BB%A5%E4%B8%8A%E8%B7%9F-mssql-server/</link><pubDate>Fri, 18 Jan 2008 14:33:36 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/01/bcb-%E5%A6%82%E4%BD%95%E5%88%A9%E7%94%A8%E9%80%A3%E7%B5%90-mysql-5%E4%BB%A5%E4%B8%8A%E8%B7%9F-mssql-server/</guid><description>&lt;p&gt;這兩天開始玩 BCB 的這東西，其實我原本就有打算要學一套視窗軟體，畢竟好像還不錯，可以寫寫軟體，所以就拿了 BCB 來學習。 剛開始想說寫個要跟 MSSQL 資料庫的統計圖，發現 BCB 並不支援 MSSQL，解決方式，當然就是拿 Delphi 的元件 利用 Delphi 7 的 MSSQL Driver Update 內的「dbexpmss.dll」 Copy 到「 $(BCB)\BIN 」 然後在設定 dbxconnections.ini&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[MSSQL] GetDriverFunc=getSQLDriverMSSQL LibraryName=dbexpmss.dll VendorLib=oledb HostName=ServerName DataBase=Database Name User_Name=user Password=password BlobSize=-1 ErrorResourceFile= LocaleCode=0000 MSSQL TransIsolation=ReadCommited OS Authentication=False 然後再來是 MySQL5，原本的 BCB 並不支援 MSQL5 所以自己另外找了文章 &lt;a href="http://www.justsoftwaresolutions.co.uk/delphi/dbexpress_and_mysql_5.html"&gt;http://www.justsoftwaresolutions.co.uk/delphi/dbexpress_and_mysql_5.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[MySQL] 取代部份字串問題</title><link>https://blog.wu-boy.com/2008/01/mysql-%E5%8F%96%E4%BB%A3%E9%83%A8%E4%BB%BD%E5%AD%97%E4%B8%B2%E5%95%8F%E9%A1%8C/</link><pubDate>Thu, 17 Jan 2008 06:44:01 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/01/mysql-%E5%8F%96%E4%BB%A3%E9%83%A8%E4%BB%BD%E5%AD%97%E4%B8%B2%E5%95%8F%E9%A1%8C/</guid><description>&lt;p&gt;剛剛在 ptt 遇到之前當兵的工作同事，話說他要去中華電信工作了，還真是不錯，他在 database 版問一個取代的問題，然後我幫他找一下答案，解決了，這可以用 sql 語法解決，或者是用程式都可以 問題：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在MySQL 我有大約50000筆資料 有個欄位像這樣 0040000001&lt;del&gt;0040050000 現在因故要把 004改成005 變成像這樣 0050000001&lt;/del&gt;0050050000 我的解法：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="brush: sql; title: ; notranslate" title=""&gt;UPDATE `test` SET `test` = CONCAT( '005', SUBSTRING( `test` , 4 ) ) WHERE
SUBSTRING( `test` , 1, 3 ) = '004'
&lt;/pre&gt; 有更快解法嗎？ REPLACE 好像不行，因為後面數字也會被改到，不過還是主要用 SUBSTRING</description></item><item><title>[Proftpd] 如何讓 /bin/false 跟 /sbin/nologin 連上 Proftpd</title><link>https://blog.wu-boy.com/2008/01/proftpd-%E5%A6%82%E4%BD%95%E8%AE%93-binfalse-%E8%B7%9F-sbinnologin-%E9%80%A3%E4%B8%8A-proftpd/</link><pubDate>Sat, 12 Jan 2008 03:54:28 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/01/proftpd-%E5%A6%82%E4%BD%95%E8%AE%93-binfalse-%E8%B7%9F-sbinnologin-%E9%80%A3%E4%B8%8A-proftpd/</guid><description>&lt;p&gt;昨天遇到這個問題，不過其實之前就有解決過這問題，只是忘記怎麼解決，之前是利用 MySQL 的方式建立帳號，因為相當方便，請參考這篇 &lt;a href="http://blog.wu-boy.com/2006/10/21/22/"&gt;[Linux] Ubuntu 6.06 Proftpd + Mysql 安裝方式&lt;/a&gt;，支援 /bin/false 跟 /sbin/nologin 也相當簡單 只要在 proftpd.conf 加上&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;RequireValidShell on
&lt;/pre&gt; 官網寫的 
&lt;p&gt;&lt;a href="http://www.proftpd.org/docs/directives/linked/config_ref_RequireValidShell.html"&gt;config_ref_RequireValidShell&lt;/a&gt; 然後在編輯 /etc/shells 加上&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;/sbin/nologin
&lt;/pre&gt;</description></item><item><title>[生活日記] 新的一年，去老闆家吃飯</title><link>https://blog.wu-boy.com/2008/01/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E6%96%B0%E7%9A%84%E4%B8%80%E5%B9%B4%EF%BC%8C%E5%8E%BB%E8%80%81%E9%97%86%E5%AE%B6%E5%90%83%E9%A3%AF/</link><pubDate>Fri, 11 Jan 2008 04:13:05 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2008/01/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E6%96%B0%E7%9A%84%E4%B8%80%E5%B9%B4%EF%BC%8C%E5%8E%BB%E8%80%81%E9%97%86%E5%AE%B6%E5%90%83%E9%A3%AF/</guid><description>&lt;p&gt;這學期，算是正式結束了，因為老師的電腦網路結構考試，在昨天就考完了，這學期呢，過的相當快，不知不覺，又過了半年，在這學期，我學習到相當多東西，不管是課業上，還是跟同學之前的相處，或者是meeting，我自己都要達到我自己想學的東西，所以我很開心，而寒假了，不知道能不能多充實一下自己，我想利用 Borland C++ Builder 來寫一套統計軟體，搭配 MSSQL ，不過這已經偏離本 blog 的宗旨，所以我不在這裡多說了，這學期呢，在實驗室相處的相當不錯，我怎麼覺得，我跟碩二的很熟，跟碩一的好像就還好，哈哈，不過沒關西啦，跟誰熟都一樣，不過大家都跟我說，我給別人的感覺，就是很沉默很恐怖，然而相處之後，才發現我很好聊，真囧。 再來呢，昨天去老闆家裏吃飯，我是負責買火鍋料，跟疆母鴨，不過因為大家怕我亂買，所以多派一個人跟我去買，囧，orz，沒辦法，哈哈，在買火鍋料得時候，買好，我們再去全聯買飲料，由於我不喝飲料，所以我用公款買了一罐檸檬的比非多，哈哈，就是養樂多啦，很好喝，在吃飯的時候，老闆還問我，誰買那個的，囧，大家都指向我，呼呼哈，買好之後，去老闆家，我一整個很餓，不過要先等 lab 女生炒菜，我都快餓死了，經過一小時之後，終於好了，在吃飯過程，大家都在聊天，講八卦，講這個還好，但是幾乎都是在講我的八卦，還有我的家人，囧，都一直講我，然後還討論我的 blog，大家還對我真好奇阿，呼呼，在這過程，老師一直開酒，呼呼，度爛名跟宗翰一直狂喝，我在想老師心在淌血吧，哈哈，好險，我不喝酒的，所以我沒喝，我還是乖乖一直喝我的比非多，哈，酒還是不要碰好了，畢竟他不會甜，喝 ice 我還ok，就這樣，吃到晚上快12點，囧，回到家都一點多了，原本想說打給蚊子，看她傷口有沒有好一點，不過我怕他在睡覺，所以先傳一下簡訊，結果蚊子沒有回我簡訊，一直到今天早上我才收到簡訊，真是好險，昨天沒打電話過去，不然就吵到我最喜歡的蚊子了 話說，這頓飯，我最喜歡吃的部份，就是前菜，因為我不喜歡吃將母鴨，將母鴨的味道，都不會甜，所以我吃前菜吃很多，吃三碗飯，然後火鍋都沒什麼吃，看來下次要吃羊肉爐了，哈。&lt;/p&gt;</description></item><item><title>[備份] Windows 2003 常用軟體</title><link>https://blog.wu-boy.com/2007/12/%E5%82%99%E4%BB%BD-windows-2003-%E5%B8%B8%E7%94%A8%E8%BB%9F%E9%AB%94/</link><pubDate>Mon, 31 Dec 2007 16:09:15 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/12/%E5%82%99%E4%BB%BD-windows-2003-%E5%B8%B8%E7%94%A8%E8%BB%9F%E9%AB%94/</guid><description>&lt;p&gt;以下是備份我自己常用的軟體，原本以為很少，後來發現還蠻多的，不過大部分都是 OpenSource&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;UltraVnc Unicode 補完計畫 Microsoft SQL Server 2005 Appserv 2.5.9 FireFox PsPad cwRsyncServer Alcohol 120% Filezilla Foobar2003 μTorrent Dr.eye Adobe Reader 8 VMware Workstation Gene6 Ftp Server ComicsViewer BitComet Flickr Uploadr HD Tune Pidgin Skype EmEditor ESET Microsoft Office 2003 MySQL Tools for 5.0 No-IP Client Everest KMPlayer&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[MYSQL] 忘記 root 密碼，登不進去 phpMyAdmin 教學</title><link>https://blog.wu-boy.com/2007/12/mysql-%E5%BF%98%E8%A8%98-root-%E5%AF%86%E7%A2%BC%EF%BC%8C%E7%99%BB%E4%B8%8D%E9%80%B2%E5%8E%BB-phpmyadmin-%E6%95%99%E5%AD%B8/</link><pubDate>Mon, 31 Dec 2007 15:53:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/12/mysql-%E5%BF%98%E8%A8%98-root-%E5%AF%86%E7%A2%BC%EF%BC%8C%E7%99%BB%E4%B8%8D%E9%80%B2%E5%8E%BB-phpmyadmin-%E6%95%99%E5%AD%B8/</guid><description>&lt;p&gt;&lt;strong&gt;2011.06.24 Update: 修改語法&lt;/strong&gt; 剛剛在處理老闆的機器移機問題，雖然有給我 root 權限，可是 MySQL 密碼沒有給我 root 的，然後我去看程式，都沒有用到 root ，都是用普通使用者，所以就上網找一下忘記密碼怎麼處理，其實找到的方法就是利用 command line 的方法，相當方便，最終解決方法還是文字介面，作法如下 首先先 Kill 掉所有 MySQL 的連線&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# on Linux
/etc/init.d/mysqld stop
# on FreeBSD
/usr/local/etc/rc.d/mysql-server stop
killall -9 mysqld
&lt;/pre&gt; 然後進入 MySQL 安全模式 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;mysqld_safe -u root --skip-grant-tables &amp;#038;
&lt;/pre&gt; 然後利用文字介面修改 MySQL root 密碼 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ mysql -u root -p
&gt; use mysql;
&gt; UPDATE user SET password=password('這裡輸入你的密碼') where user='root';
&gt; FLUSH PRIVILEGES;
&gt; exit;
&lt;/pre&gt;
&lt;h3 id="dump-database"&gt;dump database&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;$ mysqladmin -uroot -p flush-logs
$ mysqldump -B -uroot -p --opt phpbb2 &gt; phpbb2_20020601.sql --databases 或 -B 日後會自動建立該資料庫&lt;/pre&gt;
&lt;h3 id="dump-table"&gt;dump table&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;mysqldump phpbb2 -uroot -p --opt phpbb2_users &gt; phpbb2_users_20020601.sql&lt;/pre&gt;
&lt;h3 id="db-backup-如果另外一台電腦上沒有phpbb2這個db記得要新增一個"&gt;DB backup 如果另外一台電腦上沒有phpbb2這個DB記得要新增一個&lt;/h3&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;mysql -uroot -p -e "CREATE DATABASE phpbb2"&lt;/pre&gt; then mysql phpbb2 -uroot -p &lt; phpbb2_20020601.sql[/code] Reference 
&lt;p&gt;&lt;a href="http://www.study-area.org/tips/mysql_backup.htm"&gt;http://www.study-area.org/tips/mysql_backup.htm&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[UNIX] bash 記憶指令 For Linux</title><link>https://blog.wu-boy.com/2007/12/unix-bash-%E8%A8%98%E6%86%B6%E6%8C%87%E4%BB%A4-for-linux/</link><pubDate>Sun, 23 Dec 2007 14:00:56 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/12/unix-bash-%E8%A8%98%E6%86%B6%E6%8C%87%E4%BB%A4-for-linux/</guid><description>&lt;p&gt;在 FreeBSD 裡面，要做到這樣非常方便，當我們在終端機輸入 vi 之後按下 Up 鍵，終端機會顯示之前下過的 vi 指令，這在常常使用 command 的使用者來講相當方便，也非常重要，在 FreeBSD 底下，只要在 .cshrc 裡面加上&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;bindkey “^W” backward-delete-word bindkey -k up history-search-backward bindkey -k down history-search-forward 可是在 linux 底下要如何達到這樣呢，那就是 man bash『history-search-backward』，『history-search-forward』這兩個功能，對我來說非常重要，然而你要達到這功能，就是利用 showkey 跟 bind 這兩個指令 首先你要先找到 Up 這個鍵的 16 位元的編碼&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;showkey -a

Press any keys - Ctrl-D will terminate this program

^[[A 27 0033 0x1b
 91 0133 0x5b
 65 0101 0x41
&lt;/pre&gt; 然後在 bind 上去，寫到 /etc/bashrc 地下就可以了 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;bind '"\x1b\x5b\x41":history-search-backward'
bind '"\x1b\x5b\x42":history-search-forward'&lt;/pre&gt; 我之前有寫一篇 
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/2007/02/01/65/"&gt;[Ubuntu] bash 記憶指令&lt;/a&gt;，也可以參考看看&lt;/p&gt;</description></item><item><title>[生活日記]回南投替代役單位當講師</title><link>https://blog.wu-boy.com/2007/12/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E5%9B%9E%E5%8D%97%E6%8A%95%E6%9B%BF%E4%BB%A3%E5%BD%B9%E5%96%AE%E4%BD%8D%E7%95%B6%E8%AC%9B%E5%B8%AB/</link><pubDate>Fri, 21 Dec 2007 04:14:09 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/12/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E5%9B%9E%E5%8D%97%E6%8A%95%E6%9B%BF%E4%BB%A3%E5%BD%B9%E5%96%AE%E4%BD%8D%E7%95%B6%E8%AC%9B%E5%B8%AB/</guid><description>&lt;p&gt;話說遲來的一篇文章，在上禮拜五 2007年12月14號 當天早上去那邊，然後下午回來，這樣其實還蠻趕得，不過沒關西啦，既然我以講師的身份回去，我想這是我的一個榮譽，話說我5月11號退伍，到現在，我第一次回去，回到那邊感覺很熟悉，回到替代役的感覺，不過重點不是這個，重點是我要去講我那套典藏系統。 我做的投影片，&lt;a href="http://life.wu-boy.com/wp-content/uploads/2007/12/th.ppt" title="文獻館講課投影片"&gt;文獻館講課投影片&lt;/a&gt;，話說這投影片，做的不太好，因為技術的東西，弄成投影片，感覺要很多頁面，而且效果不好，所以我當天都是利用demo的方式，搭配中正的機器作講解，整個過程都有用DV錄製起來，畢竟還是蠻重要的教學，那天的講課過程，來的人有3位，畢竟我講的還蠻深入的，所以來聽的人至少要有一點水準吧，所以邀請了資訊方面的人才，我都認識的明河兄，跟維銘，還有重點人物數位典藏專員，從早上10點半到達會場，到下午結束一切都蠻順利的，話說我去現場，還當場寫程式，很少人當講師，還要當場寫程式的吧，哈哈，沒關西啦，這好像是我之前沒完成的工作，我就順便把他完成了，會議進行的還蠻順利的，我原本預估兩小時講完，可是後來講到下午快五點，哈哈，比我預估的時間還久很多，可能是我沒把Demo的時間算進去，下次還有機會的話，一定要在重新評估時間。&lt;/p&gt;</description></item><item><title>[PHP] 好用的 PEAR – PHP Mail and Mail_Mime</title><link>https://blog.wu-boy.com/2007/12/php-%E5%A5%BD%E7%94%A8%E7%9A%84-pear-php-mail-and-mail_mime/</link><pubDate>Tue, 18 Dec 2007 12:24:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/12/php-%E5%A5%BD%E7%94%A8%E7%9A%84-pear-php-mail-and-mail_mime/</guid><description>&lt;p&gt;今天在寫期末的 Project，我的專題是寫無線 802.1X 認證，搭配 FreeBADIUS Server，然後我在搭配網頁整合認證機制，然後我在做使用者帳號申請部份，需要靠 Email 認證，但是我去看官網，介紹好像也沒什麼，在寄信的時候常常會遇到亂碼，不然就是寄信 html 部份會有問題，或者是不能附加檔案之類的，然後網路上找不到一個好用的 class ，所以就用了 &lt;a href="http://pear.php.net/package/Mail_Mime"&gt;PEAR::Mail_Mime&lt;/a&gt; 跟 &lt;a href="http://pear.php.net/package/Mail"&gt;PEAR::Mail&lt;/a&gt;，這兩個套件還不錯用，如果想寄單純的信件，就用 PEAR::Mail 這個就可以了，如果要搭配 html 網頁，就要搭上 PEAR::Mail_Mime&lt;/p&gt;</description></item><item><title>[生活日記]跟老闆去關子嶺洗溫泉～</title><link>https://blog.wu-boy.com/2007/12/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E8%B7%9F%E8%80%81%E9%97%86%E5%8E%BB%E9%97%9C%E5%AD%90%E5%B6%BA%E6%B4%97%E6%BA%AB%E6%B3%89%EF%BD%9E/</link><pubDate>Fri, 14 Dec 2007 01:48:45 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/12/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E8%B7%9F%E8%80%81%E9%97%86%E5%8E%BB%E9%97%9C%E5%AD%90%E5%B6%BA%E6%B4%97%E6%BA%AB%E6%B3%89%EF%BD%9E/</guid><description>&lt;p&gt;12月12日實驗室lab同學找我一起去關子嶺洗溫泉，話說我怎麼跟碩二那麼熟阿，雖然我碩三了，沒人把我當碩三看，都把我當碩一，囧，唉，沒辦法，誰叫我在 lab 都在大小聲呼叫，跟過動兒一樣，哈，當天上完課，就殺過去了，我跟老闆做同一台車子，在車上跟老闆哈拉，我跟老闆說，我自己有開車到中正大學，但是被照一張相，超速，我說我開130幾公里，老闆說：『我知道，我一點都不訝異』，囧害我很無言，好像我做事很衝動，沒在經過思考，不過我好像就是這樣子，講一下話，我就累了，所以就睡著了，不過半小時到一小時之間我們就到了，我還差點往旁邊的女生躺下去，哈哈，到了目的地，我們就順手啪了相 &lt;a href="https://www.flickr.com/photos/appleboy/2109064784/" title="DSCN3349 by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm3.static.flickr.com/2221/2109064784_4763bda563.jpg?resize=500%2C375&amp;#038;ssl=1" alt="DSCN3349" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[生活]我的研究所宿舍～中正大學研究所宿舍</title><link>https://blog.wu-boy.com/2007/12/%E7%94%9F%E6%B4%BB%E6%88%91%E7%9A%84%E7%A0%94%E7%A9%B6%E6%89%80%E5%AE%BF%E8%88%8D%EF%BD%9E%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E7%A0%94%E7%A9%B6%E6%89%80%E5%AE%BF%E8%88%8D/</link><pubDate>Thu, 06 Dec 2007 01:50:24 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/12/%E7%94%9F%E6%B4%BB%E6%88%91%E7%9A%84%E7%A0%94%E7%A9%B6%E6%89%80%E5%AE%BF%E8%88%8D%EF%BD%9E%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E7%A0%94%E7%A9%B6%E6%89%80%E5%AE%BF%E8%88%8D/</guid><description>&lt;p&gt;先來介紹一下我的宿舍好了，哈哈，我從大學大一開始，就很幸運，因為我每年都有抽到宿舍，所以根本不用擔心住宿問題，可是就在大一升大二的時候，我原本有抽中宿舍，可是同學叫我跟他一起去外面住，所以我就去住外面，然後我原本抽中的籤，我就讓給我的另外一個朋友，可是很不幸的，強者我同學被退學，囧，東華大學電機系，被退學，我只能無言了，我又去學校辦理退費，好險全額退款，不過我那朋友當時還去學校求情，都沒有用，老師完全不退讓，害我很不爽，哈，後來我同學就去當兵了，沒什麼，這不是重點，重點是他當兵完，在補習一年，考上台大電機，囧，我就跟他說，你要不要回來東華嗆一下老師阿，因為我看不太過去，老師之前怎麼瞧不起他的，哈哈，我果然都是在幹這種事情，因為我高中就是這樣了，哈，那朋友目前在台大電機就讀三年級，不錯不錯。 我先來介紹我的研究所宿舍好了，上次帶 lab 的同學進來看，一整個被閒髒，囧，哈哈，我懶得整理阿 &lt;a href="https://www.flickr.com/photos/appleboy/2090042981/" title="PC061212 by appleboy46, on Flickr"&gt;&lt;img src="https://i1.wp.com/farm3.static.flickr.com/2305/2090042981_1899cbe54c.jpg?resize=500%2C375&amp;#038;ssl=1" alt="PC061212" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[生活日記] 期中考兩科成績～爽</title><link>https://blog.wu-boy.com/2007/12/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E6%9C%9F%E4%B8%AD%E8%80%83%E5%85%A9%E7%A7%91%E6%88%90%E7%B8%BE%EF%BD%9E%E7%88%BD/</link><pubDate>Tue, 04 Dec 2007 01:52:17 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/12/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E6%9C%9F%E4%B8%AD%E8%80%83%E5%85%A9%E7%A7%91%E6%88%90%E7%B8%BE%EF%BD%9E%E7%88%BD/</guid><description>&lt;p&gt;今天發了兩科考卷，一整個很開心，因為下午第一科 TCP/IP 我拿到期中考分數 89 分，一整個嚇到我，我那 lab 的女生，也是一整個嚇到，我感覺老師也嚇到了，哈哈，畢竟我覺得老師應該還記得兩年前的我，哈哈，不過我還蠻喜歡 TCP/IP 老師這樣的考法，雖然說，不怎會分出程度，可是該學的還是有學到，而且我們都是研究所了，已經不是高中大學生了，還考一堆背的，有的沒的，我覺得根本不是研究所在念的，把學生當作高中生在磨練？在研究所裡面，我認為就應該好好研究將來自己想發展的方向，然後培養獨立思考，獨立解決問題得能力，我覺得這才是研究所該訓練的方向。 再來呢，發第二科，網路安全，這門客，我其實對這門客還蠻大的興趣，哈哈，只不過老師太會虎爛，所以害我沒學到什麼東西，他的期中考怎麼考呢，就是每個禮拜發給你一篇 paper ，然後你把 paper 讀完，然後做成 ppt 投影片，然後可以帶進去考場，老師就從 paper 裡面找題目出，期中考是考六篇 paper，每篇 paper 份量大概是 50 頁，囧，還蠻多的，不過我考的還ok，我考 72 分，不過我該說我找答案的功力很強，還是我真的會嗎？其實也還好，增加一點英文的能力，因為前幾篇報告我有再看，後面兩篇就沒看了，不過考這樣已經算不錯了，再來就是要準備期末的 project 了，今天一整個開心，哈哈。&lt;/p&gt;</description></item><item><title>[FreeBSD] ipfw + Nat 無線網卡當內部DHCP Server</title><link>https://blog.wu-boy.com/2007/12/freebsd-ipfw-nat-%E7%84%A1%E7%B7%9A%E7%B6%B2%E5%8D%A1%E7%95%B6%E5%85%A7%E9%83%A8dhcp-server/</link><pubDate>Sat, 01 Dec 2007 07:46:02 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/12/freebsd-ipfw-nat-%E7%84%A1%E7%B7%9A%E7%B6%B2%E5%8D%A1%E7%95%B6%E5%85%A7%E9%83%A8dhcp-server/</guid><description>&lt;p&gt;之前在寫 &lt;a href="http://blog.wu-boy.com/2007/10/22/122/"&gt;[FreeBSD] 無線網卡架設AP Server DWL-G520 Ralink RT2561&lt;/a&gt; 這篇的時候，是利用 pf 當作防火牆，可是我偏好使用 ipfw 來作防火牆的工作，所以今天研究一下 nat 的作法，ipfw Firewall 設定方法。 請先參考設定 IPFW 編譯核心：&lt;a href="http://blog.wu-boy.com/2006/10/29/28/"&gt;[FreeBSD] 系統核心支援ipfw 更新kernel&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;系統：FreeBSD 6.2-RELEASE or STABLE 200709&lt;/li&gt;
&lt;li&gt;網卡：一張有線網卡，另一張無線網卡 目前的架構，一張有線網卡對外，然後無線網卡對內，架設dhcp伺服器，提供ap的功能，會加上 802.1X 認證，這我晚一點會寫教學 目前要先修改 /etc/rc.conf&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# 第一片網卡固有的設定：
ifconfig_rl0="inet 140.123.107.XX netmask 255.255.255.0"

# 只用一片網卡時，將第一片網卡虛擬出另一個IP(如果使用兩片網卡，就不要設這一行，或者註解起來也可)。
ifconfig_rl0_alias0="inet 192.168.1.254 netmask 255.255.255.0"

# 如果你有第二片網卡時，將此網卡設定如下(當然啦，這一行的註解就應該取消，第二塊網卡才會有作用)。
# ifconfig_ral0="inet 192.168.1.254 netmask 255.255.255.0"

# 宣告本主機可做為gateway(通訊閘)
gateway_enable="YES"

# 宣告防火牆(IP-FIREWALL)
firewall_enable="YES"
firewall_type="simple"
firewall_quiet="YES"
tcp_extensions="YES"

# 定義 NATD 的網路卡介面，應定義在設定 public IP 的網卡代號上。
natd_interface="vr0"
natd_enable="YES"
&lt;/pre&gt; 然後 /etc/netstart 重新啟動網卡 再來是設定防火牆 ipfw 檔案在 /etc/rc.firewall 先備份原來的檔案 cp /etc/rc.firewall /etc/rc.firewall.bak 然後修改 /etc/rc.firewall 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;此設定是限制192.168.1.~254 整個網域,server DHCP ip 是設192.168.1.254

#!/bin/sh

/sbin/ipfw -f flush

/sbin/ipfw add pass all from 127.0.0.1 to 127.0.0.1 //設定server本機可以跟server本機通訊

/sbin/ipfw add divert natd all from any to any via rl0 //設定nat可以任何通行

/sbin/ipfw add pass all from 127.0.0.1 to any //讓本機可以通行到任何地方

/sbin/ipfw add pass all from 192.168.1.255 to any //如果有設dhcp一定要設這行

/sbin/ipfw add pass all from 192.168.1.1/24 to 192.168.1.254 //讓內部ip全部可以連上本機

/sbin/ipfw add pass all from 192.168.1.1/24 to 168.95.1.1 //開放hinet dns給使用者

#開放所有通行給該ip

/sbin/ipfw add pass all from 192.168.1.1 to any

/sbin/ipfw add pass all from 192.168.1.2 to any

/sbin/ipfw add pass all from 192.168.1.3 to any

/sbin/ipfw add deny all from 192.168.1.1/24 to 140.112.90.74
/sbin/ipfw add deny all from 192.168.1.1/24 to 140.112.90.72

# ================
# 其餘的(all)都放行了，NAT 和 FireWall 都需要設定這一行。
/sbin/ipfw add pass all from any to any
&lt;/pre&gt; 這樣大致上就ok了～</description></item><item><title>今天考試兩科必修無線區域網路，TCP/IP</title><link>https://blog.wu-boy.com/2007/11/%E4%BB%8A%E5%A4%A9%E8%80%83%E8%A9%A6%E5%85%A9%E7%A7%91%E5%BF%85%E4%BF%AE%E7%84%A1%E7%B7%9A%E5%8D%80%E5%9F%9F%E7%B6%B2%E8%B7%AF%EF%BC%8Ctcpip/</link><pubDate>Thu, 29 Nov 2007 01:53:25 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/11/%E4%BB%8A%E5%A4%A9%E8%80%83%E8%A9%A6%E5%85%A9%E7%A7%91%E5%BF%85%E4%BF%AE%E7%84%A1%E7%B7%9A%E5%8D%80%E5%9F%9F%E7%B6%B2%E8%B7%AF%EF%BC%8Ctcpip/</guid><description>&lt;p&gt;今天真是很忙得一天，不過我自己認為是還好，早上一起床9點，我就要趕去meeting了，早上是大group meeting，所以蠻早起床的，加上今天要考兩科期中考，整個就是大爆炸，所以最近晚上都在實驗室，哈哈，早上好險計畫的教授沒來，所以我們meeting的時候沒有被電，不然就慘了，下午有一科是老闆的無線區域網路課程要考試，雖然是 open book 可是我好像沒有看，因為早上要meeting要準備阿，哈哈，下午一點考一科TCP/IP，因為幾乎都是考考古題，所以我寫10分鐘就交卷了，助教一整個傻眼，同學都嚇到了，回去lab，大家都說你考完試了喔，囧，我說對阿，大家被我驚奇的交卷速度嚇到，不過也還好吧，都是考考古題，會寫都寫好了，不會寫就空白了，再來呢，考我們老闆的科目，我一整個不會寫，然後我幾乎教空白卷吧，哈哈我看我又要拼期末project了。 有時後，我自己在想，我真的適合念研究所嗎？這裡的課程值得我學習嗎？我到底是為了什麼讀研究所？我成績這麼差，可以畢業嗎？在這門客裡面，雖然我成績很差，可是我覺得我學習到很多實做的東西，我理論真的很差，差到不行，隨便一個人都可以贏我，我寫考卷不是0就是1，也就是，答案只有會寫，跟不會寫，沒有在亂掰的，哈哈。&lt;/p&gt;</description></item><item><title>[生活日記]今天去大林慈濟～看我叔叔</title><link>https://blog.wu-boy.com/2007/11/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E4%BB%8A%E5%A4%A9%E5%8E%BB%E5%A4%A7%E6%9E%97%E6%85%88%E6%BF%9F%EF%BD%9E%E7%9C%8B%E6%88%91%E5%8F%94%E5%8F%94/</link><pubDate>Fri, 23 Nov 2007 01:54:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/11/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E4%BB%8A%E5%A4%A9%E5%8E%BB%E5%A4%A7%E6%9E%97%E6%85%88%E6%BF%9F%EF%BD%9E%E7%9C%8B%E6%88%91%E5%8F%94%E5%8F%94/</guid><description>&lt;p&gt;哈哈，今天很開心，我爸媽今天來中正看我，最主要是我爸的弟弟，也就是我叔叔，在大林慈濟醫院住院，所以我爸媽來看他，順便來看我了，距離上次回高雄是在中秋節的時候，我爸媽超久沒看到我了，這次一定要看到我，他們才肯回家，當然啦，我媽比較怕我亂吃亂穿，所以帶蠻多東西給我的，我爸超好笑的，開車來中正宿舍下面，然後在下面大喊：『臭柏毅，爸爸來了，快下來』，囧～超轄，我爸都不怕丟臉的喔，呼呼然後我就衝下去幫他們開門，讓他們進來我房間，我爸媽拿了幾百顆橘子給我，還有六顆蘋果，還有兩包泡牛奶的碎片，哈哈我超愛的，然後是好立克隨身包，還有兩包我愛吃的餅乾，然後最後是床墊，囧其實我有叫我媽不要帶床墊，因為我都是睡板子，我大學四年都是睡板子，所以還蠻習慣的，其實我睡覺還蠻好睡得，只要安靜，我哪裡都可以睡，哈哈，我要求不多，我很好養的，雖然我回家是睡雙人床，真爽然後只有我一個人，哈哈，都沒人管我，真好～ 今天重點其實是去看我叔叔，之前我已經有寫一篇&lt;a href="http://life.wu-boy.com/2007/08/24/45/"&gt;去台南看我叔叔&lt;/a&gt;，可是叔叔的病情好像又惡化了，所以必須住院觀察，以及做化療，呼呼，聽起來還算恐怖，上次去台南看叔叔，感覺叔叔也很好了，叔叔自己也蠻開朗的，可是現在又要住院化療了，非常的痛苦，最辛苦的莫非就是我阿姨了，不過這不是重點阿，重點是叔叔要振作阿，不要愁眉苦臉，要勇敢面對病情，不要那麼沮上，在撐過兩個月，你就可以回家了，不要對自己沒希望，家裏還有兩個小孩要等你回家，所以我希望叔叔能振作，每天笑臉常開，這樣壞壞的病毒，就會遠離你的身體了，看到我爸爸，為你留著眼淚，做大哥的，哪有不照顧自己的弟弟的，大家都是親人，大家都希望你振作起來，寫這篇，我希望能祝福我叔叔，勇敢面對病情，不要往壞處想，我想這樣病毒就會因為你太快樂，而呆不下去，就遠離妳了，然後叔叔早日康復。 話說好像也不能像我一樣太樂觀，都把壞的往好的想，然後我媽是把好的往壞的想，我都跟我爸一樣樂天，每天都往好的想，囧，難怪我跟我爸都一樣，那麼開心，哈哈。&lt;/p&gt;</description></item><item><title>[心情]各位覺得大學畢業很重要嗎?</title><link>https://blog.wu-boy.com/2007/11/%E5%BF%83%E6%83%85%E5%90%84%E4%BD%8D%E8%A6%BA%E5%BE%97%E5%A4%A7%E5%AD%B8%E7%95%A2%E6%A5%AD%E5%BE%88%E9%87%8D%E8%A6%81%E5%97%8E/</link><pubDate>Sat, 17 Nov 2007 01:55:22 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/11/%E5%BF%83%E6%83%85%E5%90%84%E4%BD%8D%E8%A6%BA%E5%BE%97%E5%A4%A7%E5%AD%B8%E7%95%A2%E6%A5%AD%E5%BE%88%E9%87%8D%E8%A6%81%E5%97%8E/</guid><description>&lt;p&gt;我在 ptt 的 男人版 [MenTalk 版] 發現一個討論主題，『各位覺得大學畢業很重要嗎?』，這個主題，都是過一段時間都會有人問到，算是月經題吧，但是我看完整個討論串的結果，其實都是個人遇到的狀況不同，在討論的問題當中，原po因為是高中學歷，所以女朋友很瞧不起他，不過我更覺得這個女朋友更奇怪，在現在這個社會，學歷並不是代表一切，然後因為學歷瞧不起別人，這個其實我相當看不起那些瞧不起低學歷的人，就好像我高中的時候，我讀的是後半段班級，也就是所謂的放牛班，話說我還真是奇怪，轉學考試科目考國文英文數學，那時候道明中學出了名考試題目很難，果然讓我見識到了，轉學考三科成績加起來超過80分就可以轉進去學校了，哈哈，很不幸的是，我只有寫一科數學，所以我總分100初多吧，其中有90分是數學，哈哈，我很奇怪吧，不過這不是重點，其實不只是在找工作的時候，老闆會看你的學歷以外，在學校裡面，老師也都是喜歡成績好的學生。&lt;/p&gt;</description></item><item><title>[FreeBSD] 無線 AP 鎖定使用者 MAC Address</title><link>https://blog.wu-boy.com/2007/11/freebsd-%E7%84%A1%E7%B7%9A-ap-%E9%8E%96%E5%AE%9A%E4%BD%BF%E7%94%A8%E8%80%85-mac-address/</link><pubDate>Fri, 16 Nov 2007 11:23:39 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/11/freebsd-%E7%84%A1%E7%B7%9A-ap-%E9%8E%96%E5%AE%9A%E4%BD%BF%E7%94%A8%E8%80%85-mac-address/</guid><description>&lt;p&gt;在之前的文章已經提到如何利用一張無線網卡架設 AP 伺服器，&lt;a href="http://blog.wu-boy.com/2007/10/22/122/"&gt;[FreeBSD] 無線網卡架設AP Server DWL-G520 Ralink RT2561&lt;/a&gt;，但是如何跟外面賣得產品一樣可以鎖mac呢，雖然mac的竄改相當普遍，linux底下只要下一個指令就可以達到了，不過你要知道別人的mac還蠻難的吧，除非你跟她同一網域，所以底下就介紹在freebsd底下如何做到。 在linux底下其實很簡單，因為google一下就好了 &lt;a href="http://madwifi.org/wiki/UserDocs"&gt;http://madwifi.org/wiki/UserDocs&lt;/a&gt; 這個網頁相當豐富，教你如何在linux底下實做ap跟鎖MAC。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Steps 1. First, make sure your card is not set to any particular mode or essid. 2. Run: * To flush the list of MAC addresses: iwpriv ath0 maccmd 3 * To make the list a whitelist: iwpriv ath0 maccmd 1 3. Put the card in master mode: iwconfig ath0 mode master essid test ifconfig ath0 up 4. At this point, nothing will be able to connect to the AP, since the whitelist is empty. To rectify this, you need to add some MACs to the list: iwpriv ath0 addmac 00:01:02:03:04:05 在 FreeBSD 底下，作法也蠻容易的，就是利用 ifconfig 這個指令就可以做到了，底下是我 man ifconfig 看到的&lt;/p&gt;</description></item><item><title>[生活日記] 今天網路組實驗室 221大掃除</title><link>https://blog.wu-boy.com/2007/11/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E4%BB%8A%E5%A4%A9%E7%B6%B2%E8%B7%AF%E7%B5%84%E5%AF%A6%E9%A9%97%E5%AE%A4-221%E5%A4%A7%E6%8E%83%E9%99%A4/</link><pubDate>Fri, 09 Nov 2007 01:56:39 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/11/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E4%BB%8A%E5%A4%A9%E7%B6%B2%E8%B7%AF%E7%B5%84%E5%AF%A6%E9%A9%97%E5%AE%A4-221%E5%A4%A7%E6%8E%83%E9%99%A4/</guid><description>&lt;p&gt;今天是我們實驗室221大掃除，因為221大部分都是實驗機器，以及重要的伺服器，所以決定今天來大掃除，只要在221座位的，都要去大掃除，恩，到了下午，我上完演講課，就去221掃自己的座位了，打掃負責人是碩二的一個學姐，組上很多活動都是她一個人在弄，還蠻厲害的，定餐點，打掃，想活動之類的，都是她一個人負責，因為碩二只有她一個女生，所以我們都叫他大姐頭，她做事還蠻認真的，221大大小小都是她負責在盯，然後下午因為我要移動座位，可是新的座位目前還有人在使用，我就想說我晚上再回來弄，然後我跑去打籃球了，然後我打完回來，我就丟那個大姐頭，然後大姐頭就開始說我不合群，說大家都在掃，只有我一個人跑走，然後我就解釋了我剛剛說得原因，因為有人還在我新位子處理東西，所以我晚上才去，對話內容如下&lt;/p&gt;</description></item><item><title>[生活]剪頭髮 跟 買一些日常用具</title><link>https://blog.wu-boy.com/2007/11/%E7%94%9F%E6%B4%BB%E5%89%AA%E9%A0%AD%E9%AB%AE-%E8%B7%9F-%E8%B2%B7%E4%B8%80%E4%BA%9B%E6%97%A5%E5%B8%B8%E7%94%A8%E5%85%B7/</link><pubDate>Mon, 05 Nov 2007 01:57:34 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/11/%E7%94%9F%E6%B4%BB%E5%89%AA%E9%A0%AD%E9%AB%AE-%E8%B7%9F-%E8%B2%B7%E4%B8%80%E4%BA%9B%E6%97%A5%E5%B8%B8%E7%94%A8%E5%85%B7/</guid><description>&lt;p&gt;今天又是我花蠻多錢的一天，因為買了一些日常用具跟去剪了一個小貝克漢的頭髮，明天在去借相機自拍好了，哈哈，自己發現頭髮有點長，雖然大家都說我頭法很短，可是我自己覺得還蠻長的，所以就去剪了，哈哈，不過我理了一個小貝克漢的頭，因為也才180元，不包洗頭，還蠻便宜的啦，我在高雄也是剪類似的頭，但是價錢是500元，品質真的有差，哈哈，不過我覺得都ok，剪起來也不會差太多，那個阿姨也不錯，剪得不會很隨便啦，所以推一下了，哈哈，話說我這種頭還蠻少人在剪的，看到現在大學生幾乎都是留長頭髮，好像因為明星都是如此喔？所以大家都不喜歡頭髮短的，很像在當兵？哈哈～不過我爸媽都說我短頭髮比較好看，囧。 重點是那位理髮 阿姨說：『我是大學一年級嗎？』 我就說：『不是』 她就說：『不然大幾阿』 我就說：『我碩士了啦』 她就說：『妳碩士了喔，碩一是吧』 我就說：『我碩士三年級了啦』 她就說：『為甚麼我完全看不出來呢？囧』 我就說：『哈哈，很多人都這麼說啦，哈哈』狂笑 然後又跑去民雄買一下生活的工具，不過也沒買啥，剛好碰到那家店週年慶，所以東西好像比較便宜，不過我都是挑那種特價超級便宜的，哈哈，我超級省錢的，嘿嘿，我買了肥皂，跟一個碗公，跟一罐洗潔精，這樣總共78元，很便宜吧，因為肥皂六個39元，然後碗公『有蓋子還附送筷子跟湯匙』這個29元，然後洗潔精『用來洗碗的』這個10元，哈哈，然後又去隔壁全聯買了一罐大牛奶，108元，所以消費了186元，哈哈還ok啦～&lt;/p&gt;</description></item><item><title>[生活]網路組 碩一 碩二 籃球比賽</title><link>https://blog.wu-boy.com/2007/10/%E7%94%9F%E6%B4%BB%E7%B6%B2%E8%B7%AF%E7%B5%84-%E7%A2%A9%E4%B8%80-%E7%A2%A9%E4%BA%8C-%E7%B1%83%E7%90%83%E6%AF%94%E8%B3%BD/</link><pubDate>Wed, 31 Oct 2007 01:58:25 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/10/%E7%94%9F%E6%B4%BB%E7%B6%B2%E8%B7%AF%E7%B5%84-%E7%A2%A9%E4%B8%80-%E7%A2%A9%E4%BA%8C-%E7%B1%83%E7%90%83%E6%AF%94%E8%B3%BD/</guid><description>&lt;p&gt;禮拜五又是比籃球賽了，因為上次比壘球賽，&lt;a href="http://life.wu-boy.com/2007/10/20/65/"&gt;新生盃壘球比賽～ 跟學長們比賽 網路組&lt;/a&gt;，碩二學長們，不甘心，所以又想跟我們比籃球賽，沒辦法，可能是我們碩一太強？哈哈，話說我到底是碩一還是碩三，囧，好像沒有人把我當學長看，囧，不過沒關西，打球最快樂了，哈哈。 話說我們比賽全場，總共分上半場，下半場，我們是不限時間，只要那一隊先得滿31分，就算贏了，所以上下半場總分最高62分，由於碩一來的人數太多，所以原本我碩一先發，結果碩一就把我丟到碩二去了，所以我上半場就打碩二了，打碩二的時候，一直被電，因為太多人跑不動了，哈哈，不過這很正常，不過我可以跑滿整場，哈哈，上半場打很悶，因為碩一太強，而且碩二氣氛不太好，因為有人得失心很重，所以很悶，碩二整個氣氛都是怪，哈哈，因為打球要快樂的我，所以我不太喜歡這種感覺，不符合我快樂小惡魔的習性，哈哈。 下半場，我就跑去打碩一了，囧～，我是場上唯一打過碩二跟碩一的，碩二都說我背叛他們，哈哈，沒辦法，不過我打碩一就打滿整場，體力真好，我打完之後，還跟其他朋友打三三，打完三三然後呢，又去找180的pk一對一，囧我同學都說我很變態，都不會累，不過打完之後，回去睡很久，睡完就好了，哈哈，我真的超愛運動。&lt;/p&gt;</description></item><item><title>[轉錄]給苦追不到女孩的男性幾點建議</title><link>https://blog.wu-boy.com/2007/10/%E8%BD%89%E9%8C%84%E7%B5%A6%E8%8B%A6%E8%BF%BD%E4%B8%8D%E5%88%B0%E5%A5%B3%E5%AD%A9%E7%9A%84%E7%94%B7%E6%80%A7%E5%B9%BE%E9%BB%9E%E5%BB%BA%E8%AD%B0/</link><pubDate>Fri, 26 Oct 2007 01:59:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/10/%E8%BD%89%E9%8C%84%E7%B5%A6%E8%8B%A6%E8%BF%BD%E4%B8%8D%E5%88%B0%E5%A5%B3%E5%AD%A9%E7%9A%84%E7%94%B7%E6%80%A7%E5%B9%BE%E9%BB%9E%E5%BB%BA%E8%AD%B0/</guid><description>&lt;p&gt;這個標題很帥吧，這是我在ptt的男女版看到的，不過這標題不知道適不適合我，不過沒關西，先來看看底下的文章&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;作者: manfa1e (阿man) 看板: Boy-Girl ※ [本文轉錄自 Boy-Girl 看板] 作者: manfa1e (阿man) 看板: Boy-Girl 標題: 給苦追不到女孩的男性幾點建議 時間: Thu Oct 25 11:19:51 2007 1. 對女孩子好的迷思 是不是對女孩子好就有用? 我必須告訴你 對女孩子好 要她覺得好才算好 你自認對她好是不算的啦! 她要是不覺得這個人對她好 此人就算幫她修電腦 當司機 隨傳隨到 對她而言 都只是應該做的事情而已 她不會因此而感激你 比較有良心點的 會請你吃飯 不願意欠你人情 比較糟糕一點的就會放大絕 “我又沒有強迫你些事情” 她要是覺得這個人對她好 此人就算去劈腿或是揍她 她還是覺得此人對她很好 和女孩子往來 維持著適度的關心就行了 不需要到做牛做馬隨傳隨到的地步 做得太多 並不會達到你想要的結果 這只會讓她覺得你很好用 而多用你而已 2. 情侶先從好朋友交起? 我只能說 這種話根本就是騙沒交過女友的純情少男的爛話 因為這話是有前提的 這個有可能成為男女朋友的 “好朋友” 前提 就是她對你有感覺 絕大部分的女孩子在開頭幾次與你的相處和對話 就已經決定了對你的感覺了 (也就是有沒有和你在一起的可能 要是沒有感覺 那就沒希望了) 這是女性的大絕 – 感覺 沒有任何邏輯與理性可言 就只是你們兩個的緣分而已 要她有願意繼續多認識你的感覺 你跟她當朋友後才有在一起的希望 否則你只是做白工而已 這也就是一種若有似無 所謂的 “好感” “情愫” 要是她對你沒有前述的感覺 你跟她成為再好的朋友也不可能追到她 浪費時間而已 3. 我目前暫時不想交男朋友 很多人都提過 講這種話的女孩 通常會很快的有男友 為什麼? 因為她對你沒感覺 你不是她的菜 她只是不想傷害你而已 對已經放出這種話的女生苦等苦追 是一定不會有結果的 4. 和沒有追到的女生該如何相處? 平常心 把這女孩從心中放下 做點別的事情分散你的注意力 這樣你就會慢慢釋懷了 不要想說我跟她先做朋友 看看能不能等到她或追到她 你追不到的女生 和你成為朋友的機率不大 更何況她日後去交別的男朋友時 你看到人家卿卿我我會更傷心 如果追不到她真的讓你很傷心 那就把和她的一切聯繫與往來切斷 此後別理她吧! 不要想東想西 怕這樣會太小心眼或她會給你不好的評價 因為不想跟她連絡這事情並沒有什麼好丟臉的 反正你跟她繼續聯繫與往來並不會讓你心情變好 也不會讓你追到手 你們兩個的交集已經過去 日後她也不可能跟你成為一輩子的朋友 你又何必在乎這些? 讓你自己心情好點比較重要 簡單的講一些心得 給各位苦惱的男性作為參考 這是一篇還不錯的文章，值得我去思考很多事情，關於上面的第一點，我覺得說得非常好，對女生好，不是自己說好就好，要女生覺得你對她好，這樣才是正確的，就像說我自己認為我有在追女生了，可是女生沒有感覺到你在追我，這是同樣意思，一百次的感動，比不上給女生的一次心動，這個社會就是很現實，在連續劇的情節，完全不可能發生再現時生活中，我從大二開始接觸電腦，到現在修過無數女生的電腦，所以有女都碼認為我幫他們修電腦是很正常，我就只能當好人，比較好的女生就是會拿東西給我吃，大概就是這麼分別，室友的女朋友電腦也是我負責，我都在幫別人養老婆，這暑假，我高中喜歡的女生，還不是把電腦搬給我請我幫她修，我問她，妳不是有男朋友，她回答我說，她男朋友會托很久才幫她修，我爸就說我是北七，做一些無意義的事情，哈哈，我就是笨阿，我不懂女生在想什麼，也因為這樣，我比任何人都快樂，因為我把任何事情都單純化了，不過這世界原本就是如此，各式各樣的人都有，這沒什麼，跟我一樣沒教過女朋友的，還一堆呢，我有啥好擔心我自己的，只是會被別人笑而已，被笑又如何，我的出生就是要帶給大家快樂，哈哈。 第二點說得好，妳如果追一個，她永遠不會喜歡的你的女生，真是白費，就像是妳送一百次宵夜給你喜歡的女生，絕對比不是一次會讓她心動的男生的宵夜，至少我覺得人就是如此，自己有自己喜歡的菜，我就在半夜去女生那邊修電腦，她就把宵夜拿給我吃，說是剛剛有一個男生送她的，說已經送她很多次了，她不是把宵夜給她室友吃，不然就是丟掉，我就說，幹麼浪費阿，下次他送來，麻煩拿來給我，我在宿舍下面等妳，不然我過來拿都可以，哈哈大學就是這樣來的，宵夜都是免錢的，哈哈。 第三點，這個超級明顯的，女生不喜歡你，我自己算是蠻識相的，不過話說，我還表白過2-3次，都被拒絕，囧～無所謂啦，哈哈～快樂就好，表白只是不想欺騙自己的感情，表白過了，會比較爽，至於女生喜不喜歡我，我就無所為了，因為又不能強迫女生喜歡我，哈哈大家說對吧，感情的事情，本來就是要雙方付出，光是單方面付出，到最後肯定會走上分手的路，很正常吧，單方面付出，不是會很辛苦嗎？那之後的感情，誰來維持，不如當朋友就好，囧～哈哈。 第四點，跟沒追到的女生，怎麼相處，不就是當朋友嗎？這很難嗎？不過我還發現很多男生，他們沒有追到女生，反而就不是朋友了，所以我朋友都說我很強，囧～這也還好吧，可能我都沒追過女生吧？哈哈女生都說我沒又追她，只會嘴巴說說，沒有實際行動，囧～這是我的缺點，我比較被動，哈哈，就像實驗室的女生，都會說我每天都在嘻嘻哈哈，跟空安一樣，果然自己覺得有在追女生，可是女生並不認為你有在追她，哈哈又會回到第一點的問題，不過沒差啦，既然妳不認為我在追妳，或者是我喜歡你的話，那也無所謂了，因為將來發生的事情，都會很讓我很高興，也很快樂，我要成為一個比別人快樂的人。&lt;/p&gt;</description></item><item><title>[FreeBSD] 無線網卡架設AP Server DWL-G520 Ralink RT2561</title><link>https://blog.wu-boy.com/2007/10/freebsd-%E7%84%A1%E7%B7%9A%E7%B6%B2%E5%8D%A1%E6%9E%B6%E8%A8%ADap-server-dwl-g520-ralink-rt2561/</link><pubDate>Mon, 22 Oct 2007 12:22:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/10/freebsd-%E7%84%A1%E7%B7%9A%E7%B6%B2%E5%8D%A1%E6%9E%B6%E8%A8%ADap-server-dwl-g520-ralink-rt2561/</guid><description>&lt;p&gt;今天終於搞定了這張網卡，同樣的 DWL-G520 有兩種版本，一個是 Atheros 另一個就是大廠 ralink 了，不過話說我自己已經把 Atheros 晶片的無線網卡實做過一個ap server了，其實也不難啦，不過之前在搞 ralink 的晶片的時候，是可以驅動，可是就是弄不起來ap，後來怎麼解覺得呢，那就是換freebsd的版本，我之前是在 FreeBSD 6.2 release 底下弄的，我換到 FreeBSD 6.2-STABLE-200709版本，就馬上抓到，然後就進行ap的架設，後來就成功了，相當爽，畢竟可以繼續惡搞其他東西了。 接下來教大家如何安裝了，系統配備如下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;硬體：i386 PC Intel P4 1.6G&lt;/li&gt;
&lt;li&gt;記憶體：256M RAM&lt;/li&gt;
&lt;li&gt;網卡：2 片網卡 ( 一般 100M 網卡 + 一片 D-Link DWL-G520 54G無線網卡 )&lt;/li&gt;
&lt;li&gt;作業系統：FreeBSD 6.2 Stable&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[生活]新生盃壘球比賽～ 跟學長們比賽 網路組</title><link>https://blog.wu-boy.com/2007/10/%E7%94%9F%E6%B4%BB%E6%96%B0%E7%94%9F%E7%9B%83%E5%A3%98%E7%90%83%E6%AF%94%E8%B3%BD%EF%BD%9E-%E8%B7%9F%E5%AD%B8%E9%95%B7%E5%80%91%E6%AF%94%E8%B3%BD-%E7%B6%B2%E8%B7%AF%E7%B5%84/</link><pubDate>Sat, 20 Oct 2007 01:59:52 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/10/%E7%94%9F%E6%B4%BB%E6%96%B0%E7%94%9F%E7%9B%83%E5%A3%98%E7%90%83%E6%AF%94%E8%B3%BD%EF%BD%9E-%E8%B7%9F%E5%AD%B8%E9%95%B7%E5%80%91%E6%AF%94%E8%B3%BD-%E7%B6%B2%E8%B7%AF%E7%B5%84/</guid><description>&lt;p&gt;先來一張我的個人照吧～這張圖是在賽前練習，不知道誰幫我照的 &lt;a href="https://www.flickr.com/photos/appleboy/1636806112/" title="Photo Sharing"&gt;&lt;img src="https://i0.wp.com/farm3.static.flickr.com/2191/1636806112_e387f5fe22.jpg?resize=500%2C375&amp;#038;ssl=1" alt="DSCN3034" data-recalc-dims="1" /&gt;&lt;/a&gt; 又是一年一度新學期開始會舉辦的比賽，而我呢當然也是比賽的重要球員了，到了球場，一堆碩二的同學叫我打他們那隊，不過我好像去碩一球隊去了，其實我兩隊都可以參加，因為我碩三了，哈哈，到最後還是參加了碩一，畢竟我真的是重讀，我跟碩一其實沒啥差別，很多課程都碼一起修，所以我是碩一，哈哈不過我也是可以碩三，好啦隨便啦，囧～反正玩的最爽最重要。 話說今年我們碩一真的還蠻強的，我老闆的學生只有兩個男生，我跟另一個宗翰，宗翰真的爆強，哈哈以前是中原資工的系隊，不過好歹我也是以前東華電機系隊的負責收球的球童，哈哈，我真的不強。介紹一下雙方球員好了，先來碩二的 &lt;a href="https://www.flickr.com/photos/appleboy/1636810056/" title="Photo Sharing"&gt;&lt;img src="https://i1.wp.com/farm3.static.flickr.com/2278/1636810056_239b04b6bf.jpg?resize=500%2C375&amp;#038;ssl=1" alt="DSCN3036" data-recalc-dims="1" /&gt;&lt;/a&gt; 囧左邊是我老闆，很熱心參與很多活動，最前面這個是碩二唯一的女生，也是我老闆的學生。 接下來是碩一新生了，我們是一群火爆浪子 &lt;a href="https://www.flickr.com/photos/appleboy/1636813700/" title="Photo Sharing"&gt;&lt;img src="https://i0.wp.com/farm3.static.flickr.com/2385/1636813700_881b3b6868.jpg?resize=500%2C375&amp;#038;ssl=1" alt="DSCN3038" data-recalc-dims="1" /&gt;&lt;/a&gt; 我當然是排在最前面啦，我一直拿的球棒，我真的很想趕快比賽，手很養 &lt;a href="https://www.flickr.com/photos/appleboy/1635939473/" title="Photo Sharing"&gt;&lt;img src="https://i1.wp.com/farm3.static.flickr.com/2354/1635939473_edd11b581d.jpg?resize=500%2C375&amp;#038;ssl=1" alt="DSCN3040" data-recalc-dims="1" /&gt;&lt;/a&gt; 雙方要握手了，哈哈～ 兩隊要列隊好，聽裁判講話 &lt;a href="https://www.flickr.com/photos/appleboy/1635941155/" title="Photo Sharing"&gt;&lt;img src="https://i2.wp.com/farm3.static.flickr.com/2292/1635941155_5d7b435198.jpg?resize=500%2C375&amp;#038;ssl=1" alt="DSCN3041" data-recalc-dims="1" /&gt;&lt;/a&gt; 我真北爛，拿球棒去跟別人握手，不過這個唯一的組花，還跟我玩，真北爛 這場比賽好像都是你來我往，不過到最結果是我們碩一輸沒錯，然後要請碩二的吃肯得機，這是每一年都會經過的過程，不過我兩年前請過了，所以我不必請啦，我只需要負責吃，哈哈，真爽，最後，我們全體大合照，不過照片好像都不太清楚 &lt;a href="https://www.flickr.com/photos/appleboy/1636154035/" title="Photo Sharing"&gt;&lt;img src="https://i0.wp.com/farm3.static.flickr.com/2192/1636154035_2b59eb4912.jpg?resize=500%2C375&amp;#038;ssl=1" alt="DSCN3161" data-recalc-dims="1" /&gt;&lt;/a&gt; &lt;a href="https://www.flickr.com/photos/appleboy/1637027982/" title="Photo Sharing"&gt;&lt;img src="https://i1.wp.com/farm3.static.flickr.com/2004/1637027982_5156c93e9a.jpg?resize=500%2C375&amp;#038;ssl=1" alt="DSCN3159" data-recalc-dims="1" /&gt;&lt;/a&gt; &lt;a href="https://www.flickr.com/photos/appleboy/1637033940/" title="Photo Sharing"&gt;&lt;img src="https://i2.wp.com/farm3.static.flickr.com/2237/1637033940_608aaab199.jpg?resize=500%2C375&amp;#038;ssl=1" alt="DSCN3162" data-recalc-dims="1" /&gt;&lt;/a&gt; &lt;a href="https://www.flickr.com/photos/appleboy/1636158029/" title="Photo Sharing"&gt;&lt;img src="https://i0.wp.com/farm3.static.flickr.com/2126/1636158029_d588ce6dd0.jpg?resize=500%2C375&amp;#038;ssl=1" alt="DSCN3164" data-recalc-dims="1" /&gt;&lt;/a&gt; 歡樂的結束了，骨頭快散了～ 不過下禮拜還有籃球比賽，真爽&lt;/p&gt;</description></item><item><title>[嘉義美食] 吃好料的～ 鄉情日本料理 跟 火鍋</title><link>https://blog.wu-boy.com/2007/10/%E5%98%89%E7%BE%A9%E7%BE%8E%E9%A3%9F-%E5%90%83%E5%A5%BD%E6%96%99%E7%9A%84%EF%BD%9E-%E9%84%89%E6%83%85%E6%97%A5%E6%9C%AC%E6%96%99%E7%90%86-%E8%B7%9F-%E7%81%AB%E9%8D%8B/</link><pubDate>Sun, 14 Oct 2007 02:00:41 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/10/%E5%98%89%E7%BE%A9%E7%BE%8E%E9%A3%9F-%E5%90%83%E5%A5%BD%E6%96%99%E7%9A%84%EF%BD%9E-%E9%84%89%E6%83%85%E6%97%A5%E6%9C%AC%E6%96%99%E7%90%86-%E8%B7%9F-%E7%81%AB%E9%8D%8B/</guid><description>&lt;p&gt;這裡拜六日又去吃好料的，哈哈，因為上次颱風去家樂福，沒有吃到日本料理，所以今天又跑去吃了，我的荷包幾乎都是花在吃，不是幾乎，是根本就是，一個月的開銷，都在吃，除了吃之外，我好像就幾乎不花錢了，我也不會買衣服，啥都不會，囧，我真的是一個生活白痴，哈哈，不過還好啦，我活的還不錯。 昨天跟我朋友還有她馬子去吃民雄的火鍋，不是吃到飽的，大概牛羊豬火鍋價錢大概170吧，好像不會太便宜，也不會太貴，出來的料理，如果女生去吃的話差不多，如果男生去吃的話，那就要小小抱怨一下了，畢竟男生食量比較大阿，感覺男生去吃飯，都要挑吃到飽的，不過話說民雄已經被火鍋店佔據了，到處都是火鍋店，不過下次我還要跟朋友去吃一家千葉火鍋，也是在民雄，不過是吃到飽的，哈哈，除了去民雄之外，我還去裝了我的機車的後照鏡，我朋友一直叫我裝，囧，所以我就裝了，還好，也不會很貴，150元而已，我不是裝原廠的，所以就還ok，其實我還蠻有再看後照鏡的，不過之前我拔掉是因為我裝後照鏡，會騎車比較快，沒裝的話我騎車會比較慢，哈哈，大家別學我喔，我可是有練過的喔。 今天晚上，跑去嘉義市吃鄉情日本料理，其實這家店就跟普通沒有冷氣的路邊攤差不多，不過東西還蠻好吃的，我點了125元的東西，大概就一份綜合壽司『50元』然後蝦子手卷『40元』，跟一碗湯『35元』，大概是這樣，很好吃，真的，不過我還蠻多不能吃得，哈哈一堆生鮮沙拉，我都不能點，哈哈我討厭美乃滋的味道，哈哈，所以每次吃飯，朋友都會問我，什麼不吃，原本朋友說要請我披薩，囧，我超級討厭披薩的，就算要請我，我也不要去，哈哈。&lt;/p&gt;</description></item><item><title>[替代役]我最想感謝的兩個人～ 國史館台灣文獻館</title><link>https://blog.wu-boy.com/2007/10/%E6%9B%BF%E4%BB%A3%E5%BD%B9%E6%88%91%E6%9C%80%E6%83%B3%E6%84%9F%E8%AC%9D%E7%9A%84%E5%85%A9%E5%80%8B%E4%BA%BA%EF%BD%9E-%E5%9C%8B%E5%8F%B2%E9%A4%A8%E5%8F%B0%E7%81%A3%E6%96%87%E7%8D%BB%E9%A4%A8/</link><pubDate>Thu, 11 Oct 2007 02:02:12 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/10/%E6%9B%BF%E4%BB%A3%E5%BD%B9%E6%88%91%E6%9C%80%E6%83%B3%E6%84%9F%E8%AC%9D%E7%9A%84%E5%85%A9%E5%80%8B%E4%BA%BA%EF%BD%9E-%E5%9C%8B%E5%8F%B2%E9%A4%A8%E5%8F%B0%E7%81%A3%E6%96%87%E7%8D%BB%E9%A4%A8/</guid><description>&lt;p&gt;首先我要回想起我剛到 &lt;a href="http://www.th.gov.tw/"&gt;國史館台灣文獻館&lt;/a&gt; 的時候，那時候的我，就像是一隻被關很久的獅子，重現光明，回到大地的草原，我就好像回到高中的我一模一樣，我剛轉學到道明的時候，我給別人的感覺就是這樣，一個字『屌』跟目中無人，對，沒錯很多人跟我說過，如果在還沒完全認識我之前，一定會認定我是這個樣子，不管是以前，還是現在，我總是帶給大家這種感覺，無論是對女生，或者是對男生，而在剛到 &lt;a href="http://www.th.gov.tw/"&gt;國史館台灣文獻館&lt;/a&gt;，我就已經這樣了，在我的領域，我只要認為對的事情，就算是大家認為是對的，但是不能公開說的，我還是把事情鬧大了，所以那時候的我，大家都很害怕，怕我逃兵，怕我打架，怕我傷害其他替代役，我做人很真實，我從來不隱瞞自己的情緒，我想這也是我的缺點，所謂的要忍耐，在我身上看不到忍耐的跡象，所以我爸媽一致認為我以後出去外面公司工作一定會吃虧，當然我很不相信我會這樣，所以我在前三個月的高雄公司上班，我表現的非常好，在公司裡面，我是個開心果，跟公司全部的人出去聚餐，也都是以我當搞笑點，大家都還蠻喜歡我的，雖然我的舉動常常嚇到大家，大家都說我很敢說話，不過我始終認為大家都是朋友，相處久了，大家一致認為我很好相處，我果然都是要經過相處之後，大家才知道我真正的為人。 回到我剛到國史館文獻館，在經過兩個禮拜的徵選，總共有三個單位，整理組，採集組，編輯組，可以選擇20個替代役，而我是最後一個被選上的，因為我在兩個禮拜的專訓，鬧到大家雞飛狗跳，我能體會各組的組長不願意選我的原因，可是我非常感謝整理組的的鄒組長，他是唯一認定我的組長，他是第一順位選我的，因為他不相信我這麼壞，我非常的感謝他，當然我在這一年的當替代役，沒有另他失望，我對館內個貢獻，大家有目共睹，館長以我們整理組為榮，這點我非常高興，因為我做到了，我讓組長走路有風，我讓館長對我另眼看待。 另外我要感謝的這兩個人，都是整理組的人，一位是把整理組當作自己家的米姐，另一位就是坐在我隔壁的月鄉姐，這兩位，我非常非常的感謝，因為他們真的照顧我在當替代役的時候很多，也因為跟我的接觸，而讓他們被其他長官釘上，害他們被挨罵很多次，可是他們並不認為我這麼壞，可能我跟他們相處的還不錯，在這一年當中，常常提醒我很多事情，也很照顧我，常常買東西給我吃，米姐做事很認真，整理組因為有他，所以乾乾淨淨，也因為有她，所以我跟很多人中午的便當，都是他在幫忙處理訂購，我的中餐都是靠她了，她也常常帶家裏的東西給我吃，雖然她知道我很挑食，可是她還是帶很多我很愛吃得東西給我，平時常常提醒我要打卡，因為我常常做事情忘記打卡，我常常把事情當作是責任制，所以我工作時間很不固定，我沒有那種公務人員5點下班的那種觀念，哈哈反正在那邊很無聊，所以就蠻晚下班的，非常感謝她照顧了我一年，雖然因為我，害她常常被廖秘書或者是蕭編撰(女)念說常常跟我靠太近，我真的很感謝也很對不起她，另一位月鄉姐，雖然我跟她相處到去年12月底，然後因為一些原因，所以不能繼續待在館內，但是之後我都還有跟她密切聯絡，畢竟她也很照顧我，在辦公室，坐在我隔壁，因為我跟她爾而會聊天，她可能覺得我是個乖小孩，只不過個性有點衝動，所以有時候她會叫我忍耐，不要太衝動，我非常感謝她，因為她可以剋制我衝動的個性，常常教導我一些如何把事情做圓滑，因為我常常在館內當壞人，不過我對於館內工作的態度，已經傳遍整個 &lt;a href="http://www.th.gov.tw"&gt;國史館台灣文獻館&lt;/a&gt;，包含台北的 &lt;a href="http://www.drnh.gov.tw/"&gt;國史館&lt;/a&gt;，我也不曉得我的事蹟是如何傳到那邊的，可能是我常常代表本館，到台北中央研究院開會吧，最後，這篇就是我對兩位的感謝，你們對我的一舉一動，我一定會記在腦袋，我不會忘記的，最後最後，我很高興上天安排我們的相遇，讓我認識你們，也讓你們對我操心了一整年，我除了能說感謝，我不知道我能做什麼了，將來有機會，我一定會回到館內，跟大家聚一聚的。&lt;/p&gt;</description></item><item><title>May 25 2007 蕭敬騰(1) vs 楊宗緯(2) (新不了情)</title><link>https://blog.wu-boy.com/2007/10/may-25-2007-%E8%95%AD%E6%95%AC%E9%A8%B01-vs-%E6%A5%8A%E5%AE%97%E7%B7%AF2-%E6%96%B0%E4%B8%8D%E4%BA%86%E6%83%85/</link><pubDate>Tue, 02 Oct 2007 02:03:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/10/may-25-2007-%E8%95%AD%E6%95%AC%E9%A8%B01-vs-%E6%A5%8A%E5%AE%97%E7%B7%AF2-%E6%96%B0%E4%B8%8D%E4%BA%86%E6%83%85/</guid><description>&lt;p&gt;我只能說，楊宗緯真的太屌了。哈哈，不過 蕭敬騰 也是不錯的，他改的比較多，可是楊宗緯，只改變一句，就大勝於 蕭敬騰。 兩個都唱的很好聽，大家可以去聽看看～ update 後面片段&lt;/p&gt;</description></item><item><title>[生活日記]一個人吃四個月餅～囧 爽</title><link>https://blog.wu-boy.com/2007/09/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E4%B8%80%E5%80%8B%E4%BA%BA%E5%90%83%E5%9B%9B%E5%80%8B%E6%9C%88%E9%A4%85%EF%BD%9E%E5%9B%A7-%E7%88%BD/</link><pubDate>Sun, 30 Sep 2007 02:04:34 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/09/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E4%B8%80%E5%80%8B%E4%BA%BA%E5%90%83%E5%9B%9B%E5%80%8B%E6%9C%88%E9%A4%85%EF%BD%9E%E5%9B%A7-%E7%88%BD/</guid><description>&lt;p&gt;話說昨天學妹帶六個月餅過來，我吃掉四個了，哈哈，真爽，中餐就吃一個芭辣，加4個月餅，呼呼有點飽，真爽，在lab裡面寫程式然後吃月餅，沒有比這更爽的事情了哈哈，我還真愛吃，囧 然後下午又去打球了，真爽，不過話說我昨天腳扭傷，操，我還跑去打球，我還真是個運動狂，哈哈，可能一天不去體育館都會覺得怪怪的，話說兩年前的我，因為太愛去體育館，所以我老闆的客跟我衝突，我會選擇去體育館，然後換來的是期中考成績太爛，就因為如此，我想讓自己冷靜一下，所以我選擇休學，兩年後今天的我，我改變我的作法，我上完課程才會去體育館，雖然這樣晚餐可能要自己去買了，不能跟同學一起去吃了，沒關西，這我無所謂，哈哈，有時後去體育館也是放鬆整天心情的地方，就算我沒啥運動，可能去那邊只練半小時，也會想去體育館晃晃，因為感覺很不賴。&lt;/p&gt;</description></item><item><title>[生活日記]中秋假期～9月22-25</title><link>https://blog.wu-boy.com/2007/09/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E4%B8%AD%E7%A7%8B%E5%81%87%E6%9C%9F%EF%BD%9E9%E6%9C%8822-25/</link><pubDate>Sat, 29 Sep 2007 02:05:24 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/09/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E4%B8%AD%E7%A7%8B%E5%81%87%E6%9C%9F%EF%BD%9E9%E6%9C%8822-25/</guid><description>&lt;p&gt;話說我禮拜五的凌晨就回來了，意思是說 我禮拜六早上才到，然後跟蚊子聊天到4點吧～沒記錯的話，哈哈～還真晚阿，我本學期第一次這麼晚睡吧，我是乖小孩，都很早睡，很早起床的。 隔天22號睡醒，整天都好像都在寫程式，因為高雄這幾天狂下雨，好像也不太能出去，所以就龜在家裏，把程式寫一寫吧～，真是宅男阿，假日都還在寫程式，所以今天的進度大概是如此 23號了，也該出去了吧，所以跟一位高中好朋友隨性約了出去，到新光三越附近的一家店，吃壽喜燒，操，真他媽難吃，果然吃到飽的都沒啥好料，很便宜250加一成服務費，不過我在台北吃過一次壽喜燒，超級好吃，那才是真正的壽喜燒，果然以後吃東西，盡量不要去選吃到飽的，超級難吃，吃到想吐，後來吃飽，想去買 &lt;a href="http://www.sing-ya.com.tw/"&gt;星野銅鑼燒&lt;/a&gt;，他開在新光三越隔壁，結果我們晚上遠遠看，招牌很大，人很少，想說去買來吃看看，人很少不必排隊，真爽，結果過去，全部賣光，操，問了一下，他說早上開店，2小時之內就賣完，囧，晚上8點了，還開店，都賣完了還開，沒吃到啦，不可能叫我起床排隊吧～囧，離我家雖然很近，不過我不可能爬起來的，哈哈，後來又跑到新光三越看衣服，原本打算跟我同學一起各買一件衣服，不過後來猶豫一下，就不買了，哈哈，然後我們又去一間餐飲店做了下來，在新光三越後面A+1的對面，很精緻的店，很棒，我喜歡，裡面的東西非常好吃，早就知道剛剛不吃壽喜燒了，來吃這間店，價錢不會差到哪裡，然後又好吃，我超喜歡喝他們的香草奶昔，超級好喝，雖然第一次去，不過真的太棒了，超級好喝，結果坐了一下，我朋友說要去夜店，免費的，11點以前入場，學生免費，我第一次進夜店，哈哈，進去之後，根本沒啥人，而且沒有活動，而且沒有妹，所以我們又出來了，結果我們又來了一位朋友，我們又到金礦去喝茶了，後來我肚子太撐，所以就沒點了，我們三個人在金礦裡面，都沒有點飲料，坐在那邊聊天，聊了一小時，囧，後來就各自回家了，哈哈。 24號，一樣又是宅在家裏了，廢話，大家都是選在這天在烤肉，所以都沒有朋友可以出來，打過去，都說，我跟女朋友在一起，不要吵我，囧～噗噗，真是閃死我了，所以我只好龜在家裏看 “不能說的秘密”，看完之後，爽真是好看，女主角很正之外，劇情也不錯，哈哈算是音樂系列的影片，值得推薦給大家看。 25號，最後一天了，今天跟我網路組畢業的同學，一起出來呵飲料，然後順便談一下網路組發生的好事情，要不是我跑去當兵，不然我跟他目前都是畢業狀態，哈哈，不過也沒關西，當兵完，感覺比較好，哈哈。 26號，跟我爸媽開車回中正了，他們順便回娘家看我阿罵，呼呼大概是如此，行程大概是這樣，好長的一篇哈哈。&lt;/p&gt;</description></item><item><title>[生活日記]回到高雄了～</title><link>https://blog.wu-boy.com/2007/09/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E5%9B%9E%E5%88%B0%E9%AB%98%E9%9B%84%E4%BA%86%EF%BD%9E/</link><pubDate>Sun, 23 Sep 2007 02:06:39 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/09/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E5%9B%9E%E5%88%B0%E9%AB%98%E9%9B%84%E4%BA%86%EF%BD%9E/</guid><description>&lt;p&gt;昨天晚上，朋友從台中殺下來中正找我，到中正的時候已經晚上12點半，然後在從中正殺到高雄，還真快阿，一小時就到了，一路上跟他聊天，非常開心，哈哈，聊一下以前在公司的事情，一整個感覺就是爽，後來到高雄，我就跟他去光華夜市這裡吃東西，吃羊肉燴飯，跟排骨湯，哈哈還不錯吃，可是有一間滷肉飯超好吃，竟然說要關店了，一整個囧，想說喝他的排骨酥湯，超棒的說。 話說我下禮拜二又要自己開車上去了，要把一些冬天的東西弄上去了，哈哈～&lt;/p&gt;</description></item><item><title>[FreeBSD] 安裝 memcache for php 多重伺服器共享 Session</title><link>https://blog.wu-boy.com/2007/09/freebsd-%E5%AE%89%E8%A3%9D-memcache-for-php/</link><pubDate>Sat, 22 Sep 2007 13:16:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/09/freebsd-%E5%AE%89%E8%A3%9D-memcache-for-php/</guid><description>&lt;p&gt;今天來玩看看 memcache 看看，話說 memcache 是個非常好用的東西，可以參考官網作法 &lt;a href="http://tw.php.net/memcache"&gt;連結&lt;/a&gt;，其實我在前一個工作，就有老闆問我說，像公司作這麼多網站，有沒有辦法統整成一個，然後底下各種服務，只需要登入過一次就好，而不必重複登入，畢竟會讓使用者覺得很煩，所以就有了 memcache 這東西出來，底下就來介紹 FreeBSD 的安裝方式&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;安裝方法： 安裝 ports 的套件 memcache 跟 pecl-memcache&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;cd /usr/ports/databases/memcached; make install clean
cd /usr/ports/databases/pecl-memcache; make install clean
&lt;/pre&gt; 然後他會把 extension=memcache.so 寫到 /usr/local/etc/php/extensions.ini 然後你只需要重新啟動 apache 即可，還有把 memcached 服務打開 所以請下底下指令 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;echo "memcached_enable=\"YES\"" &gt;&gt; /etc/rc.conf
/usr/local/etc/rc.d/memcached start
/usr/local/etc/rc.d/apache22 restart
&lt;/pre&gt;</description></item><item><title>[生活日記]一個人 一實驗室 中正大學網路組</title><link>https://blog.wu-boy.com/2007/09/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E4%B8%80%E5%80%8B%E4%BA%BA-%E4%B8%80%E5%AF%A6%E9%A9%97%E5%AE%A4-%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E7%B6%B2%E8%B7%AF%E7%B5%84/</link><pubDate>Sun, 16 Sep 2007 02:07:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/09/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E4%B8%80%E5%80%8B%E4%BA%BA-%E4%B8%80%E5%AF%A6%E9%A9%97%E5%AE%A4-%E4%B8%AD%E6%AD%A3%E5%A4%A7%E5%AD%B8%E7%B6%B2%E8%B7%AF%E7%B5%84/</guid><description>&lt;p&gt;每天固定早上9點多起床，今天早上就去實驗室寫程式了，這是老闆 assign 給我的一個工作，因為學長姊要返校跟學弟妹互動以及找老師聊天，所以學長希望有個報名網站，所以這就交給我負責去寫程式統計人數了，然後是要把程式整頓在 &lt;a href="http://journal.cn.ee.ccu.edu.tw/"&gt;CN Journal&lt;/a&gt;，所以今天就來lab 寫程式，早上果然都沒人來，只有我跟一個同學在實驗室，就這樣，整個早上我都在寫程式，終於在下午3點寫完了，果然還是早上有效率，哈哈。 在lab還沒認識很多人，畢竟都是新同學，我還不知道誰是誰？最近上課要來認識一下新同學，反而我跟我自己老闆升碩二的一個同學比較熟，哈哈。&lt;/p&gt;</description></item><item><title>[心情]又要回到兩年前的我？</title><link>https://blog.wu-boy.com/2007/09/%E5%BF%83%E6%83%85%E5%8F%88%E8%A6%81%E5%9B%9E%E5%88%B0%E5%85%A9%E5%B9%B4%E5%89%8D%E7%9A%84%E6%88%91%EF%BC%9F/</link><pubDate>Fri, 14 Sep 2007 02:08:24 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/09/%E5%BF%83%E6%83%85%E5%8F%88%E8%A6%81%E5%9B%9E%E5%88%B0%E5%85%A9%E5%B9%B4%E5%89%8D%E7%9A%84%E6%88%91%EF%BC%9F/</guid><description>&lt;p&gt;最近在思考這個問題，昨天跟老闆meeting下來的結果，我是否要走回自己以前犯下的錯誤，當兵後的我，我想了許多，我不應該在踏入我之前的錯誤了，看著前年跟我一起入學的朋友，現在都畢業了，說實在的，大家都有一種想法，都要拿到學位，而我呢，在我求學過程，我選擇了逃避，大家夢寐以求的學位，我就這樣放棄了，我這樣對嗎？對其他人而言，大家都覺得我很笨，雖然我在大家眼中，大家都覺得我實做很厲害，只是不喜歡讀書，而我休學的原因，我在上一篇已經講了，不過我把那篇鎖上密碼了，我發覺我自己現在的狀況，又好像變回了兩年前的我，這並非我想要的，可是我並沒有像其他學生有那麼多的資源，可以專心唸書，專心上課，專心面對這一切，顯然這又是對我的另一種挑戰，希望我自己能夠克服它。&lt;/p&gt;</description></item><item><title>當兵完了，好好準備研究所2年</title><link>https://blog.wu-boy.com/2007/09/%E7%95%B6%E5%85%B5%E5%AE%8C%E4%BA%86%EF%BC%8C%E5%A5%BD%E5%A5%BD%E6%BA%96%E5%82%99%E7%A0%94%E7%A9%B6%E6%89%802%E5%B9%B4/</link><pubDate>Wed, 12 Sep 2007 02:09:07 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/09/%E7%95%B6%E5%85%B5%E5%AE%8C%E4%BA%86%EF%BC%8C%E5%A5%BD%E5%A5%BD%E6%BA%96%E5%82%99%E7%A0%94%E7%A9%B6%E6%89%802%E5%B9%B4/</guid><description>&lt;p&gt;話說兩年前的今天，我已經是中正電機所碩一新生了，然而現在，也是中正電機所碩一新生，中間的兩年，我跑去哪裡呢，答案是我跑去當兵了，我在南投國史館當程式設計的小小替代役，至於我在文獻管當替代役，發生很多事情，大家可以翻翻我前面的blog，我寫蠻多的，說起來，我這個替代役當的很值得，說真的，我也沒有對不起國家給我這個替代役這個職位，然而大家一定想問說，我怎麼可以那麼屌，休學去當兵，現在研究所這麼難考的情況下，大家都不願意去當兵，有書念，就趕快待在學校，然而我並沒有這麼做，我休學跑去當兵，那時候我造成學校實驗室轟動，導致於還蠻多學弟妹認識我的，現在我在實驗室也是當學長，因為我要念碩三了，哈哈。 當兵結束，想法也改變了一些，之前在中正唸書，其實算是半工半讀，一方面開學，我每個月的生活費，加上我要存錢，準備下學期，所以在學校課業方面，花了比較少的時間去準備，所以導致我期中考的時候，考差了，所以期中考結束，我就打算休學了，畢竟整學期我已經功虧一簣了，這都是因為我在學校太愛玩，不愛讀書所造成，也不能怪任何人，是我自己不努力，然後現在，我在當兵期間，有省吃儉用，存了一些錢來繳學費了，所以比較不擔心了，可以專心來唸書，不要在重蹈覆轍，一直走失敗的路，這不是我的style，希望我能撐過這2年拿到碩士學位，也可以代表中正大學出去外面找工作，希望以後給學弟妹一個好名聲，而不是給學弟妹一個不好的映像，一個不認真的學長。&lt;/p&gt;</description></item><item><title>[棒球]昨天去新生體檢～ A-ROD 52 轟</title><link>https://blog.wu-boy.com/2007/09/%E6%A3%92%E7%90%83%E6%98%A8%E5%A4%A9%E5%8E%BB%E6%96%B0%E7%94%9F%E9%AB%94%E6%AA%A2%EF%BD%9E-a-rod-52-%E8%BD%9F/</link><pubDate>Mon, 10 Sep 2007 02:10:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/09/%E6%A3%92%E7%90%83%E6%98%A8%E5%A4%A9%E5%8E%BB%E6%96%B0%E7%94%9F%E9%AB%94%E6%AA%A2%EF%BD%9E-a-rod-52-%E8%BD%9F/</guid><description>&lt;p&gt;話說，我現在是碩一新生，72年次的碩一新生，感覺好像有點大，不過其實也還好，全部升碩二的同學都叫我學長，我還真不好意思，不過我還是去了新生體檢，其實我前年也有新生體檢過了，不過一次才550元，還蠻便宜的，所以就去體檢了，等明年升碩二，我想我也會繼續去體檢，應該可以吧。 不過話說，我量身高體重，我身高量出來 165.1公分，體重 64，噗噗，身高好像蠻低的，哈哈，現在的女生都要求男生基本170吧，哈哈我離170還很遙遠，看來我只好乖乖當宅男吧。 慶祝王建民18勝，太強了，A-ROD也很猛，上帝GOD 9月已經打了8之全壘打，以下是A-ROD創的紀錄 A-Rod重要成就記錄： 1. 史上最年輕300轟，350轟，400轟，450轟，500轟的打者 2. 史上唯一連續10年，單季至少 35轟、100打點、100得分 3. 史上游擊手單季最多全壘打：02年，57轟 4. 史上三壘手單季最多全壘打：07年，xx轟 (還在更新中) 5. 98年單季完成40轟40盜壘，97年首次完全打擊 6. 2屆 美聯MVP (03，05) 7. 3屆 漢克阿倫獎 (01～03) 8. 11次入選全明星賽 (96～98，00～07) 9. 8次銀棒獎 (96，98～03，05) 10. 2次金手套獎 (02～03) 11. 2次球員票選年度最佳球員 (96，02) 12. AL titles： 4次全壘打王，2次打點王，1次打擊王，1次安打王 — Alex Rodriguez 1975/07/27 32歲 NYY 13號 3B/SS 2007/09/10 更新 生涯 ＨＲ累積516 ，現役第4 ，史上第17 Next 15. Ted Williams 521 (2人) 打點累積1487，現役第7 ，史上第48 47. Dave Parker 1493 得分累積1490，現役第6 ，史上第66 65. Harry Stovey 1492 安打累積2232，現役第15，史上第151 150. Mike Schmidt 2234&lt;/p&gt;</description></item><item><title>[轉錄]徵女友[或者是結婚對象]條件？？？？？</title><link>https://blog.wu-boy.com/2007/09/%E8%BD%89%E9%8C%84%E5%BE%B5%E5%A5%B3%E5%8F%8B%E6%88%96%E8%80%85%E6%98%AF%E7%B5%90%E5%A9%9A%E5%B0%8D%E8%B1%A1%E6%A2%9D%E4%BB%B6%EF%BC%9F%EF%BC%9F%EF%BC%9F%EF%BC%9F%EF%BC%9F/</link><pubDate>Tue, 04 Sep 2007 02:11:15 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/09/%E8%BD%89%E9%8C%84%E5%BE%B5%E5%A5%B3%E5%8F%8B%E6%88%96%E8%80%85%E6%98%AF%E7%B5%90%E5%A9%9A%E5%B0%8D%E8%B1%A1%E6%A2%9D%E4%BB%B6%EF%BC%9F%EF%BC%9F%EF%BC%9F%EF%BC%9F%EF%BC%9F/</guid><description>&lt;p&gt;剛剛在 ptt 的男人版，看到一串討論 [問題] 挑女朋友的理想，有一篇寫的還蠻中肯的如下，我想大部分男生都會喜歡的吧&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1.長相不接受紙片人也不接受肥仔不要超過60 喜歡健康型 外表不接受穿著暴露或者全身叮叮咚咚亮晶晶 淑女為好 2.身高期望是大概160-175 不喜歡嬌小女 因為身高要求是比較高 所以體重可以高一點 反正他不要紙片人 3.胸部只要不是A就好了 因為A就跟他一樣或比他小 B以上都可以 他也不會覺得越大越好 反正有胸就好 4.一定要能生孩子 因為將來是要結婚的 至於避孕他會很努力 但是不要不能生 他想要生兩個 5.有過性經驗沒關係 但是不能是一夜情 援交 賣肉維生 花心 曾經劈腿或多P 6.墮過胎沒關係 但是不能墮過很多次或不把墮胎當一回事 還有要確定還能生 7.要能溝通 會講理 會替對方著想 能分配家事 會喜歡孩子 有耐性 8.至少要願意做家事 不要是烹飪白痴 他希望結婚以後回到家可以吃到熱飯菜 9.會基本的理財與管帳 10.不是性冷感也不是變態 11.不膚淺有腦袋 言之有物 因為媽媽影響孩子深遠他不要腦殘女和台妹 12.沒有公主病 不是雙面人 13.不會喜歡5566 14.不抽煙不酗酒不濫交不愛跑夜店 15.能接受他的家庭狀況(窮) 上面的條件，我覺得還蠻不錯的，而且我不覺得哪一點很難的，哈哈，女生應該蠻多人達到這種條件的吧，我把他改成我自己的徵女條件，如下&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;1.長相不接受紙片人也不接受肥仔不要超過60 喜歡健康型 2.身高期望是大概155-165 大概體重不要比身高大，我都覺得還ok，也就是 身高-體重&amp;gt;100 3.胸部大概 b+以上就ok，哈哈，哈哈我本身就有 A+的實力了 4.一定要能生孩子 因為將來是要結婚的 至於避孕他會很努力 但是不要不能生 我想要生兩個 5.有過性經驗沒關係 但是不能是一夜情 援交 賣肉維生 花心 曾經劈腿或多P 6.墮過胎沒關係 但是不能墮過很多次或不把墮胎當一回事 還有要確定還能生 7.要能溝通 會講理 會替對方著想 能分配家事 會喜歡孩子 有耐性 8.至少要願意做家事 不要是烹飪白痴，希望結婚以後回到家可以吃到熱飯菜 9.會基本的理財與管帳 10.不是性冷感也不是變態 11.不膚淺有腦袋 言之有物 因為媽媽影響孩子深遠他不要腦殘女和台妹 12.沒有公主病 不是雙面人 13.不抽煙不酗酒不濫交不愛跑夜店 14.有體諒的心，跟孝順的心，別太龜毛 好像條件都還ok，我覺得大部分女生都可以達到吧，哈哈，以上是我的理想值，不過能不能有女生達到，還是其次啦，個性還蠻重要的，至於個性，當然只能在相處當中才知道的啦。&lt;/p&gt;</description></item><item><title>[生活日記]今天來到中正了～ 真開心</title><link>https://blog.wu-boy.com/2007/09/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E4%BB%8A%E5%A4%A9%E4%BE%86%E5%88%B0%E4%B8%AD%E6%AD%A3%E4%BA%86%EF%BD%9E-%E7%9C%9F%E9%96%8B%E5%BF%83/</link><pubDate>Sat, 01 Sep 2007 02:12:05 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/09/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E4%BB%8A%E5%A4%A9%E4%BE%86%E5%88%B0%E4%B8%AD%E6%AD%A3%E4%BA%86%EF%BD%9E-%E7%9C%9F%E9%96%8B%E5%BF%83/</guid><description>&lt;p&gt;哈哈～今天跟我爸跟我媽還有跟我姑姑一起來中正大學，我又是開車的主角，不過我爸媽一直在念我～說我開車很快之類的，我爸還很怕我紅燈還加速，所以一直提醒我看到紅燈要滑行，不要在加速了，不過這些事情我都知道，我也很小心開，不過今天開高速公路有一段有照相測速，我好像120公里衝過去了，不知道有沒有被照相，哈哈下次小心一點好了，那一段是下坡，害我沒採啥油門就破120了，囧～下次要小心一點了～ 話說我一來到中正，我還蠻興奮的，好久沒有回到學校感覺真不賴，我已經脫離學校一年半了，已經差不多忘記那感覺了，不過回到學校感覺都回來了，而且中正大學也變得還蠻漂亮的，由其是正門前面還有人形步道，哈哈還不錯很多閃光都在那邊，哈哈，今天也把宿舍整理乾淨了，話說都是我爸我媽跟我姑姑在整理，我只能一邊納涼，擦擦桌子，囧 稿稿我的電腦跟伺服器，後來終於搞定，我跟我姑姑開車去民雄火車站拿我的腳踏車，沒看錯，是腳踏車，用汽車把他載回來，哈哈，我摩托車放高雄，這樣我回高雄比較方便，哈哈，再來呢，我爸媽就跟我姑姑回家了，然後我就去重量訓練室了，囧之前有在那邊認識朋友，他們說幾百年沒看過我了，然後我就解釋我跑去當兵，然後一個人就說，最好你看起來像當兵完，看起來跟高中生一樣，囧～～～～裡面還有一個高中生，聽到我碩一了又當完兵，當場傻眼，囧了一下，哈哈沒辦法我也不想阿，一直被誤會，噗噗。 下一階段來練個游泳好了，哈哈，好像還不錯～晨泳好像是免費的，拿學生證就可以進去了，不錯不錯&lt;/p&gt;</description></item><item><title>[生活]東華大三導生聚～</title><link>https://blog.wu-boy.com/2007/08/%E7%94%9F%E6%B4%BB%E6%9D%B1%E8%8F%AF%E5%A4%A7%E4%B8%89%E5%B0%8E%E7%94%9F%E8%81%9A%EF%BD%9E/</link><pubDate>Wed, 29 Aug 2007 02:12:56 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/08/%E7%94%9F%E6%B4%BB%E6%9D%B1%E8%8F%AF%E5%A4%A7%E4%B8%89%E5%B0%8E%E7%94%9F%E8%81%9A%EF%BD%9E/</guid><description>&lt;p&gt;最近都在看大學照片，都是同學照片，改天架一個網站專門放我們東華電機的照片好了，底下是我們大三的導生聚 &lt;a href="https://www.flickr.com/photos/appleboy/1263098103/" title="Photo Sharing"&gt;&lt;img src="https://i2.wp.com/farm2.static.flickr.com/1039/1263098103_a1f1436c4a.jpg?resize=500%2C375&amp;#038;ssl=1" alt="7739_阿旗做外交1" data-recalc-dims="1" /&gt;&lt;/a&gt; 大學好友，他也是高雄人，目前正在台機電當工程師，哈哈，大學的公關，導生聚的時候，旁邊有別的科系也在這裡辦導生聚，所以他就過去建交了～太強了吧，哈哈那時候他沒有女朋友。&lt;/p&gt;</description></item><item><title>[替代役] 當兵國史館台灣文獻館替代役的照片～</title><link>https://blog.wu-boy.com/2007/08/%E6%9B%BF%E4%BB%A3%E5%BD%B9-%E7%95%B6%E5%85%B5%E5%9C%8B%E5%8F%B2%E9%A4%A8%E5%8F%B0%E7%81%A3%E6%96%87%E7%8D%BB%E9%A4%A8%E6%9B%BF%E4%BB%A3%E5%BD%B9%E7%9A%84%E7%85%A7%E7%89%87%EF%BD%9E/</link><pubDate>Mon, 27 Aug 2007 16:19:45 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/08/%E6%9B%BF%E4%BB%A3%E5%BD%B9-%E7%95%B6%E5%85%B5%E5%9C%8B%E5%8F%B2%E9%A4%A8%E5%8F%B0%E7%81%A3%E6%96%87%E7%8D%BB%E9%A4%A8%E6%9B%BF%E4%BB%A3%E5%BD%B9%E7%9A%84%E7%85%A7%E7%89%87%EF%BD%9E/</guid><description>&lt;p&gt;剛剛無聊翻一下，當兵的照片，發現我的鏡頭大概只有不到20張，2片DVD光碟片的，我的照片不到50張吧，我很低調的，哈哈 先介紹第一張 &lt;a href="https://www.flickr.com/photos/appleboy/1257551689/" title="Photo Sharing"&gt;&lt;img src="https://i0.wp.com/farm2.static.flickr.com/1352/1257551689_b3c61d0799.jpg?resize=500%2C335&amp;#038;ssl=1" alt="上課中" data-recalc-dims="1" /&gt;&lt;/a&gt; 上課有人拍我，我只好鄧他一下，上課超級無聊阿，我快死掉了&lt;/p&gt;</description></item><item><title>[生活日記]今天跑去爬山～跟打籃球</title><link>https://blog.wu-boy.com/2007/08/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E4%BB%8A%E5%A4%A9%E8%B7%91%E5%8E%BB%E7%88%AC%E5%B1%B1%EF%BD%9E%E8%B7%9F%E6%89%93%E7%B1%83%E7%90%83/</link><pubDate>Thu, 23 Aug 2007 16:22:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/08/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98%E4%BB%8A%E5%A4%A9%E8%B7%91%E5%8E%BB%E7%88%AC%E5%B1%B1%EF%BD%9E%E8%B7%9F%E6%89%93%E7%B1%83%E7%90%83/</guid><description>&lt;p&gt;好久沒運動了，都是這個該死的颱風，害我最近都沒有運動，只能在家裏做一些不會流汗的運動，仰臥起坐，舉舉啞鈴，伏立挺身這個我想偶而就好，因為我自認為我胸肌練得還算不錯了，普通人想贏我還蠻難的～不過今天去爬山，大概是我爬最累的一次吧～因為我爬好漢坡，但是地上都是濕的，囧軟軟的泥巴，我走一步會往後滑半步，所以到山頂還有點喘，畢竟我中途沒休息，直接攻頂，難怪今天沒有人爬好漢坡，我在走的中間，還有大樹倒下來，我還要爬樹幹過去，果然不是人類可以爬的吧，哈哈，不過要辛苦砍樹的人了，應該明天就會有人去把他鋸掉了吧～今天真的只有我一個人在好漢坡，真囧～都沒遇到人，感覺還蠻奇怪的，不過我攻頂的時候也才看到3個人，少到誇張，然後我自己就走到看海的地方，那邊就還不錯了至少有10個人吧～哈哈還有很多猴子，真可愛～至少有30隻猴子在我前面晃來晃去，一個人在那邊看海景的感覺真棒，大海真是漂亮～在那邊還遇到正妹，真是難得，我爬這麼久的山，第一次遇到這麼漂亮的，還真是幸運，今天果然去爬山是對的。 爬完山就算了，回家的途中，遇到高中同學，然後他又找我打球，所以我晚上9點又去打球了，哈哈真不賴，今天運動量十足，還不錯，這就是我想要的生活，如果我每天都可以這樣，就會很美好，希望2年後的我可以達到如此境界，我可不想去什麼鳥科技公司被操到夜晚10點以後，這並不是我想要的阿，而且說不定以後有了女朋友，也要多利用時間陪伴女友，哈哈我還真是異想天開，不過沒關西，規劃一下也不錯阿，讓自己朝這個目標邁進，每個人生都只會有一次而已，每個人生也只有一次，要即時把握現在，規劃未來阿～&lt;/p&gt;</description></item><item><title>[生活日記] 去台南看我叔叔</title><link>https://blog.wu-boy.com/2007/08/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E5%8E%BB%E5%8F%B0%E5%8D%97%E7%9C%8B%E6%88%91%E5%8F%94%E5%8F%94/</link><pubDate>Thu, 23 Aug 2007 16:21:02 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/08/%E7%94%9F%E6%B4%BB%E6%97%A5%E8%A8%98-%E5%8E%BB%E5%8F%B0%E5%8D%97%E7%9C%8B%E6%88%91%E5%8F%94%E5%8F%94/</guid><description>&lt;p&gt;昨天晚上一點才睡覺，囧太晚睡了，因為昨天去爬山加上晚上去中正打球打到晚上11點半，回到家也幾乎到12點了，洗個澡，弄個電腦，吃個杏仁果酥&amp;lt;-很好吃，上網看個文章，弄一弄就到一點了，所以比較晚睡，然後早上8點40分就被叫起來了，因為我人生第一次開車，我非常開心，開心到昨天晚上都睡不著，哈哈，我媽媽超緊張的，他還說叫我多看學開車有發一本考試的題目，裡面都一堆交通號誌要背，我媽媽一直叫我看，因為我筆試是A到的，&lt;a href="http://life.wu-boy.com/2007/08/03/38/"&gt;考上駕照了～ 太棒了～ 路考靠實力 筆試靠運氣～&lt;/a&gt;，哈哈所以我媽媽很不放心我開車，不過看那個沒用吧，因為重點是我要去道路駕駛吧，哈哈我爸也蠻緊張，畢竟我第一次開車阿，上車子以後熟悉一下我爸的車以後，大概ok了，就上路了，今天要去台南，不過開車途中我還蠻穩的，我爸這樣稱讚我，至少跟我哥哥比起來，我爸說我穩太多了，哈哈我哥哥天生屬於緊張型的，也不能怪他，不過別看我哥這樣，我哥給別人感覺就是穩重，不像我，整天嘻嘻哈哈，每天都很快樂，每天都在笑，我想就因為如此，所以大家也比較不放心我吧，上上禮拜吧，我開我老闆的車去吃飯，老闆做我旁邊，原本大家都超緊張，我同事，我老闆老婆都在後面，他們超緊張，後來老闆還稱讚我開車不錯，至少第一次開，可以給別人穩的感覺，我超級開心，哈，我很希望自己面對每一件事情都可以很開心應付，所以造成給別人很多不安的感覺，每天看我這樣掉而啷當的，可能對我的映像就是不穩重。 不過今天重點不是我開車，我開車很穩已經改變我爸的想法了，他也很放心讓我去開車了，今天的大重點是去探望開刀後的叔叔，說實在的我叔叔生病是咎由自取的，他因為什麼生病呢？就是大家恐懼的癌症，傳說中的口腔癌，今天跟叔叔談話之後收穫還蠻多的，我叔叔完全變一個人似的，變得非常聽話，以前不敢吃的水果，現在也吃了～因為我叔叔會抽煙跟吃檳榔所以造成他這個月月初，發現口腔裡面有腫白白的顆粒，以為那是水泡，所以沒理它，後來發現情形不太對，去大林慈濟醫院照x光，囧了，是初期癌症，有良性腫瘤跟惡性腫瘤了，後來還好沒有入侵到淋巴腺，不然就要化療了，那是很痛苦的一件事情阿，看到叔叔現在這樣，從69公斤變到51公斤，瘦到太誇張了，不過因為生病，這也是沒辦法的，這次手術相當成功，所以腫瘤都去除了，已經沒有癌症了，以前都打死也不聽我爸的話，硬要吃檳榔跟抽煙，現在口腔吃出問題了，我叔叔也感觸很多，全部戒掉了，也開始吃水果了，我聽嬸嬸說他重來不吃水果的，現在都會開始吃了，我叔叔家裏經濟已經不好了，還有2個小孩，我的表弟，很可愛的，叔叔的工作也是不好賺，看嬸嬸也很難過，不過還是耐心的照顧老公，我想這時候叔叔最需要的就是嬸嬸的照顧，叔叔現在一定心想，如果會這樣我早就不吃檳榔跟抽煙了吧，人總是在最後才會後悔，不過現在改還來的及，畢竟好像也都切除了惡性腫瘤，也順便把良性的清掉了，目前看起來狀況不錯，希望嬸嬸能把他的體重養回來，我希望看到健康的叔叔，以及有重大改變叔叔。 這次的重病很辛苦嬸嬸了，我看嬸嬸在醫院都快崩潰了吧～自己的老公變成這樣，還有2個小孩，還有房租，叔叔工作也沒說賺很多，這讓我自己有所警惕，我以後一定不會讓我的老婆有後顧之憂，我想這是必要的，既然取了老婆，我想大家要互相照顧，但是要給女生安定感，就是給老婆一個美滿的家庭，這也是我想要的世界，哈哈我希望我下班可以吃到老婆親自弄的飯菜，然後下班可以跟小孩子玩成一片，教他寫功課之類的，哈哈這些都是我的理想，但是實際上是不是這樣也不知道，看未來的路怎麼走了，都還沒交女朋友哪來的老婆，是吧，而且就算交了，人家也不一定願意想當你老婆，是吧，想太多了喔小惡魔，哈哈。&lt;/p&gt;</description></item><item><title>[心情] 我是值得被喜歡的男生嗎？</title><link>https://blog.wu-boy.com/2007/08/%E5%BF%83%E6%83%85-%E6%88%91%E6%98%AF%E5%80%BC%E5%BE%97%E8%A2%AB%E5%96%9C%E6%AD%A1%E7%9A%84%E7%94%B7%E7%94%9F%E5%97%8E%EF%BC%9F/</link><pubDate>Tue, 21 Aug 2007 16:43:46 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/08/%E5%BF%83%E6%83%85-%E6%88%91%E6%98%AF%E5%80%BC%E5%BE%97%E8%A2%AB%E5%96%9C%E6%AD%A1%E7%9A%84%E7%94%B7%E7%94%9F%E5%97%8E%EF%BC%9F/</guid><description>&lt;p&gt;因為標題不知道怎麼下，所以就隨便取個標題了，回歸正題，事情是這樣，上禮拜跟你有約好，這裡拜一你會來高雄，可是到了禮拜一，我卻爽約了，原因是下雨，雖然說都是短暫的，不過整天幾乎都在下雨，加上你跟你3個弟弟出門，所以我就想說你跟你弟弟去玩就好，我在家睡覺兼寫程式，就想說你跟你弟弟玩得開心就好，再看你的blog日記，也發現你那天過的很快樂，不過你那天雖然可以過的很快樂，可是回來你好像就很生氣，氣我放你鴿子，不守信用～還讓你悶了一天，真不好意思，我不知道事情會變成這樣，我自己都會把事情單純化，我想說你有跟你弟弟在一起玩就好，我去了也不好，所以我就想說不去找你了，不過沒想到女生並不會這麼想，反而逆向思考，我變成一個不守信用的人，這個我自己也很無奈。 話說禮拜一發生的事情，你也跟你好朋友說了，你朋友也一致認為是我的不對，不過沒關西，這的確是我不對，你也說過難怪我會沒有女朋友，的確，或許我不該擁有任何女朋友，我這種人，神經大條，不懂女生心情，有什麼資格去擁有女朋友呢，也許我一個人過慣了，小時候到現在，我都是一個人，除了朋友之外，我本身也沒有其他事情，曾經有喜歡我的女生跟我說過，我沒有女朋友不是沒有原因的，我不穩重，愛玩，不會顧慮女生感受，這些女生都有跟我說過，然而我生活重心不再這裡，我只想超越自己，我希望我自己可以帶給周遭朋友開心，就像我在學校或者是公司，都是可以出氣或者是開玩笑的對象，因為我希望別人跟我一樣快樂，如果因為開我玩笑，可以讓大家很開心，那我覺得這也值得了。 結論：我不是個好男生，要找到比我好100倍的男生，你也覺得很容易，我也是這麼認為，至少跟我一樣沒教過女朋友的好朋友，我認識一堆，大部分也都贏我，不管是身高或者是成績都比我好，話說要找到成績比我差的，好像也蠻難的，所以在這裡我祝福你可以找到一個你覺得可信任的男生，也希望你以後可以天天快樂，因為無知天真的我，把事情簡單化，造成你的不快樂，我在這裡跟你說對不起，也許這也就是我教不到女朋友的原因吧&lt;/p&gt;</description></item><item><title>[Apache] mod_bw 頻寬下載限制</title><link>https://blog.wu-boy.com/2007/08/apache-mod_bw-%E9%A0%BB%E5%AF%AC%E4%B8%8B%E8%BC%89%E9%99%90%E5%88%B6/</link><pubDate>Mon, 20 Aug 2007 08:06:34 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/08/apache-mod_bw-%E9%A0%BB%E5%AF%AC%E4%B8%8B%E8%BC%89%E9%99%90%E5%88%B6/</guid><description>&lt;p&gt;自己在站內有寫一篇 &lt;a href="http://blog.wu-boy.com/2007/01/22/64/"&gt;[apache] mod_cband 頻寬限制&lt;/a&gt;，不過這套好像沒有真對網站用 header「&lt;a href="http://blog.wu-boy.com/2007/05/25/106/"&gt;[PHP] header下載檔案 搭配資料庫&lt;/a&gt;」 吐出來的下載方式做限制，只能針對單存下載的連結做限制，所以自己爬文了一下，又找到了 Bandwidth Module 這個套件，&lt;a href="http://www.ivn.cl/apache/"&gt;Banwidth官方網&lt;/a&gt;，目前出到 mod_bw v0.8 &lt;a href="http://www.ivn.cl/apache/files/txt/mod_bw-0.8.txt"&gt;說明檔&lt;/a&gt;。 底下是針對 FreeBSD 安裝方式，所以其他安裝方法就參考上面的說明檔了&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;cd /usr/ports/www/mod_bw/
make install clean
&lt;/pre&gt; 上面這樣就安裝好了，再來就是設定 mod_bw 了 
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;BandWidthModule [On|Off] apaceh 預設是關閉的，所以請把他打開 BandWidthModule on&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ForceBandWidthModule [On|Off] 這個設定預設情形，他不會對每個要求限制，如果你把他打開，他就會對每個要求做限制 普通要求：AddOutputFilterByType MOD_BW text/html text/plain 打開設定：ForceBandWidthModule On&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BandWidth [From] [bytes/s] 這個設定有2個參數，第一是from，第二是速度，第一你可以用整個ip位址，或者是network mask例如：192.168.0.0/24 or 192.168.0.0/255.255.255.0) or all。最後的all就是全部皆可，不限制 BandWidth localhost 10240 BandWidth 192.168.218.5 0 上面針對 localhost 給 10KB的速度，然後針對 192.168.218.5 不限制速度 在版本0.8還可以針對client端的瀏覽器做限制&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BandWidth u:[User-Agent] [bytes/s] 你可以利用正規語法比對client端瀏覽器 BandWidth &amp;ldquo;u:^Mozilla/5(.*)&amp;rdquo; 10240 BandWidth &amp;ldquo;u:wget&amp;rdquo; 102400 還蠻不錯的功能&lt;/p&gt;</description></item><item><title>[SQL] 隨機選取資料 (MSSQL,ACCESS,MYSQL)</title><link>https://blog.wu-boy.com/2007/08/sql-%E9%9A%A8%E6%A9%9F%E9%81%B8%E5%8F%96%E8%B3%87%E6%96%99-mssqlaccessmysql/</link><pubDate>Thu, 16 Aug 2007 03:15:31 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/08/sql-%E9%9A%A8%E6%A9%9F%E9%81%B8%E5%8F%96%E8%B3%87%E6%96%99-mssqlaccessmysql/</guid><description>&lt;p&gt;這個功能還蠻需要的，底下就是三個例子 以下方法，可以幫助隨機取得廣告資料、最新消息等，隨機產生資料。 使用 SQL 語法的 TOP n 來指定取得筆數，再用 ORDER BY 的方式，來亂數取得資料，並排序。&lt;/p&gt;
&lt;pre class="brush: sql; title: ; notranslate" title=""&gt;MS SQL：SELECT TOP 1 * FROM Table WHERE 條件 ORDER BY NEWID()

ACCESS：SELECT TOP 1 * FROM Table WHERE 條件 ORDER BY RND(數字欄位名稱)

MYSQL：SELECT * FROM Table ORDER BY RAND() LIMIT 1
&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://blog.xuite.net/jameschih/java/8308864"&gt;http://blog.xuite.net/jameschih/java/8308864&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[工作日記] 美好的一天～ 工作要告一段落了</title><link>https://blog.wu-boy.com/2007/08/%E5%B7%A5%E4%BD%9C%E6%97%A5%E8%A8%98-%E7%BE%8E%E5%A5%BD%E7%9A%84%E4%B8%80%E5%A4%A9%EF%BD%9E-%E5%B7%A5%E4%BD%9C%E8%A6%81%E5%91%8A%E4%B8%80%E6%AE%B5%E8%90%BD%E4%BA%86/</link><pubDate>Mon, 13 Aug 2007 16:44:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/08/%E5%B7%A5%E4%BD%9C%E6%97%A5%E8%A8%98-%E7%BE%8E%E5%A5%BD%E7%9A%84%E4%B8%80%E5%A4%A9%EF%BD%9E-%E5%B7%A5%E4%BD%9C%E8%A6%81%E5%91%8A%E4%B8%80%E6%AE%B5%E8%90%BD%E4%BA%86/</guid><description>&lt;p&gt;今天晚上雨真是下好大阿～ 不過早上竟然是出大太陽，不過好像也只有一小時有太陽，接下來都是下雨，然後晚上下班6點半竟然給我狂風暴雨，害我騎摩托車速度只有10KM/小時，旁邊有腳踏車都可以贏我，噗噗，因為我安全帽沒有蓋到眼睛，所以我眼睛一直浸水，然後我又帶眼鏡，所以前面都看不到，所以我一隻手都在前面遮眼睛。 上禮拜天，跟老闆提出辭呈了，禮拜一老闆才收到信，工作也差不多結束了，跟老闆討論的結果，是做到這個禮拜5結束，這跟我的期待是相同的，雖然很捨不得公司的同伴，跟我一起這麼久了，在公司裡最會開玩笑的就是我，也常常被同事虧，其實那都無訪，重點是大家開心就好，不然大家上班都不講話，挺無聊的，在公司我比較過動，所以都是我主動在講話比較多，哈哈～不好意思啦。 接下來21號～31號，要開始準備一下，9月一號要開車到中正，我姑姑也會在新營過去然後在中正集合，這跟我前年到中正的計畫一樣，只不過前年是在6月底過去的，今年就沒有了，先工作賺個學費吧，最近收到繳費單了，好像2萬2千多的學費，這是沒有加上學分費喔，如果加上學分費大概3萬5左右，其實算還好，跟私立大學比起來，算好多了，不過還是很貴，我是窮苦的學生阿～&lt;/p&gt;</description></item><item><title>[生活] 8月剪短頭髮</title><link>https://blog.wu-boy.com/2007/08/%E7%94%9F%E6%B4%BB-8%E6%9C%88%E5%89%AA%E7%9F%AD%E9%A0%AD%E9%AB%AE/</link><pubDate>Sun, 12 Aug 2007 13:21:24 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/08/%E7%94%9F%E6%B4%BB-8%E6%9C%88%E5%89%AA%E7%9F%AD%E9%A0%AD%E9%AB%AE/</guid><description>&lt;p&gt;又到了我剪頭髮的日子，今天理髮店還換地點，換到漢神百貨那邊，害我找不到，找了半小時才找到，真是久，後來發現他們的招牌是黑的，我看不到，然後他的隔壁是一間 “米糕世家”，這間米糕我還蠻喜歡吃的，還有雞肉飯，好吃喔，理髮師不會跟我說在他們隔壁就好，囧，害我找好久啦～。 進去理髮廳，算很高級的，因為剪一次500元，不過我覺得剪得很好看，所以都給他剪了，目前剪了3次還ok，說實在剪頭髮，短髮最難剪，所以還蠻佩服理髮師的，剪短頭髮可以看出理髮師功力如何。 不過好玩的在這下面對話，其實理髮師是僑生，我聽的出來，之前上大學認識蠻多僑生的，僑生人都不錯，個性也很開朗，以下是我跟他的開朗對話： 理髮師：不好意思讓你迷路了，招牌是黑的，難怪你找不到。 我：沒關西啦，旁邊那家米糕很好吃喔 &amp;lt;- 只會想吃的，看來我餓了 理髮師：暑假快沒了喔，假日沒有出去玩阿。 我：我只有週休二日，而且都在下雨，沒辦法出去。 理髮師：幾號開學阿～9月中吧 我：哪有，我九月一日就要去中正大學了，假期快沒了 理髮師：喔～大學都很晚開學吧，你大幾了阿～ 我：噗噗 理髮師，我是去讀研究所喔。 理髮師：囧 驚！＠＃＄％～騙人，你不是剛升大一嗎？囧 大一臉 我：哪有啦，我要去讀碩一碩一碩一碩一，研究所，不是大學部啦 理髮師：囧 看不出來你是研究生。 我：那沒什麼，我還當兵完了 理髮師：囧 驚！＠＃＄％～虎爛我的吧，你明明就是大一 長得那麼娃娃臉喔 我真的以為你是大一新生，要不是你騎機車，我想我會把你當作高中的 我：囧興，我想我應該很高興，哈哈～ 不過我習慣了啦，你不是第一個人這樣說我 結論：這是什麼對話阿～哈哈 我這張臉在搭配我的聲音，我想還蠻搭的吧～哈哈&lt;/p&gt;</description></item><item><title>[工作日誌] 公司今天發2張電影票～開心</title><link>https://blog.wu-boy.com/2007/08/%E5%B7%A5%E4%BD%9C%E6%97%A5%E8%AA%8C-%E5%85%AC%E5%8F%B8%E4%BB%8A%E5%A4%A9%E7%99%BC2%E5%BC%B5%E9%9B%BB%E5%BD%B1%E7%A5%A8%EF%BD%9E%E9%96%8B%E5%BF%83/</link><pubDate>Wed, 08 Aug 2007 13:22:30 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/08/%E5%B7%A5%E4%BD%9C%E6%97%A5%E8%AA%8C-%E5%85%AC%E5%8F%B8%E4%BB%8A%E5%A4%A9%E7%99%BC2%E5%BC%B5%E9%9B%BB%E5%BD%B1%E7%A5%A8%EF%BD%9E%E9%96%8B%E5%BF%83/</guid><description>&lt;p&gt;又到了公司雙數月了，所以今天公司又發了2張電影票喔，重點是電影票是去高雄的夢時代電影院喔，想到就很爽，雖然我從小時候到現在，好像去電影院不到10次吧，大概是5-8次中間，哈哈，很少吧，難以置信吧，不過其實也沒差，重點是我很快樂，哈哈～，每天這樣也是不錯，笑笑的過每一天，話說我考汽車駕照有請假一個下午跟一個早上，當我回公司的時候，工讀生就跟我說，少了我真是無聊，沒有人可以開玩笑，大家都想要我開玩笑，看到公司每天可以這麼開心，這樣工作起來也比較有活力。 話說我六月份的電影票給我哥哥了，他請他的女朋友去看電影，大我三歲的哥哥今年年初才交第一位女朋友，想必很幸福吧，看每天晚上都可以講1-2小時的電話，真是開心阿～哈哈我也祝福我哥哥，希望他可以永遠幸福，話說他本身讀文組科系，現在才教第一任女朋友，會太晚嗎？其實也還好，哈哈，我自己本身都沒教過女朋友，我好像也沒資格說我哥哥，不過還是很希望我哥哥能幸福，也希望將來他工作可以順利，不要學我走不歸路，哈哈。&lt;/p&gt;</description></item><item><title>[Html] javascript 好用的時間日曆表</title><link>https://blog.wu-boy.com/2007/08/html-javascript-%E5%A5%BD%E7%94%A8%E7%9A%84%E6%99%82%E9%96%93%E6%97%A5%E6%9B%86%E8%A1%A8/</link><pubDate>Wed, 08 Aug 2007 07:22:45 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/08/html-javascript-%E5%A5%BD%E7%94%A8%E7%9A%84%E6%99%82%E9%96%93%E6%97%A5%E6%9B%86%E8%A1%A8/</guid><description>&lt;p&gt;其實我這是從 opensource 拿出來的，我是去看 &lt;a href="http://www.xt-commerce.cn/index.php"&gt;xt:Commerce&lt;/a&gt; 裡面的後台，我看到把他拿下來的，其實還蠻好用的喔，我把他下載下來，給大家下載 &lt;a href="http://blog.wu-boy.com/wp-content/uploads/2007/08/spiffycal.zip" title="日曆"&gt;日曆&lt;/a&gt; 下載下來之後，把他解壓縮，然後看你要放到哪裡，然後寫一個普通html，程式碼如下&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate" title=""&gt;

 
 


&lt;div id="spiffycalendar" class="text"&gt;
 
&lt;/div&gt;





&lt;/pre&gt; 上面的可以看，下面這個連結 
&lt;p&gt;&lt;a href="http://blog.wu-boy.com/wp-content/uploads/2007/08/calendar.txt" title="calendar.txt"&gt;calendar.txt&lt;/a&gt; 如果要看結果，可以去官網看 &lt;a href="http://www.geocities.com/bazillyo/spiffy/calendar/index.htm"&gt;http://www.geocities.com/bazillyo/spiffy/calendar/index.htm&lt;/a&gt; 或者是我寫好的，可以看看 &lt;a href="http://blog.wu-boy.com/wp-content/Calendar.php"&gt;線上測試&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[生活] 考上駕照了～ 太棒了～ 路考靠實力 筆試靠運氣～</title><link>https://blog.wu-boy.com/2007/08/%E7%94%9F%E6%B4%BB-%E8%80%83%E4%B8%8A%E9%A7%95%E7%85%A7%E4%BA%86%EF%BD%9E-%E5%A4%AA%E6%A3%92%E4%BA%86%EF%BD%9E-%E8%B7%AF%E8%80%83%E9%9D%A0%E5%AF%A6%E5%8A%9B-%E7%AD%86%E8%A9%A6%E9%9D%A0%E9%81%8B/</link><pubDate>Fri, 03 Aug 2007 13:23:25 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/08/%E7%94%9F%E6%B4%BB-%E8%80%83%E4%B8%8A%E9%A7%95%E7%85%A7%E4%BA%86%EF%BD%9E-%E5%A4%AA%E6%A3%92%E4%BA%86%EF%BD%9E-%E8%B7%AF%E8%80%83%E9%9D%A0%E5%AF%A6%E5%8A%9B-%E7%AD%86%E8%A9%A6%E9%9D%A0%E9%81%8B/</guid><description>&lt;p&gt;今天是考路考，昨天是考筆試，在我的看來，筆試是最難的，哈哈，很多人應該都跟我相反吧～大家一定都認為筆試簡單，路考難吧，我都跟別人相反，昨天去楠梓考筆試，是用電腦考試的，總共40題，裡面大概有15題我用猜的，我還在想，我如果過了會是個奇蹟，結果筆試出來我95分，我自己的嚇到～，因為我抽到的考題太鳥了～竟然有問題是他寫一個出車禍的狀況，或者是你違規什麼，他問你罰款多少，囧然後3個選項讓你選～，結果我都是選罰款最多的，不然就是選坐牢最久的，結果好像都是對的，哈哈40題只錯2題，真的嚇到我了，我還算蠻lucky，後來在考場遇到我高中跟我同班一學期的女生，他更強，都沒有念，結果考92.5分，囧～比我屌到暴。結論：筆試靠運氣 至於今天的路考，其實都還算ok，我是今天第一個考的，我後面那個同學是跟我同教練，今天超好笑的，大家考試一定都會開自己之前練習的汽車，全部考場只有我一個人是開別人教練的車子，上去之後，我後座是下一個要考的學生，是同一個教練，他好像不想開他不熟悉的車子，我自己開的時候，感覺還不錯，比我練習的車子還好，所以就沒差了，瞬間就過了～哈哈，還被監考官嗆，說我只要壓線就給我扣32分，我就回答：監考官，我只要壓線，中午你的午餐我包了～哈哈，講話想比我嗆～，考過之後，下車比較風光，因為第一個考，所以考完，大概有100多個學生看你，哈哈真爽。&lt;/p&gt;</description></item><item><title>[生活] 桃園之旅～ 找了阿皮同學</title><link>https://blog.wu-boy.com/2007/07/%E7%94%9F%E6%B4%BB-%E6%A1%83%E5%9C%92%E4%B9%8B%E6%97%85%EF%BD%9E-%E6%89%BE%E4%BA%86%E9%98%BF%E7%9A%AE%E5%90%8C%E5%AD%B8/</link><pubDate>Sun, 29 Jul 2007 13:24:11 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/07/%E7%94%9F%E6%B4%BB-%E6%A1%83%E5%9C%92%E4%B9%8B%E6%97%85%EF%BD%9E-%E6%89%BE%E4%BA%86%E9%98%BF%E7%9A%AE%E5%90%8C%E5%AD%B8/</guid><description>&lt;p&gt;今天上去桃園，處理一些正事，跟找了高中同學阿皮，話說我今天來回坐高鐵，還蠻累的，我在想怎麼會有人想坐統聯台北來回，我會瘋掉吧，不過通常都是因為自己沒什麼生活費，才會想坐便宜的車，不過好在我夠宅，沒有女朋友可以讓我花錢，所以平常有存了一些錢，所以今天才可以坐高鐵阿，哈哈，不像我同學阿皮，手頭很緊，我快被他笑死了，還有他的男子氣概真的嚇到我了。 話說今天高鐵嚇到我了，桃園站真的偏僻的可以了，他竟然沒有臺鐵，害我還搭了1小時的客運，才到桃園市區，囧，今天是我第一次到桃園，桃園阿，比我想像的還偏僻，百貨公司超級小，然後建築物大多很老舊，也不知道怎麼形容，就是看到店面，你就不會有想進去的衝動，不過下午還是找了好朋友阿皮出來，聊了一下高中班上情形，感覺大家好像都不太樂觀，不太好找工作，哈哈，的確，工作不好找阿，至少我覺得我在高雄，工作的確不好找，將來我自己也會往北部發展，當然希望自己有一天能有自己的工作室。&lt;/p&gt;</description></item><item><title>[心情] 學開車快結束了～ 好開心</title><link>https://blog.wu-boy.com/2007/07/%E5%BF%83%E6%83%85-%E5%AD%B8%E9%96%8B%E8%BB%8A%E5%BF%AB%E7%B5%90%E6%9D%9F%E4%BA%86%EF%BD%9E-%E5%A5%BD%E9%96%8B%E5%BF%83/</link><pubDate>Wed, 25 Jul 2007 13:25:09 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/07/%E5%BF%83%E6%83%85-%E5%AD%B8%E9%96%8B%E8%BB%8A%E5%BF%AB%E7%B5%90%E6%9D%9F%E4%BA%86%EF%BD%9E-%E5%A5%BD%E9%96%8B%E5%BF%83/</guid><description>&lt;p&gt;前天跟教練聊了一下，我在上坡的時候都會壓到線，超級奇怪，後來昨天跟他討論結果，發現他說感應器怪怪的，他有跟服務台反應，呼呼，這樣我考試應該可以過，好歹我現在熟練到不行，S形 倒車入庫，路邊停車，我都超猛的，我還蠻喜歡開手排車，已經蠻習慣了，看來我拿到駕照之後，就可以開車去上班了。 昨天教練叫我去上課，不是開車唷，是上課，就是要上筆試的課程，後來打電話跟教練說，我不想上課，我想甩尾，教練說好，其實那個自己有書可以自己看，應該不用上課吧，我還是來甩尾比較實在。&lt;/p&gt;</description></item><item><title>[生活]正義高中聚會～ 跟 道明一些人的聚會</title><link>https://blog.wu-boy.com/2007/07/%E7%94%9F%E6%B4%BB%E6%AD%A3%E7%BE%A9%E9%AB%98%E4%B8%AD%E8%81%9A%E6%9C%83%EF%BD%9E-%E8%B7%9F-%E9%81%93%E6%98%8E%E4%B8%80%E4%BA%9B%E4%BA%BA%E7%9A%84%E8%81%9A%E6%9C%83/</link><pubDate>Sun, 22 Jul 2007 13:25:50 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/07/%E7%94%9F%E6%B4%BB%E6%AD%A3%E7%BE%A9%E9%AB%98%E4%B8%AD%E8%81%9A%E6%9C%83%EF%BD%9E-%E8%B7%9F-%E9%81%93%E6%98%8E%E4%B8%80%E4%BA%9B%E4%BA%BA%E7%9A%84%E8%81%9A%E6%9C%83/</guid><description>&lt;p&gt;今天真是充實的一天，中午跟正義高中聚會了一下，看到大家，都沒啥變，不過今天來了一個我不認識的女生，他是以前6搬的學生，難怪我沒什麼印象？因為我以前是正義高中7班的班長，嘿嘿，還有正妹方晴，她本身也沒什麼改變，最大改變就是變瘦吧～正妹果然為了瘦什麼都可以付出吧～，不過這樣也不錯，至少身體比較健康吧～不過也不是說胖不對，每個人定義不同～不過說實在的，我自己本身喜歡肉肉的女生，哈哈～ 下午回家，快熱死了，所以就回房間睡覺了，補眠一下～，上午學2小時的開車，哈哈超熱～晚上跟道明的同學去吃飯～大遠百上面那家還不錯吃，下次還可以去，不過話說我跟卓雷跟許信跟阿皮，本來要去看電影 終極警探4，不過沒有最後一排的位置，所以就沒看了，就去大遠百底下的麥當勞聊天，大概說一下最近的狀況，不過大家都在討論以後工作的事情，那一間公司福利好之類的，哈哈，不過我自己有規劃，等研究所畢業，大概會去待中研院或者是工研院的職務，然後看看能不能考上我理想的中華電信公司，這樣我下班之後說不定還可以自己接案子，我自己比較嚮往自由，不喜歡被綁住，所以我會朝這個目標邁進的。&lt;/p&gt;</description></item><item><title>lftp 在 utf-8 系統底下，連接big5站台</title><link>https://blog.wu-boy.com/2007/07/lftp-%E5%9C%A8-utf-8-%E7%B3%BB%E7%B5%B1%E5%BA%95%E4%B8%8B%EF%BC%8C%E9%80%A3%E6%8E%A5big5%E7%AB%99%E5%8F%B0/</link><pubDate>Mon, 16 Jul 2007 09:11:46 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/07/lftp-%E5%9C%A8-utf-8-%E7%B3%BB%E7%B5%B1%E5%BA%95%E4%B8%8B%EF%BC%8C%E9%80%A3%E6%8E%A5big5%E7%AB%99%E5%8F%B0/</guid><description>&lt;p&gt;在utf-8的ubuntu底下，如果使用lftp連接到big5或者是不支援unicode的站台，會出現亂碼，解決方法就是 在列出目錄之前，下底下指令 進入 lftp 後用&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;set ftp:charset Big5
&lt;/pre&gt;</description></item><item><title>[FreeBSD] Postfix 設定同一帳號，不同虛擬網域收信</title><link>https://blog.wu-boy.com/2007/07/freebsd-postfix-%E8%A8%AD%E5%AE%9A%E5%90%8C%E4%B8%80%E5%B8%B3%E8%99%9F%EF%BC%8C%E4%B8%8D%E5%90%8C%E7%B6%B2%E5%9F%9F%E6%94%B6%E4%BF%A1/</link><pubDate>Wed, 11 Jul 2007 04:09:05 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/07/freebsd-postfix-%E8%A8%AD%E5%AE%9A%E5%90%8C%E4%B8%80%E5%B8%B3%E8%99%9F%EF%BC%8C%E4%B8%8D%E5%90%8C%E7%B6%B2%E5%9F%9F%E6%94%B6%E4%BF%A1/</guid><description>&lt;p&gt;如果一台機器要管理多的網域的email，大家一定會遇到如果2個domain分別是 aaaa.com.tw，bbbb.com.tw，但是兩間公司都有 &lt;a href="mailto:suport@aaaa.com.tw"&gt;suport@aaaa.com.tw&lt;/a&gt;，suport@bbbb.com.tw，這樣子就會造成衝突，因為這兩間公司負責人不同，那要怎麼導向不同帳號呢，所以我們作法如下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;建立收發特定信的使用者帳號：真正收到信件的系統帳號&lt;/li&gt;
&lt;li&gt;建立虛擬郵件伺服器位址與帳號對照表：郵件位址跟收信帳號對照表&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[生活] 2007年7月初～跟國中一些人同學會～</title><link>https://blog.wu-boy.com/2007/07/%E7%94%9F%E6%B4%BB-2007%E5%B9%B47%E6%9C%88%E5%88%9D%EF%BD%9E%E8%B7%9F%E5%9C%8B%E4%B8%AD%E4%B8%80%E4%BA%9B%E4%BA%BA%E5%90%8C%E5%AD%B8%E6%9C%83%EF%BD%9E/</link><pubDate>Tue, 10 Jul 2007 13:26:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/07/%E7%94%9F%E6%B4%BB-2007%E5%B9%B47%E6%9C%88%E5%88%9D%EF%BD%9E%E8%B7%9F%E5%9C%8B%E4%B8%AD%E4%B8%80%E4%BA%9B%E4%BA%BA%E5%90%8C%E5%AD%B8%E6%9C%83%EF%BD%9E/</guid><description>&lt;p&gt;哈哈～，其實大家都沒什麼變吧~哈哈重點是我跟吳承瀚9年沒見面了，國中畢業到現在，目前正在大陸讀醫科～底下是圖片 &lt;a href="https://www.flickr.com/photos/appleboy/760654921/" title="Photo Sharing"&gt;&lt;img src="https://i0.wp.com/farm2.static.flickr.com/1303/760654921_fd08654aa4_o.jpg?resize=600%2C450&amp;#038;ssl=1" alt="2007.07.01 國中班聚～" data-recalc-dims="1" /&gt;&lt;/a&gt; 大家看了這張圖，應該知道我在哪吧～，答案就是最後面啦～，那接下來我就來一一介紹一下大家 左一：曾紫純，目前正在新竹的學校教英文吧～哈哈沒記錯的話 左二：許舒婷，阿短，目前在岡山上班吧～哈哈好像是在學樂器？我也忘了 左三：說實在我不知道是誰，不過是個正妹，好像是在高雄當老師吧？哈哈 左四：陳逸祥 清大化工超級資優生，然後旁邊正妹不斷，然後家裏開旅館～ 中間：我啦～小惡魔的我 右一：蔡國華，目前正在當兵，好像以後也是個數學老師 右二：蕭翰群，好像很會畫畫，不過是個丁丁，在屏東當替代役 右三：吳承瀚，大陸神經外科，屌人，一位很聰明的人 右四：陳兆森，作弊超強，現在高雄當電腦工程師，為了不當兵，所以便胖～『馬的，還真的遇到這種人，當個兵會死嗎』 哈哈～結論，大家都過的不錯，發展也不賴，大家好好加油吧～&lt;/p&gt;</description></item><item><title>[生活]學開車 第6跟第7次了</title><link>https://blog.wu-boy.com/2007/07/%E7%94%9F%E6%B4%BB%E5%AD%B8%E9%96%8B%E8%BB%8A-%E7%AC%AC6%E8%B7%9F%E7%AC%AC7%E6%AC%A1%E4%BA%86/</link><pubDate>Sun, 08 Jul 2007 13:28:42 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/07/%E7%94%9F%E6%B4%BB%E5%AD%B8%E9%96%8B%E8%BB%8A-%E7%AC%AC6%E8%B7%9F%E7%AC%AC7%E6%AC%A1%E4%BA%86/</guid><description>&lt;p&gt;好像已經練得差不多了，這個禮拜6上了2堂課，因為禮拜3教練要聚餐，所以我沒去上，然後禮拜5換我要聚會，所以剛好這裡拜少上2堂，所以這裡拜6教練就請我來學2堂課。 不過這2堂課程，我把倒車入庫跟路邊停車跟S型轉彎，練得太熟了，後來教練就教我最後一樣了，上坡起步，就是要在上坡上面停車，然後在起步。 大概步驟是這樣，到了上坡之後，就踩離合器然後踩煞車，然後把煞車桿兩段式拉起來，然後右腳去踩油門，然後慢慢放離合器，等引勤聲音正常之後，就可以拉下煞車桿，然後就可以動了。 就是這麼簡單，哈哈，下禮拜去上課，應該都可以自由練習了～哈哈&lt;/p&gt;</description></item><item><title>學開車 第4次了～ 哈 開心</title><link>https://blog.wu-boy.com/2007/07/%E5%AD%B8%E9%96%8B%E8%BB%8A-%E7%AC%AC4%E6%AC%A1%E4%BA%86%EF%BD%9E-%E5%93%88-%E9%96%8B%E5%BF%83/</link><pubDate>Thu, 05 Jul 2007 13:29:22 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/07/%E5%AD%B8%E9%96%8B%E8%BB%8A-%E7%AC%AC4%E6%AC%A1%E4%BA%86%EF%BD%9E-%E5%93%88-%E9%96%8B%E5%BF%83/</guid><description>&lt;p&gt;目前已經學了4次開車，結論：熟能生巧，學了第4次以後，回想了一下，第一節學了前進跟後退，第二節學了直線上坡轉彎，第三節學了路邊停車，第四節學了倒車入庫，剩下一種沒有學：那就是S型轉彎，哈哈才學4次，好像教練就快教完了，教練說我學的比較快，我進度比別人快5.6節客，哈哈，倒車入庫我學了20分鐘而已，倒車已經比教練還好了『這是教練自己說得喔』。 回想一下，路邊停車，先把車子橋正，雨路邊同寬，然後開始後退，座背對到扣分桿，然後開始方向盤往右轉到底，然後看後視鏡等車子跟線呈現3角形的時候方向盤左邊轉到底，這樣車子就進去了，出來也是，，轉邊已經轉到底了，等右邊的前試鏡出來了白線，就開始打右轉到底，就可以出來了。 倒車入庫：也是一樣車子橋正，座背對到扣分桿，然後右邊轉到底，等車子進去差不多的時候，方向盤回來一圈，等出子正了，再回來一圈，這樣就完成了，然後出來也是，前面的鏡子出來了白線，開始右轉到底，然後再慢慢橋正。 以上就是倒車入庫跟路邊停車，筆記一下，還蠻容易的，還有科車一檔換二檔，還蠻好玩的，老師要我作筆記，所以我寫在blog好了，可能還有些寫錯，明天要去問一下老師。&lt;/p&gt;</description></item><item><title>[生活]第一天學開車，超級開心</title><link>https://blog.wu-boy.com/2007/06/%E7%94%9F%E6%B4%BB%E7%AC%AC%E4%B8%80%E5%A4%A9%E5%AD%B8%E9%96%8B%E8%BB%8A%EF%BC%8C%E8%B6%85%E7%B4%9A%E9%96%8B%E5%BF%83/</link><pubDate>Fri, 29 Jun 2007 13:29:58 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/06/%E7%94%9F%E6%B4%BB%E7%AC%AC%E4%B8%80%E5%A4%A9%E5%AD%B8%E9%96%8B%E8%BB%8A%EF%BC%8C%E8%B6%85%E7%B4%9A%E9%96%8B%E5%BF%83/</guid><description>&lt;p&gt;今年要來學開車了，終於找到時間可以學習了，因為目前剛退伍狀態，在家裏閒閒沒事，所以趕緊去學開車，將來以後回娘家的時候，我就可以開車回去了，這樣我爸爸就不必那麼累了，我哥哥也可以跟我輪流開，哈哈。 目前我是在高雄我家附近的駕訓班，叫做 &lt;a href="http://www.sydriving.com.tw/index.htm"&gt;新永駕訓班&lt;/a&gt; 這家駕訓班還不錯，我是學手排，手排價錢是 8500 元，自排的話 9000元，然後如果有推薦人介紹可以在扣500，所以我學手排最後價錢是8000圓整，其實不會很貴啦，教練的話，他們會幫你安排，其實誰教都一樣，重點是最後考試要過阿，不過我遇到的教練他是兼職的，人不錯，還蠻會教的。 第一天學習，就是都在踩離合器，然後還沒正式上路，踩離合器，打擋，第一天就是在學這2樣而已，其實學車不難，熟能生巧就ok了。&lt;/p&gt;</description></item><item><title>[FreeBSD] 修改系統時間 UTC -&gt; CST</title><link>https://blog.wu-boy.com/2007/06/freebsd-%E4%BF%AE%E6%94%B9%E7%B3%BB%E7%B5%B1%E6%99%82%E9%96%93-utc-cst/</link><pubDate>Sat, 23 Jun 2007 02:52:08 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/06/freebsd-%E4%BF%AE%E6%94%B9%E7%B3%BB%E7%B5%B1%E6%99%82%E9%96%93-utc-cst/</guid><description>&lt;p&gt;剛安裝好系統是屬於格林時間，所以去設定一下如何弄回去台灣 GMT+8 的時間 有2種方式～一個用圖形介面：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#tzsetup
&lt;/pre&gt; 是一個不錯的 timezone 設定工具 , 進去之後選擇 5.Asia -&gt; 42.Taiwan 另一個方法是： 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#cp /usr/share/zoneinfo/Asia/Taipei /etc/localtime
#adjkerntz -a
#date
#Sat Jun 23 10:50:40 CST 200
&lt;/pre&gt; 1. 使用 date 指令 格式 date [yymmdd]HHMM 說明: yy 年數，如 02 代表 2002 年 mm 月份 01-12 dd 日數 01-31 HH 時數 01-59 MM 分鐘 01-59 yy mm dd 皆可省略 例: 調整日期為 2002-03-25 # date 022325 調整時間為 14:20 # date 1420 2. 使用對時主機 # ntpdate clock.stdtime.gov.tw 這項需能連上網路，其中 clock.stdtime.gov.tw 是一標準時間的主機 ps：(adjkerntz = adjust kernal timezone) 這樣就可以了，容易吧</description></item><item><title>[PHP] 善用 ignore_user_abort() 函式</title><link>https://blog.wu-boy.com/2007/06/php-%E5%96%84%E7%94%A8-ignore_user_abort-%E5%87%BD%E5%BC%8F/</link><pubDate>Fri, 22 Jun 2007 10:35:16 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/06/php-%E5%96%84%E7%94%A8-ignore_user_abort-%E5%87%BD%E5%BC%8F/</guid><description>&lt;p&gt;話說最近在為了上傳圖片經過縮圖的時間來煩惱，只不過我在想，為甚麼我上傳圖片還要等待縮圖時間才可以，然而無名小站，只需要上傳時間，縮圖是在它機器背景執行，後來發現一個函式非常好用，那就是&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;ignore_user_abort(true);
&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://tw2.php.net/manual/tw/function.ignore-user-abort.php"&gt;http://tw2.php.net/manual/tw/function.ignore-user-abort.php&lt;/a&gt; 無名在上傳圖片的php檔案，肯定有加上這個函式，他的好處是使用者如果關掉瀏覽器，但是php還是會繼續執行，也就是無名可以把檔案上傳之後，重新導向到使用者的相簿，程式可以如下&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;ignore_user_abort(true);
set_time_limit(0);
for($i = 1; $i &lt; 6; $i++){
if($_FILES['userfile' . $i]['size']){
/*
上傳圖檔寫在這裡
*/
}
}
//上傳好導向相簿
if($_POST['mode'] == 'add'){
header("Location:index.php");
}
/*
然後這裡在進行縮圖，他就會在背景中執行
*/
if($_POST['mode'] == 'add'){
for($i = 1; $i &lt; 6; $i++){
convert_sh($upload_floder,$file_name[$i],$small_size[$i]);
}
}
?&gt;
&lt;/pre&gt; 其實 ignore\_user\_abort(true); 根本就是變相的 unix 底下的 crontab ，還蠻好用的，好處很多，不過用的地方要注意就是了，並不是每個php檔案都需要用這個函式。</description></item><item><title>如何擋掉 google, 大陸百度 搜尋引擎</title><link>https://blog.wu-boy.com/2007/06/%E5%A6%82%E4%BD%95%E6%93%8B%E6%8E%89-google-%E5%A4%A7%E9%99%B8%E7%99%BE%E5%BA%A6-%E6%90%9C%E5%B0%8B%E5%BC%95%E6%93%8E/</link><pubDate>Wed, 20 Jun 2007 07:31:18 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/06/%E5%A6%82%E4%BD%95%E6%93%8B%E6%8E%89-google-%E5%A4%A7%E9%99%B8%E7%99%BE%E5%BA%A6-%E6%90%9C%E5%B0%8B%E5%BC%95%E6%93%8E/</guid><description>&lt;p&gt;發現google實在強了，他不只可以讓你網站曝光，如果你上傳一些重要的檔案放在網路上，只要沒有經過帳號密碼的機制，讓google知道你的絕對路徑，那個檔案就完蛋了，因為google還會暫存到他的機器，順便還幫你轉成 html ，夠屌了吧，所以我認為唯一最終解決辦法，就是自己寫一隻下載檔案的function，然後下載檔案都要透過該程式然後在header出來，這樣才不會被google弄到檔案，囧。 當然要如何擋掉搜尋引擎，方法如下，在自己網站底下新增 .htaccess #擋掉百度 SetEnvIfNoCase User-Agent &amp;ldquo;^Baidu&amp;rdquo; bad_bot SetEnvIfNoCase User-Agent &amp;ldquo;^sogou&amp;rdquo; bad_bot SetEnvIfNoCase User-Agent &amp;ldquo;^Bloghoo&amp;rdquo; bad_bot SetEnvIfNoCase User-Agent &amp;ldquo;^Scooter&amp;rdquo; bad_bot Deny from env=bad_bot #擋掉google SetEnvIf User-Agent &amp;ldquo;^Googlebot&amp;rdquo; google Deny from env=google 其實還有另外一種方法，那就是用 robots.txt &lt;a href="http://www.google.com.tw/support/webmasters/bin/answer.py?answer=40364"&gt;如何攔截 Googlebot？&lt;/a&gt;，這個方法也不錯 擋掉的結果如下：&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;66.249.70.107 - - [20/Jun/2007:15:30:11 +0800] "GET /store/market_list.php??bid=&amp;#038;year=2009&amp;#038;month=10 HTTP/1.1" &lt;font color='red'&gt;403&lt;/font&gt; 999 "-" "Mozilla/5.0 (compatible; &lt;font color='red'&gt;Googlebot&lt;/font&gt;/2.1; +http://www.google.com/bot.html)"
&lt;br /&gt;
61.135.162.53 - - [20/Jun/2007:14:41:00 +0800] "GET /web/news_show.php?bid=30&amp;#038;newsid=189&amp;#038;list= HTTP/1.1" &lt;font color='red'&gt;403&lt;/font&gt; 1003 "-" "&lt;font color='red'&gt;Baiduspider+&lt;/font&gt;(+http://www.baidu.com/search/spider.htm)"
&lt;/pre&gt; 看到 403 就對了，不過會看到比較多百度的 可以參考底下這篇討論，相當不錯 
&lt;p&gt;&lt;a href="http://www.robbin.cc/vb/showthread.php?t=277"&gt;[求助]Bot&lt;/a&gt; 如果要測試的話，可以利用 fx 的 user.agent 功能，這招超級好用的喔，方法如下 1.在FX網址列輸入about:config 2.然後新增general.useragent.override 選 string『字串』 3.然後看要輸入什麼值，例如 Googlebot/2.1 (+http://www.googlebot.com/bot.html) 都可以 然後就可以測試了 參考這篇：&lt;a href="http://blog.ijliao.info/archives/2006/05/30/2318/"&gt;用 htaccess 擋 spam&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[生活] 最近在量血壓~</title><link>https://blog.wu-boy.com/2007/06/%E7%94%9F%E6%B4%BB-%E6%9C%80%E8%BF%91%E5%9C%A8%E9%87%8F%E8%A1%80%E5%A3%93/</link><pubDate>Mon, 18 Jun 2007 13:30:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/06/%E7%94%9F%E6%B4%BB-%E6%9C%80%E8%BF%91%E5%9C%A8%E9%87%8F%E8%A1%80%E5%A3%93/</guid><description>&lt;p&gt;恩 ~ 最近無聊拿我爸爸在量血壓的血壓計來量，我發現我的血壓好像都蠻高的，其實說實在的，我自己也不知道為什麼會這樣，哈哈&lt;del&gt;不過我覺得還好，自己的身體感覺起來都還ok，沒有什麼症狀，不過我爸媽還擔心我高血壓，小時候還說我糖尿病，哈哈真是好笑&lt;/del&gt;，不過小時候還因為爸爸一直說我太胖，所以我國中減肥，會不會是因為減肥造成我身高只有 168，撲撲，好像也不是減肥問題，因為我國中畢業才145，囧很矮吧&lt;del&gt;然後現在也才 168 哈哈 矮人一個，不過我自己開心最重要，反正我也不在乎別人講什麼。 哈哈血壓還沒講完呢，話說我最近測量自己血壓，都是在 130-140之間，我自己看到都嚇到，然後吃飽飯測量，竟然看到149，哈哈，很屌吧，在我這個年紀，沒人可以跟我一樣吧&lt;/del&gt;不過話說回來，我的飲食很正常說，自從我退伍之後在家裡，早上起來就是1科鳳梨然後一科奇異果，然後中午大概就是我媽媽煮的飯，然後我媽媽就會去上班，我下午大概都會去運動，爬山吧~，然後晚上回來，大概自己去炒個高麗菜，或者是紅蘿蔔炒蛋，這樣應該很健康，睡覺前還弄一杯葡萄牛奶，或者是蘋果牛那喝，奇怪這樣也會血壓高喔~我哥哥不運動喝飲料吃炸的吃滷的樣樣來，結果他血壓 110-120中間，撲撲果然人事間有很多奇妙的事情。&lt;/p&gt;</description></item><item><title>[生活] 第一次看牙醫～ 噗噗</title><link>https://blog.wu-boy.com/2007/06/%E7%94%9F%E6%B4%BB-%E7%AC%AC%E4%B8%80%E6%AC%A1%E7%9C%8B%E7%89%99%E9%86%AB%EF%BD%9E-%E5%99%97%E5%99%97/</link><pubDate>Thu, 14 Jun 2007 13:31:15 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/06/%E7%94%9F%E6%B4%BB-%E7%AC%AC%E4%B8%80%E6%AC%A1%E7%9C%8B%E7%89%99%E9%86%AB%EF%BD%9E-%E5%99%97%E5%99%97/</guid><description>&lt;p&gt;哈哈 出生到現在 24歲了～ 第一次看牙醫～ 囧 而且還是很奇怪的問題 不知道哪一天早上起來 刷牙，然後覺得牙齒酸酸的 想說是不是蛀牙了，人生第一次蛀牙阿～ 哈哈～ 人生還真多第一次，嘿嘿 真開心 不過這還沒什麼，去到牙醫診所，牙醫看完之後，問我說 小朋友 你來亂的喔 你牙齒這麼棒，看啥牙醫，囧，後來醫生看不出來我哪裡有病 所以請一位漂亮的護士幫我照X光，哈哈 不過我還真不好意思，因為那位護士要拿手伸進去我的嘴巴～～ 囧 真對不起那位護士～ 哈哈 後來x光照完了，醫生看了一下～ 臉又囧了～ 因為照出來正常 噗噗～ 我看醫生快哭了～ 後來醫生才免強找到一顆牙，幫我補一下，順便幫我洗牙齒，哈哈 真是辛苦醫生了～&lt;/p&gt;</description></item><item><title>[PHP] 如何更正系統時間 timezone_set</title><link>https://blog.wu-boy.com/2007/06/php-%E5%A6%82%E4%BD%95%E6%9B%B4%E6%AD%A3%E7%B3%BB%E7%B5%B1%E6%99%82%E9%96%93-timezone_set/</link><pubDate>Thu, 14 Jun 2007 05:47:17 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/06/php-%E5%A6%82%E4%BD%95%E6%9B%B4%E6%AD%A3%E7%B3%BB%E7%B5%B1%E6%99%82%E9%96%93-timezone_set/</guid><description>&lt;p&gt;相信很多虛擬主機都會碰到時間的問題，比如說少 8 小時，或者是多 8 小時，現在只要在執行 php 的前端加上&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: php; title: ; notranslate" title=""&gt;date_default_timezone_set("Asia/Taipei");&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;這樣就會更新到正確時間了，這樣在使用 &lt;code&gt;mktime()&lt;/code&gt; 就沒啥問題了&lt;/p&gt;
&lt;p&gt;或者去系統改 &lt;code&gt;php.ini&lt;/code&gt; 檔案&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;;Defines the default timezone used by the date functions
date.timezone = Asia/Taipei&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Linux 系統校正時間，可以執行底下 Script:&lt;/p&gt;
&lt;div&gt;
 &lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# check if link file
[ -L /etc/localtime ] &amp;&amp; unlink /etc/localtime
# update time zone
ln -sf /usr/share/zoneinfo/Asia/Taipei /etc/localtime
aptitude -y install ntpdate
ntpdate time.stdtime.gov.tw
# write time to clock.
hwclock -w&lt;/pre&gt;
&lt;/div&gt;</description></item><item><title>國史館台灣文獻館～發生大事？替代役事件</title><link>https://blog.wu-boy.com/2007/06/%E5%9C%8B%E5%8F%B2%E9%A4%A8%E5%8F%B0%E7%81%A3%E6%96%87%E7%8D%BB%E9%A4%A8%EF%BD%9E%E7%99%BC%E7%94%9F%E5%A4%A7%E4%BA%8B%EF%BC%9F%E6%9B%BF%E4%BB%A3%E5%BD%B9%E4%BA%8B%E4%BB%B6/</link><pubDate>Sat, 09 Jun 2007 13:32:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/06/%E5%9C%8B%E5%8F%B2%E9%A4%A8%E5%8F%B0%E7%81%A3%E6%96%87%E7%8D%BB%E9%A4%A8%EF%BD%9E%E7%99%BC%E7%94%9F%E5%A4%A7%E4%BA%8B%EF%BC%9F%E6%9B%BF%E4%BB%A3%E5%BD%B9%E4%BA%8B%E4%BB%B6/</guid><description>&lt;p&gt;昨天在公司裡面，突然接到 &lt;a href="http://www.th.gov.tw"&gt;國史館台灣文獻館&lt;/a&gt; 打給我電話，問我是不是去投書廖秘書～ 囧～ 看來以後只要有關於廖秘書事情，好像都會牽拖到我，不過這也沒辦法，在我還在當替代役的時候就跟廖秘書衝突N次，所以大家聯想到我也是很正常，不過總覺得部只有我會這樣做，哈哈 就像有一次鬧到立委打電話萊關切，好像聽說有2-3位立委打電話來，但是不是我找立委吧，雖然其中一位立委是我認識的，但是另外不是我認識的，這表示還有人不喜歡廖秘書，不過整件事情感覺苗頭都是對上我，大家一致認為是我找的～噗噗。 這次聽說是 &lt;a href="http://www.drnh.gov.tw/"&gt;台北國史館&lt;/a&gt; 來函給 國史館台灣文獻館～ 我的這篇文章 &lt;a href="http://life.wu-boy.com/2007/05/14/14/"&gt;替代役不平等待遇 (續) 替代役長官 (廖秘書)&lt;/a&gt; 好像造成整理組的轟動，因為學弟在 google 打入 “文獻館替代役”，就搜尋到了，哈哈～ 一堆學弟開始問了，不過告知一下學弟們，請他們自己體會吧，每個人感受不同的 這次台北國史館來函，不知道是因為什麼事情，也沒有人告訴我，只是有館內人員打給我，問我是否有去投書，想也知道我才不會那麼無聊，有必要這樣嗎？我已經退伍了，哈哈，那邊的事情就讓他過去吧，哈哈我也問過了我替代役好友，他也說他沒有投，我跟他平常忙得要命，我早上8點半出門，到晚上7點半才到家，最好是我還有時間去搞這個，要弄也是在我替代役期間就投了，哈哈。 總歸一句話，廖秘書惹上太多人了，至少我敢保證在我當替代役期間，我沒有從其他19位替代役朋友口中，聽到任何一句稱讚過廖秘書的，聽到抱怨多到無比，我想廖秘書自己也該好好檢討吧～，不過我看他的個性，我想不可能改的，哈哈，那可能未來會有更多人投書吧。&lt;/p&gt;</description></item><item><title>網誌即將區分~</title><link>https://blog.wu-boy.com/2007/06/%E7%B6%B2%E8%AA%8C%E5%8D%B3%E5%B0%87%E5%8D%80%E5%88%86/</link><pubDate>Wed, 06 Jun 2007 14:30:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/06/%E7%B6%B2%E8%AA%8C%E5%8D%B3%E5%B0%87%E5%8D%80%E5%88%86/</guid><description>&lt;p&gt;目前這個blog，將來都會寫技術性文章 技術文章：&lt;a href="http://blog.wu-boy.com"&gt;http://blog.wu-boy.com&lt;/a&gt; 生活日記：&lt;a href="http://life.wu-boy.com"&gt;http://life.wu-boy.com&lt;/a&gt; 哈哈~ 暫時確定是這樣 另外一個blog也架好了~ 囧&lt;/p&gt;</description></item><item><title>[PHP] 日期函數『搭配javascript』</title><link>https://blog.wu-boy.com/2007/05/php-%E6%97%A5%E6%9C%9F%E5%87%BD%E6%95%B8%E3%80%8E%E6%90%AD%E9%85%8Djavascript%E3%80%8F/</link><pubDate>Mon, 28 May 2007 02:07:17 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/05/php-%E6%97%A5%E6%9C%9F%E5%87%BD%E6%95%B8%E3%80%8E%E6%90%AD%E9%85%8Djavascript%E3%80%8F/</guid><description>&lt;p&gt;剛剛發現一個好玩的函數，用在購物車的時候，可以選擇發表團購日期，跟結束日期，下面我是設定發起日後14天之內要下架，還不錯用 大家參考看看吧，其實做出很多功能，大家修改函數就可以了 function jmp2_date_ex($str,$str1,$str2,$sy,$ey){ global $$str; $$str=str_replace(&amp;quot;-&amp;quot;,&amp;quot;/&amp;quot;,$$str); $nextWeek = time() + (14 * 24 * 60 * 60); $sy=date(&amp;ldquo;Ymd&amp;rdquo;); $ey=date(&amp;ldquo;Ymd&amp;rdquo;,$nextWeek); echo &amp;ldquo;&lt;input id='$str' name='$str' type='text' size=8 value='".$$str."' readonly style='height:18;font-size:9pt'&gt;&amp;rdquo;; ?&amp;gt; &amp;lt;? } [/code]&lt;/p&gt;</description></item><item><title>[PHP] header下載檔案 搭配資料庫</title><link>https://blog.wu-boy.com/2007/05/php-header%E4%B8%8B%E8%BC%89%E6%AA%94%E6%A1%88-%E6%90%AD%E9%85%8D%E8%B3%87%E6%96%99%E5%BA%AB/</link><pubDate>Sat, 26 May 2007 04:28:11 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/05/php-header%E4%B8%8B%E8%BC%89%E6%AA%94%E6%A1%88-%E6%90%AD%E9%85%8D%E8%B3%87%E6%96%99%E5%BA%AB/</guid><description>&lt;p&gt;剛剛在 ECstart 看到有人詢問 &lt;a href="http://bbs.ecstart.com/viewthread.php?tid=25354"&gt;header檔案下載錯誤&lt;/a&gt; 發現網站義工有回答到這個function，所以就紀錄下來了&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;function dl_file($file){

 //First, see if the file exists
 if (!is_file($file)) { die("&lt;b&gt;404 File not found!&lt;/b&gt;"); }

 //Gather relevent info about file
 $len = filesize($file);
 $filename = basename($file);
 $file_extension = strtolower(substr(strrchr($filename,"."),1));

 //This will set the Content-Type to the appropriate setting for the file
 switch( $file_extension ) {
 case "pdf": $ctype="application/pdf"; break;
 case "exe": $ctype="application/octet-stream"; break;
 case "zip": $ctype="application/zip"; break;
 case "doc": $ctype="application/msword"; break;
 case "xls": $ctype="application/vnd.ms-excel"; break;
 case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
 case "gif": $ctype="image/gif"; break;
 case "png": $ctype="image/png"; break;
 case "jpeg":
 case "jpg": $ctype="image/jpg"; break;
 case "mp3": $ctype="audio/mpeg"; break;
 case "wav": $ctype="audio/x-wav"; break;
 case "mpeg":
 case "mpg":
 case "mpe": $ctype="video/mpeg"; break;
 case "mov": $ctype="video/quicktime"; break;
 case "avi": $ctype="video/x-msvideo"; break;

 //The following are for extensions that shouldn't be downloaded (sensitive stuff, like php files)
 case "php":
 case "htm":
 case "html":
 case "txt": die("&lt;b&gt;Cannot be used for ". $file_extension ." files!&lt;/b&gt;"); break;

 default: $ctype="application/force-download";
 }

 //Begin writing headers
 header("Pragma: public");
 header("Expires: 0");
 header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
 header("Cache-Control: public");
 header("Content-Description: File Transfer");
 
 //Use the switch-generated Content-Type
 header("Content-Type: $ctype");

 //Force the download
 $header="Content-Disposition: attachment; filename=".$filename.";";
 header($header );
 header("Content-Transfer-Encoding: binary");
 header("Content-Length: ".$len);
 @readfile($file);
 exit;
}
&lt;/pre&gt;</description></item><item><title>wordpress 留言被灌爆 – plugin – WP-ImgCode mod</title><link>https://blog.wu-boy.com/2007/05/wordpress-%E7%95%99%E8%A8%80%E8%A2%AB%E7%81%8C%E7%88%86-plugin-wp-imgcode-mod/</link><pubDate>Mon, 21 May 2007 13:10:15 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/05/wordpress-%E7%95%99%E8%A8%80%E8%A2%AB%E7%81%8C%E7%88%86-plugin-wp-imgcode-mod/</guid><description>&lt;p&gt;今天有人問我，blog留言版被灌爆，都是廣告信，我想說 wordpress 不是有內建一個外掛 &lt;a href="http://akismet.com/"&gt;Akismet&lt;/a&gt; 這個外掛可以擋掉很多spam，讓你的留言版不至於有廣告信，不過還是可以加上留言版的驗證圖形，這樣會更安全一點。 今天找到一個國人改寫的 WordPress plugin – &lt;a href="http://blog.chweng.idv.tw/wordpress/wp-imgcode-mod/"&gt;WP-ImgCode mod&lt;/a&gt; 這個還不錯用，安裝方式如下&lt;/p&gt;
&lt;h5 id="安裝啟用"&gt;安裝啟用&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;將解壓縮出來的 wp-imgcode 資料夾放到 WordPress 的 plugin 資料夾，預設為 wp-content/plugins。&lt;/li&gt;
&lt;li&gt;在控制台中啟用這個 plugin。&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id="加入驗證碼"&gt;加入驗證碼&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;開啟目前使用佈景的相關檔案，例如 comments.php。&lt;/li&gt;
&lt;li&gt;在要顯示驗證碼的地方，加上這個程式碼：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;&lt;? php do_action("comment_form", $post-&gt;ID); ?&gt;
&lt;/pre&gt; 明天在去搞定別人的網站吧~ 先紀錄一下~</description></item><item><title>[PHP] 如何切割中文標題</title><link>https://blog.wu-boy.com/2007/05/php-%E5%A6%82%E4%BD%95%E5%88%87%E5%89%B2%E4%B8%AD%E6%96%87%E6%A8%99%E9%A1%8C/</link><pubDate>Sat, 19 May 2007 02:47:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/05/php-%E5%A6%82%E4%BD%95%E5%88%87%E5%89%B2%E4%B8%AD%E6%96%87%E6%A8%99%E9%A1%8C/</guid><description>&lt;p&gt;今天看到酷！學園討論區，php版有人問說要如何切割中文字，結果我自己以前弄的一個function就貼了上去，如下&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate" title=""&gt;function cut_word($text, $num){
if(strlen($text) &gt; $num) {
 for($i=0;$i&lt;$num;$i++) {
 $ch=substr($text,$i,1);
 if(ord($ch)&gt;127) $i++;
 }
 $text= substr($text,0,$i).".";
 }
 return $text;
}
&lt;/pre&gt;</description></item><item><title>替代役不平等待遇 (續) 替代役長官 (廖秘書)</title><link>https://blog.wu-boy.com/2007/05/%E6%9B%BF%E4%BB%A3%E5%BD%B9%E4%B8%8D%E5%B9%B3%E7%AD%89%E5%BE%85%E9%81%87-%E7%BA%8C-%E6%9B%BF%E4%BB%A3%E5%BD%B9%E9%95%B7%E5%AE%98-%E5%BB%96%E7%A7%98%E6%9B%B8/</link><pubDate>Mon, 14 May 2007 12:25:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/05/%E6%9B%BF%E4%BB%A3%E5%BD%B9%E4%B8%8D%E5%B9%B3%E7%AD%89%E5%BE%85%E9%81%87-%E7%BA%8C-%E6%9B%BF%E4%BB%A3%E5%BD%B9%E9%95%B7%E5%AE%98-%E5%BB%96%E7%A7%98%E6%9B%B8/</guid><description>&lt;p&gt;廖秘書是在成功嶺把我錄取的人，也是他的惡夢開始，回想起來：在我2006年2月9號入伍，然後經過一個禮拜，劉專門委員(目前為整理組組長)來到成功嶺來找尋他們所要的人才，當時我記的很清楚，口口聲聲說要linux人才，資訊類，可是我做了一年多，只有我這個替代役是在從事資訊服務，其他資訊類專長的替代役，全部都拿去鍵打資料，相當浪費替代役人才，在成功嶺退伍前，國史館台灣文獻館 來到成功嶺挑選人才，我還記的很清楚，我是被劉專門委員挑上的，可是在這短短的一年多，我跟他幹上好幾次，這裡不多說了，之後還要寫一篇for him。&lt;/p&gt;</description></item><item><title>替代役不平等待遇？替代役長官 (黃秘書)</title><link>https://blog.wu-boy.com/2007/05/%E6%9B%BF%E4%BB%A3%E5%BD%B9%E4%B8%8D%E5%B9%B3%E7%AD%89%E5%BE%85%E9%81%87%EF%BC%9F/</link><pubDate>Sun, 06 May 2007 13:12:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/05/%E6%9B%BF%E4%BB%A3%E5%BD%B9%E4%B8%8D%E5%B9%B3%E7%AD%89%E5%BE%85%E9%81%87%EF%BC%9F/</guid><description>&lt;p&gt;替代役其實是一個蠻好的職位，可以不必去軍隊裏面，又可以貢獻給國家，可是很多單位申請替代役，好像都搞錯方向，把我們當勞工在操，什麼事情都叫替代役做，然後正職公務人員很涼，天天沒事做，看報紙，泡茶？說實在替代役的義務是輔助性質，也就是說幫正職公務人員處理一些雜事，可是好像本單位『國史館台灣文獻館』不是這樣認為，單位主管除了平實請替代役幫忙修電腦之外，下班之後還叫替代役去單位主管家裡修電腦，甚至幫忙下載東西，我想這是不太對的吧？&lt;/p&gt;</description></item><item><title>[FreeBSD] Smokeping 安裝 架設</title><link>https://blog.wu-boy.com/2007/04/freebsd-smokeping-%E5%AE%89%E8%A3%9D-%E6%9E%B6%E8%A8%AD/</link><pubDate>Sat, 28 Apr 2007 13:29:02 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/04/freebsd-smokeping-%E5%AE%89%E8%A3%9D-%E6%9E%B6%E8%A8%AD/</guid><description>&lt;p&gt;昨天看到 sayya 的 firedragen 個人版，看到 &lt;a href="http://oss.oetiker.ch/smokeping/" target="_blank"&gt;smokeping&lt;/a&gt; 的一些圖片，還蠻帥的，就想到要架設來玩看看 安裝方式如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[FreeBSD][root][ ~ ]# cd /usr/ports/net/smokeping/ 進去之後&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;make install clean 然後底下是安裝好之後的訊息&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;NOTE: A set of sample configuration files have been installed: /usr/local/etc/smokeping/config /usr/local/etc/smokeping/smokemail /usr/local/etc/smokeping/basepage.html /usr/local/etc/smokeping/tmail You *MUST* edit these to suit your requirements. Please read the manpages ‘smokeping_install’ and ‘smokeping_config’ for further details on installation and configuration. If you are upgrading from a previous version of Smokeping, the manpage ‘smokeping_upgrade’ may be of help. Once configured, you can start SmokePing by adding: smokeping_enable=”YES” to /etc/rc.conf, and then running, as root: /usr/local/etc/rc.d/smokeping start To enable Apache web access, add the following to your /usr/local/etc/apache/httpd.conf: ScriptAlias /smokeping.cgi /usr/local/smokeping/htdocs/smokeping.cgi Alias /smokeimg/ /usr/local/smokeping/htdocs/img/ 上面就是寫：請在 /etc/rc.conf 加入 smokeping_enable=”YES” 然後編輯 /usr/local/etc/apache/httpd.conf 在最後面加上 ScriptAlias /smokeping.cgi /usr/local/smokeping/htdocs/smokeping.cgi Alias /smokeimg/ /usr/local/smokeping/htdocs/img/ 修改 根目錄底下權限 Options Indexes FollowSymLinks ExecCGI 然後底下這段原本mark，請把他取消 AddHandler cgi-script .cgi 然後最後加上 &lt;directory&gt; Options Indexes FollowSymLinks ExecCGI AllowOverride Limit Order Deny,Allow Deny from all Allow from 192.168 &lt;/directory&gt; 底下附上設定檔，DarkKiller 在 firedragen 版 的連結，不過連結已經失效，好顯自己有存檔 &lt;a href="http://blog.wu-boy.com/wp-content/uploads/2007/04/smokeping.txt"&gt;http://blog.wu-boy.com/wp-content/uploads/2007/04/smokeping.txt&lt;/a&gt; 最後 NCTU NetFlow’s somkeping demo: &lt;a href="http://netflow.ntcu.net/smokeping/smokeping.cgi?target=Album" target="_blank"&gt;&lt;a href="http://netflow.ntcu.net/smokeping/smokeping.cgi?target=Album"&gt;http://netflow.ntcu.net/smokeping/smokeping.cgi?target=Album&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>WordPress plugin fckeditor</title><link>https://blog.wu-boy.com/2007/04/wordpress-plugin-fckeditor/</link><pubDate>Wed, 18 Apr 2007 02:52:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/04/wordpress-plugin-fckeditor/</guid><description>&lt;div align="left"&gt;
 &lt;br /&gt;&lt;br /&gt;其實我之前就在找這個 plugin 了，今天不小心google到了，因為 wordpress 所提供內建的，不是很好用，所以網路有一套&lt;br /&gt;&amp;nbsp;&lt;br /&gt; &lt;a href="http://www.fckeditor.net/demo" class="l" onmousedown="return rwt(this,'','','res','2','__-zM4ohZKVD3PnIyOEoVsQM1UG6Y=','&amp;sig2=HUnbF7NJ5ZtusHlJC4RZFg')"&gt;FCKeditor &amp;#8211; Demo&lt;/a&gt;&amp;nbsp; 這一套還不錯用，網路上找到plugin &lt;a onmousedown="return rwt(this,'','','res','10','__uBbzI4If6E8hNwSLjh664RBpeJE=','&amp;sig2=kZ3AjS1u8wpE8RgTMwZ7Vg')" class="l" href="http://briian.com/?p=19"&gt;[必讀] 其他用的所見即所得編輯器- 【重灌狂人】&lt;/a&gt;&lt;span class="l"&gt; &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;這一篇裡面有下載檔案，大家可以去下載，demo的話，就上面link
&lt;/div&gt;</description></item><item><title>[DNS] Domain Name transfer From DreamHost to Godaddy 教學</title><link>https://blog.wu-boy.com/2007/04/dns-domain-name-transfer-from-dreamhost-to-godaddy-%E6%95%99%E5%AD%B8/</link><pubDate>Mon, 16 Apr 2007 00:58:26 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/04/dns-domain-name-transfer-from-dreamhost-to-godaddy-%E6%95%99%E5%AD%B8/</guid><description>&lt;p&gt;目前我自己的Domain : wu-boy.com，已經快過期了，到2007.04.30就到了，在網路上常常看到一堆文章寫 dreamhost 的不好，底下列了幾篇 &lt;a rel="bookmark" title="Permanent Link: DreamHost Sucks !" href="http://blog.xdite.net/?p=300"&gt;DreamHost Sucks !&lt;/a&gt; &lt;a rel="bookmark" title="Permanent Link: 搶救 xdite.net 所用的奇技淫巧" href="http://blog.xdite.net/?p=307"&gt;搶救 xdite.net 所用的奇技淫巧&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Mysql] 資料庫備份[big5]utf8轉換成utf-8</title><link>https://blog.wu-boy.com/2007/04/mysql-%E8%B3%87%E6%96%99%E5%BA%AB%E5%82%99%E4%BB%BDbig5utf8%E8%BD%89%E6%8F%9B%E6%88%90utf-8/</link><pubDate>Sun, 08 Apr 2007 13:14:29 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/04/mysql-%E8%B3%87%E6%96%99%E5%BA%AB%E5%82%99%E4%BB%BDbig5utf8%E8%BD%89%E6%8F%9B%E6%88%90utf-8/</guid><description>&lt;p&gt;其實在很多opensource底下的套裝軟體，資料庫預設都是用 utf8，我想這會造成在 phpMyAdmin 底下看到亂碼，然後自己之前也有遇到問題，然後又在網路上看到這篇 &lt;a title="Permanent Link: 搶救 xdite.net 所用的奇技淫巧" rel="bookmark" href="http://blog.xdite.net/?p=307"&gt;搶救 xdite.net 所用的奇技淫巧&lt;/a&gt; 裡面所寫的備份方式跟我在轉換 phpBB2 跟自己的 wordpress 一樣 大同小異，我還在想說有更好的解法說，看來是沒有，在 wordpress 底下，只能利用後台的資料庫備份，不然用phpMyAdmin的話，我想你備份出來也是沒用。&lt;/p&gt;</description></item><item><title>[SQL] SQL 進階搜尋寫法~ 一個很簡單的問題</title><link>https://blog.wu-boy.com/2007/04/sql-sql-%E9%80%B2%E9%9A%8E%E6%90%9C%E5%B0%8B%E5%AF%AB%E6%B3%95-%E4%B8%80%E5%80%8B%E5%BE%88%E7%B0%A1%E5%96%AE%E7%9A%84%E5%95%8F%E9%A1%8C/</link><pubDate>Fri, 06 Apr 2007 13:48:05 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/04/sql-sql-%E9%80%B2%E9%9A%8E%E6%90%9C%E5%B0%8B%E5%AF%AB%E6%B3%95-%E4%B8%80%E5%80%8B%E5%BE%88%E7%B0%A1%E5%96%AE%E7%9A%84%E5%95%8F%E9%A1%8C/</guid><description>&lt;p&gt;最近在幫 國史館台灣文獻館 寫館內搜尋系統，然後遇到一個問題，晚上跟 sayya裡的大大 ghost 搞了很久，也佔用 ghost 大大很多時間，在這裡先感謝他大力相助~，他還說 這是他解決最久的問題，哈哈，問題如下&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我先列出3個表格的欄位跟一些值 table1 class_id, class_title 1 name1 2 name2 table2 class_id, series_name 1 000001 1 000002 1 000003 2 001001 2 001002 2 001003 table3 group_id, group_name 1 000001 1 000002 1 000003 1 000004 2 001001 2 001002 2 001003 如果想要 table1 跟 table2 結合 只要下 sql語法一&lt;/p&gt;
&lt;pre class="brush: sql; title: ; notranslate" title=""&gt;############
&lt;/blockquote&gt;
&lt;h1 id="ex"&gt;ex:&lt;/h1&gt;
&lt;p&gt;Select * From table1 as t1, table2 as t2 where t1.class_id = t2.class_id &amp;amp;&amp;amp; SUBSRTING(&lt;code&gt;series_name&lt;/code&gt;,1,3) = &amp;lsquo;000&amp;rsquo;
############
&lt;/pre&gt; 如果想要 table1 跟 table3 結合 只要下 sql語法二&lt;/p&gt;</description></item><item><title>使用 cwRsync 差異性備份 Windows 2003 伺服器</title><link>https://blog.wu-boy.com/2007/04/%E4%BD%BF%E7%94%A8-cwrsync-%E5%B7%AE%E7%95%B0%E6%80%A7%E5%82%99%E4%BB%BD-windows-2003-%E4%BC%BA%E6%9C%8D%E5%99%A8/</link><pubDate>Wed, 04 Apr 2007 03:28:44 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/04/%E4%BD%BF%E7%94%A8-cwrsync-%E5%B7%AE%E7%95%B0%E6%80%A7%E5%82%99%E4%BB%BD-windows-2003-%E4%BC%BA%E6%9C%8D%E5%99%A8/</guid><description>&lt;p&gt;最近正在弄Windows的機器怎麼跟Windows的機器互相備份，linux跟windows之間怎麼備份已經搞定了，其實我差不會利用windows的每天固定跑程式，在linux底下可以使用cron的方式來用，可是winodws底下就要使用批次檔。 再來就是安裝步驟，請把2台windows的機器都裝上 cwRsync 參考文章 &lt;a href="http://blog.wu-boy.com/2006/12/14/53"&gt;[Linux] cwRsync [rsync for windows] SSH 加密異地備份&lt;/a&gt; 假設已經安裝好 cwrsync 之後，在系統服務那邊 把他啟動之後，就可以開始使用了 底下是網路上抓好的 清除你系統中沒必要的垃圾檔案&lt;/p&gt;</description></item><item><title>Lftp 使用FXP以及使用implicit mode加密傳輸</title><link>https://blog.wu-boy.com/2007/04/lftp-%E4%BD%BF%E7%94%A8fxp%E4%BB%A5%E5%8F%8A%E4%BD%BF%E7%94%A8implicit-mode%E5%8A%A0%E5%AF%86%E5%82%B3%E8%BC%B8/</link><pubDate>Mon, 02 Apr 2007 12:33:09 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/04/lftp-%E4%BD%BF%E7%94%A8fxp%E4%BB%A5%E5%8F%8A%E4%BD%BF%E7%94%A8implicit-mode%E5%8A%A0%E5%AF%86%E5%82%B3%E8%BC%B8/</guid><description>&lt;p&gt;其實 lftp 是一個相當好用的文字介面ftp軟體，目前我在玩 linux，就是搭配這套軟體，這套軟體可以搭配shell script，來做到備份的工作，相當不錯，之前在網路上看到 segaa大大寫的一篇 &lt;a href="http://blog.segaa.net/blog.php/1/post/3/100"&gt;[freebsd] lftp安裝與應用&lt;/a&gt; 使用起來很方便，不過我遇到的server都是利用 explicit mode 方式加密，如果利用 implicit mode方式連接，指令可能有些不同，底下來介紹一下&lt;/p&gt;
&lt;p&gt;如果你的server端用 explicit 方式來連接，你可使用&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lftp -d -u appleboy -p PORT url
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果你用 implicit 方式的話，就用下面&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-2"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-3"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-4"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-5"&gt;&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[appleboy@appleboy-dorm][~][20:23:03]$ lftp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lftp :~&amp;gt; open -d ftps://username:password@url:port 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;# 注意 是 ftps://&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#228b22"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>[mysql] mysqlbinlog 資料庫處理二進制日誌檔案的實用工具</title><link>https://blog.wu-boy.com/2007/03/mysql-mysqlbinlog-%E8%B3%87%E6%96%99%E5%BA%AB%E8%99%95%E7%90%86%E4%BA%8C%E9%80%B2%E5%88%B6%E6%97%A5%E8%AA%8C%E6%AA%94%E6%A1%88%E7%9A%84%E5%AF%A6%E7%94%A8%E5%B7%A5%E5%85%B7/</link><pubDate>Thu, 29 Mar 2007 14:59:23 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/03/mysql-mysqlbinlog-%E8%B3%87%E6%96%99%E5%BA%AB%E8%99%95%E7%90%86%E4%BA%8C%E9%80%B2%E5%88%B6%E6%97%A5%E8%AA%8C%E6%AA%94%E6%A1%88%E7%9A%84%E5%AF%A6%E7%94%A8%E5%B7%A5%E5%85%B7/</guid><description>&lt;p&gt;當初 國史館台灣文獻館 數位點藏計劃派我去台北 中研院 參加 dor系統計劃的時候，當時有介紹此指令，不過那時候聽不是很清楚，後來在我開發的系統上面惡搞了一下，早上玩自己的資料庫，不小心把他crash掉囉，所以趕緊用 mysqlbinlog 恢復了一堆資料，真是好顯，也虧自己有備份一周的資料庫。 當然，系統剛弄好是沒有開啟 mysqlbinlog 的功能，至少在 CentOS4.4 上面我還要去開啟，不過 ubuntu 系統預設就已經開啟了，不過沒關係，只要利用下面方法就可以達到了 修改 my.cnf [ CentOS: /etc/my.cnf Ubuntu: /etc/mysql/my.cnf ]，加入下面語法 # Replication Master Server (default) # binary logging is required for replication log-bin=mysql-bin&lt;/p&gt;</description></item><item><title>鳥哥的新書-伺服器架站第二版</title><link>https://blog.wu-boy.com/2007/03/%E9%B3%A5%E5%93%A5%E7%9A%84%E6%96%B0%E6%9B%B8-%E4%BC%BA%E6%9C%8D%E5%99%A8%E6%9E%B6%E7%AB%99%E7%AC%AC%E4%BA%8C%E7%89%88/</link><pubDate>Wed, 28 Mar 2007 12:36:06 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/03/%E9%B3%A5%E5%93%A5%E7%9A%84%E6%96%B0%E6%9B%B8-%E4%BC%BA%E6%9C%8D%E5%99%A8%E6%9E%B6%E7%AB%99%E7%AC%AC%E4%BA%8C%E7%89%88/</guid><description>&lt;p&gt;最近剛買的，在 天瓏網路書局 買的，當時特價的，我看鳥哥的網站公告寫說 天瓏網路書局 有在特價如下 &lt;strong&gt;預購 鳥哥的 Linux 私房菜伺服器架設篇 2/e(2007-03-08)&lt;/strong&gt;&lt;/p&gt;
&lt;table width="894" cellspacing="2" cellpadding="2" border="0" align="center" style="height: 375px"&gt;
 &lt;tr align="center"&gt;
 &lt;td colspan="2"&gt;
 &lt;img src="https://i2.wp.com/www.tenlong.com.tw/images/ad/84.jpg?w=840" data-recalc-dims="1" /&gt;
 &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td valign="top" style="width: 76px"&gt;
 &lt;strong&gt;活動內容&lt;/strong&gt;
 &lt;/td&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;td style=&amp;quot;width: 430px&amp;quot;&amp;gt;
 凡預購 &amp;lt;font color=&amp;quot;#660000&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;鳥哥的 Linux 私房菜伺服器架設篇 2/e&amp;lt;/strong&amp;gt;&amp;lt;/font&amp;gt;，只需要&amp;lt;strong&amp;gt;&amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt; 550元&amp;lt;/font&amp;gt;&amp;lt;/strong&amp;gt;，並額外享有該筆訂單 &amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;免運費&amp;lt;/strong&amp;gt;&amp;lt;/font&amp;gt; 。如果加購&amp;lt;strong&amp;gt;&amp;lt;font color=&amp;quot;#0033cc&amp;quot;&amp;gt; &amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;#660000&amp;quot;&amp;gt;鳥哥的 Linux 私房菜基礎學習篇 2/e&amp;lt;/font&amp;gt;&amp;lt;/strong&amp;gt;，只需要另加&amp;lt;strong&amp;gt;&amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt; 550元&amp;lt;/font&amp;gt;&amp;lt;/strong&amp;gt;，合計 &amp;lt;strong&amp;gt; &amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;1100元&amp;lt;/font&amp;gt;&amp;lt;/strong&amp;gt; 就可以把入門與進階一次帶回家。&amp;lt;strong&amp;gt;&amp;lt;font color=&amp;quot;#0033cc&amp;quot;&amp;gt;鳥哥的 Linux 私房菜伺服器架設篇 2/e&amp;lt;/font&amp;gt;&amp;lt;/strong&amp;gt; ISBN：9789866884146&amp;lt;strong&amp;gt;&amp;lt;a href=&amp;quot;http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchViewAction.do?isbn=9867199553&amp;amp;#038;sid=29946&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;#0033cc&amp;quot;&amp;gt;鳥哥的 Linux 私房菜基礎學習篇 2/e&amp;lt;/font&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/strong&amp;gt; ISBN：9867199553
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td valign="top"&gt;
 &lt;strong&gt;活動對象&lt;/strong&gt;
 &lt;/td&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;td&amp;gt;
 網路讀者、門市讀者。
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td valign="top"&gt;
 &lt;strong&gt;活動日期&lt;/strong&gt;
 &lt;/td&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;td&amp;gt;
 即日期 ~ 2007/03/16 止
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td valign="top"&gt;
 &lt;strong&gt;預定到貨&lt;/strong&gt;
 &lt;/td&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;td&amp;gt;
 &amp;lt;font color=&amp;quot;#006600&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;2007/03/16&amp;lt;/strong&amp;gt;&amp;lt;/font&amp;gt; 預計到貨。
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td valign="top"&gt;
 &lt;strong&gt;預購價格&lt;/strong&gt;
 &lt;/td&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;td&amp;gt;
 書籍定價 &amp;lt;strong&amp;gt;NT 780 元&amp;lt;/strong&amp;gt; 預購價格 &amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;NT 550 元&amp;lt;/strong&amp;gt;&amp;lt;/font&amp;gt; (立即替您省下&amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;&amp;lt;strong&amp;gt; 230 元&amp;lt;/strong&amp;gt;&amp;lt;/font&amp;gt;喔) 加購 &amp;lt;font color=&amp;quot;#993300&amp;quot;&amp;gt;基礎學習篇 2/e&amp;lt;/font&amp;gt; 合計&amp;lt;strong&amp;gt; &amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;NT 1100 元&amp;lt;/font&amp;gt;&amp;lt;/strong&amp;gt;
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td valign="top"&gt;
 &lt;strong&gt;預購名額&lt;/strong&gt;
 &lt;/td&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;td&amp;gt;
 網路讀者 &amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;50&amp;lt;/strong&amp;gt;&amp;lt;/font&amp;gt; 名 (網路讀者請按我要預購) 門市讀者 &amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;50&amp;lt;/strong&amp;gt;&amp;lt;/font&amp;gt; 名 (門市讀者請洽門市 &amp;lt;font color=&amp;quot;#993300&amp;quot;&amp;gt;TEL : 02-2371-7725&amp;lt;/font&amp;gt;)
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td valign="top"&gt;
 &lt;strong&gt;取貨期限&lt;/strong&gt;
 &lt;/td&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;td&amp;gt;
 到貨後，請於2007/3/23 PM6:00前，完成下訂單手續，逾期無效！
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/tr&gt;
&lt;/table&gt;</description></item><item><title>[Linux] CentOS 4.4 安裝 Openwebmail + spamassassin 擋垃圾信的設定方法</title><link>https://blog.wu-boy.com/2007/03/linux-centos-44-%E5%AE%89%E8%A3%9D-openwebmail-spamassassin-%E6%93%8B%E5%9E%83%E5%9C%BE%E4%BF%A1%E7%9A%84%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95/</link><pubDate>Wed, 28 Mar 2007 02:10:17 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/03/linux-centos-44-%E5%AE%89%E8%A3%9D-openwebmail-spamassassin-%E6%93%8B%E5%9E%83%E5%9C%BE%E4%BF%A1%E7%9A%84%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;其實以現在linux安裝方式已經相當容易了，不像以前都要tarball安裝，相當複雜，昨天安裝 openwebmail 只花了幾分鐘的時間，目前系統CentOS4.4 主機相當好，所以安裝起來特別快&lt;/p&gt;
&lt;p&gt;想利用 yum install 的安裝方式，不過發現沒有 openwebmail 的套件，所以上網找了rpm&lt;/p&gt;
&lt;p&gt;注意：要架設 Open Webmail 前，請務必先將 postfix(架設mail伺服器)、dovecot(POP3伺服器) 架設好&lt;/p&gt;</description></item><item><title>[FON_Appleboy]熱點故事 ：南投市中興新村</title><link>https://blog.wu-boy.com/2007/03/fon_appleboy%E7%86%B1%E9%BB%9E%E6%95%85%E4%BA%8B-%EF%BC%9A%E5%8D%97%E6%8A%95%E5%B8%82%E4%B8%AD%E8%88%88%E6%96%B0%E6%9D%91/</link><pubDate>Tue, 27 Mar 2007 02:11:01 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/03/fon_appleboy%E7%86%B1%E9%BB%9E%E6%95%85%E4%BA%8B-%EF%BC%9A%E5%8D%97%E6%8A%95%E5%B8%82%E4%B8%AD%E8%88%88%E6%96%B0%E6%9D%91/</guid><description>&lt;p&gt;a. 安裝時間：2007-01-09 b. 地點 : 南投市中興新村光明一路252號 國史館台灣文獻館&lt;/p&gt;
&lt;p&gt;&lt;a&gt; c. FON AP名稱(FON_Appleboy) 跟我的id相同啦 d.FON熱點故事： 說到熱典故事，我來介紹一下這裡好了，我目前是在國史館台灣文獻館擔任替代役 但是我今年5月底就退伍了，當然我就要把fon帶回我的故鄉 高雄啦，所以這裡是暫時性的喔 我在這個單位擔任程式設計師，做數位話的工作，這裡相當漂亮，因為有3棟很特別的建築物 &lt;a href="http://www.th.gov.tw/exhibition/exhibition.htm"&gt;文獻大樓&lt;a&gt;：文獻大樓各樓層介紹 &lt;a href="http://www.th.gov.tw/exhibition/exhibition_2.htm"&gt;文物大樓&lt;a&gt;：文物大樓各樓層介紹 &lt;a href="http://www.th.gov.tw/exhibition/exhibition_3.htm"&gt;史蹟大樓&lt;a&gt;：史蹟大樓各樓層介紹&lt;/p&gt;</description></item><item><title>[Apache] 使用者只能使用 https 進入 mod_rewrite force ssl 進階設定</title><link>https://blog.wu-boy.com/2007/03/apache-%E4%BD%BF%E7%94%A8%E8%80%85%E5%8F%AA%E8%83%BD%E4%BD%BF%E7%94%A8-https-%E9%80%B2%E5%85%A5-mod_rewrite-force-ssl-%E9%80%B2%E9%9A%8E%E8%A8%AD%E5%AE%9A/</link><pubDate>Thu, 22 Mar 2007 16:54:02 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/03/apache-%E4%BD%BF%E7%94%A8%E8%80%85%E5%8F%AA%E8%83%BD%E4%BD%BF%E7%94%A8-https-%E9%80%B2%E5%85%A5-mod_rewrite-force-ssl-%E9%80%B2%E9%9A%8E%E8%A8%AD%E5%AE%9A/</guid><description>&lt;p&gt;最近館內機器我想全部使用上ssl機制會比較安全，之前剛來到 國史館台灣文獻館 的時候，有研究助理對我不爽，說什麼我開發的薪資管理系統，沒有ssl機制，會出現漏洞，囧&lt;del&gt;導至系統目前只有我在用，哈哈，不過這不是重點&lt;/del&gt;重點是接下來的介紹啦 首先要看看你的機器是否有支援 mod_ssl 目前我用的機器是 CentOS 4.4 所以指令如果有所改變，請自行debug&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;cat /etc/httpd/conf/httpd.conf | grep rewrite LoadModule rewrite_module modules/mod_rewrite.so 這樣代表有支援了，那如果沒有支援呢，請用下面指令來新增&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;yum install mod_ssl&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[ubuntu] Mplayer 中文字幕設定</title><link>https://blog.wu-boy.com/2007/03/ubuntu-mplayer-%E4%B8%AD%E6%96%87%E5%AD%97%E5%B9%95%E8%A8%AD%E5%AE%9A/</link><pubDate>Tue, 20 Mar 2007 13:59:36 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/03/ubuntu-mplayer-%E4%B8%AD%E6%96%87%E5%AD%97%E5%B9%95%E8%A8%AD%E5%AE%9A/</guid><description>&lt;p&gt;先安裝 w32codecs&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;apt-get install w32codecs Ubuntu 的 Mplayer 中文字幕設定，這是我一直搞不定的東西，後來上網找了一下文章發現用以下解法就ok了 用管理者權限編輯以下檔案&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;/etc/mplayer/mplayer.conf 加入以下內容&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;subcp=cp950 font=/usr/share/fonts/truetype/arphic/ukai.ttf subfont-text-scale=3 結束。字型可以換成自己想要的字型，打開就可以看中文字幕阿。 註：影片檔跟字幕檔要同檔名 不過還有一點，就是你原本就有對mplayer設定一些東西，麻煩先刪除&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;rm -rf ~/.mplayer/ 這樣才不會影響 Mplayer 設定&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[FreeBSD] postfix + auth smtp + anti-UCE 詳細設定</title><link>https://blog.wu-boy.com/2007/03/freebsd-postfix-smtp-auth-%E6%93%8B-mail-spam-%E6%A9%9F%E5%88%B6/</link><pubDate>Fri, 16 Mar 2007 05:40:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/03/freebsd-postfix-smtp-auth-%E6%93%8B-mail-spam-%E6%A9%9F%E5%88%B6/</guid><description>&lt;p&gt;自從考上中正電機「94年考上」之後接上 中正電機 郵件伺服器網管工作，目前 中正電機 已經把網路組歸到 中正通 訊底下了，所以我已經不再是 中正電機 了，目前是以 中正通訊 的身份，不過目前我休學狀態，還在服兵役當中，在南投 國史館台灣文獻館 底下工作。我是在入學 中正電機 研究所的第一個學期末就已經休學了，目前已經快退伍了。&lt;/p&gt;</description></item><item><title>[www] 網站分流問題</title><link>https://blog.wu-boy.com/2007/03/www-%E7%B6%B2%E7%AB%99%E5%88%86%E6%B5%81%E5%95%8F%E9%A1%8C%EF%BC%8C%E5%9C%A8ptt%E4%B8%8A%E9%9D%A2%E7%9C%8B%E5%88%B0%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0/</link><pubDate>Sun, 11 Mar 2007 12:35:30 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/03/www-%E7%B6%B2%E7%AB%99%E5%88%86%E6%B5%81%E5%95%8F%E9%A1%8C%EF%BC%8C%E5%9C%A8ptt%E4%B8%8A%E9%9D%A2%E7%9C%8B%E5%88%B0%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0/</guid><description>&lt;p&gt;昨天在上台大 ptt 的bbs，逛到php版，發現裏面有人提問到，如何做到分流的問題，其實這個問題很多方式可以解決，以下我擷取一篇 ptt 上面的回文&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;作者: MrMarcus (請勿忘記密碼) 看板: PHP 標題: Re: [問題] 網站分流問題 時間: Sun Mar 11 00:26:04 2007 ※ 引述《timyau (我討厭Sony)》之銘言： : 我架了一個網站， : 使用了一台轉址主機、 : 兩台 Web Server 進行分流 : 另外還有一台主機當資料庫使用 : 每次使用者輸入轉址主機的位置 : 主機就會自動將使用者於內部導向兩台Web Server的其中一台 : 所以每次網站只要更新，就得同時更新兩台Web Server的網頁 : 這樣一來就有問題了 : 一但只更新其中一台Web Server， : 使用者連到網站來就會有可能看到不一樣的內容 : 因為有時候可能連到有更新的那一台，有時候會連到沒有更新的那一台 : 有嚐試過把檔案都放在第三台資料庫的 SERVER : 而PHP取得資料庫Server的內部IP(例如192.168.1.3) : 來讀取使用到的相同資源檔案 : 但是從外面要讀取圖片的時候卻發生網址上面是 http://192.168…./ : 的情況 : 這樣當然是有問題的啊 Orz : 想請問這樣的架構是否有問題？ : 還是有什麼解決方法嗎？謝謝 這問題我以前有遇到過，狀況很類似。不但每次更新要FTP兩次 到兩台伺服器去，而且在程式裡面也有這個問題，變成凡是使用者 上傳檔案的地方，程式接收到檔案後除了把檔案存在自己這台的 硬碟裡面外，還得把該檔案複製到另一台伺服器硬碟的相對應位置去， 否則被帶到另一台機器去的使用者就會找不到那個檔案。 （上面指的使用者不是維護網站的人，是來瀏覽網站的使用者） 我把這個問題提出來給客戶，因為我覺得讓兩台伺服器的檔案內容 保持同步這種工作不應該在網站程式這端來執行，應該在更底層 的地方由伺服器本身自己處理掉，網站程式這層級不需要去知道 現在到底有幾台伺服器在分散負荷。而且還要考慮到日後擴充的問題， 現在是兩台，以後變成三台，程式要改成把收到的上傳檔案複製到 另外兩台去，變成四台，五台呢？ 我那時提出的建議是，增加一套獨立的儲存設備，兩台伺服器上面 設定好把某個目錄，例如/webupload，共同mount到該儲存設備去， 程式裡面就把使用者透過程式上傳的檔案儲存到/webupload去。 然後在http server裡面指定某個目錄名稱對應到/webupload。例如 在httpd.conf裡面： Alias /upload /webupload 前面的/upload是web server上使用的目錄名稱，後面的/webupload 是檔案系統上的目錄名。換句話說，使用者在瀏覽www1.mycompany.com 的時候會看到&lt;img src="https://blog.wu-boy.com/upload/album/user1/myimage.jpg" alt=""&gt; myimage.jpg實際上是 /webupload/album/user1/myimage.jpg 這個檔案，而/webupload這個目錄並不在www1本機的硬碟裡面， 是在前面提到的共用儲存設備裡面。對於另一台www2來說也是 一模一樣的狀況。 也就是說www1和www2上面都做了兩件事 1. 把/webupload這個目錄掛載到共用儲存設備上的同一個目錄去。 2. 在httpd.conf裡面加上Alias指向設定。 以上這些步驟（其實只有兩個動作）可以解決使用者透過程式上傳 的檔案的同步問題。至於網站維護人員透過ftp更新的檔案要上傳 兩邊的問題，其實也可以透過類似的方式解決，在www1, www2上面 建立一個目錄掛載到共用儲存設備上的某個目錄去，然後在兩台 的httpd.conf裡面把document_root指向到該目錄去即可。 但是那時候客戶並沒有採行我的建議:( 他們的理由是 1. www1,www2的web server都共用一個儲存設備，萬一該共用 儲存設備掛了怎辦？這樣一來雖然有兩台web server，但是 整個網站都會掛點。 2. 我們沒有預算添購這個儲存設備。 第一個問題我覺得其實不是那麼嚴重，因為該儲存設備不會只有 一顆硬碟，必定是至少兩顆做Raid 1或者三顆做Raid 5甚至以上。 透過Raid可以不用太擔心這個問題。 第二個問題，無解。所以最後還是一樣，FTP兩邊丟，程式裡面兩邊存。 ╮(╯_╰)╭ 回到原po的狀況，其實你只要把你那台資料庫server當成前面 提到的共用儲存設備就可以了。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>高雄回南投 國光之旅</title><link>https://blog.wu-boy.com/2007/02/%E9%AB%98%E9%9B%84%E5%9B%9E%E5%8D%97%E6%8A%95-%E5%9C%8B%E5%85%89%E4%B9%8B%E6%97%85/</link><pubDate>Wed, 28 Feb 2007 12:52:24 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/02/%E9%AB%98%E9%9B%84%E5%9B%9E%E5%8D%97%E6%8A%95-%E5%9C%8B%E5%85%89%E4%B9%8B%E6%97%85/</guid><description>&lt;p&gt;哈哈~ 我已經回到南投了~ 不過高雄到南投 我是坐國光客運~ 其實這也是最便宜的，因為每趟只需要250元，還不錯啦，我在當兵幾乎都是坐國光客運，畢竟他也很快，在高速公路也很敢衝，時間也不會差太多，哈 &lt;a href="https://www.flickr.com/photos/appleboy/405493546/" title="Photo Sharing"&gt;&lt;img src="https://i1.wp.com/farm1.static.flickr.com/128/405493546_d756e99e16.jpg?resize=500%2C375&amp;#038;ssl=1" alt="DSCN1953" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>每年的過年，總是特別冷清</title><link>https://blog.wu-boy.com/2007/02/%E6%AF%8F%E5%B9%B4%E7%9A%84%E9%81%8E%E5%B9%B4%EF%BC%8C%E7%B8%BD%E6%98%AF%E7%89%B9%E5%88%A5%E5%86%B7%E6%B8%85/</link><pubDate>Wed, 21 Feb 2007 21:15:41 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/02/%E6%AF%8F%E5%B9%B4%E7%9A%84%E9%81%8E%E5%B9%B4%EF%BC%8C%E7%B8%BD%E6%98%AF%E7%89%B9%E5%88%A5%E5%86%B7%E6%B8%85/</guid><description>&lt;p&gt;說到過年，我想是大家最快樂的時光了，可是重我出生到目前，我感覺我們家的過年，不像是在過年，跟平常都沒什麼兩樣，就好比我們家裏每到特特殊節日，比如說父親節，母親節，我也沒趕受到有這種氣氛的感覺，都覺得跟平常日子沒什麼兩樣，就連我自己的生日，我爸媽也都是忘記，我們都沒有什麼慶祝的習慣，所以我目前也很習慣的這種生活，所以導致我過年兩邊的娘家我都不太喜歡回去，因為兩邊的覺得氣氛不太對，哈哈。 今年回鄉下，我爸爸的媽媽家，看到阿罵還蠻健康的，心理很高興，每次回家那邊都很無聊，所以都會來個照相，我跟我哥哥都很白痴亂照，還有我跟我阿姨照相，以及全家福，先來幾張我自己的自拍照&lt;/p&gt;</description></item><item><title>高鐵火車站旅行</title><link>https://blog.wu-boy.com/2007/02/%E9%AB%98%E9%90%B5%E7%81%AB%E8%BB%8A%E7%AB%99%E6%97%85%E8%A1%8C/</link><pubDate>Sat, 17 Feb 2007 03:15:10 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/02/%E9%AB%98%E9%90%B5%E7%81%AB%E8%BB%8A%E7%AB%99%E6%97%85%E8%A1%8C/</guid><description>&lt;p&gt;台灣高鐵是台灣的一大進步，為甚麼我會這樣說呢，因為這對我來說太重要了，目前我正在南投國史館台灣文獻館當任替代役，南投阿沒有火車，交通很不方便，所以我每次要返家幾乎到要花上4個小時以上才可以回到我的高雄，好久阿，想到這個時間我就很痛苦，以前就讀花蓮國立東華大學的時候，根本沒有差別，回家也需要5個小時以上，台灣高鐵我已經坐過一次了也就是在今年1月8號的時候我搭乘了第一次，那一次造成我被罰勤，&lt;a href="http://blog.wu-boy.com/2007/02/06/69" title="禮拜6要罰勤了 YA~"&gt;禮拜6要罰勤了 YA~&lt;/a&gt;，不過其實也沒差，我也解釋了我罰勤做了哪些事情，&lt;a href="http://blog.wu-boy.com/2007/02/11/70" title="這2天罰勤,我都做了什麼?"&gt;這2天罰勤,我都做了什麼?&lt;/a&gt;&lt;/p&gt;</description></item><item><title>這2天罰勤,我都做了什麼?</title><link>https://blog.wu-boy.com/2007/02/%E9%80%992%E5%A4%A9%E7%BD%B0%E5%8B%A4%E6%88%91%E9%83%BD%E5%81%9A%E4%BA%86%E4%BB%80%E9%BA%BC/</link><pubDate>Sun, 11 Feb 2007 23:14:35 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/02/%E9%80%992%E5%A4%A9%E7%BD%B0%E5%8B%A4%E6%88%91%E9%83%BD%E5%81%9A%E4%BA%86%E4%BB%80%E9%BA%BC/</guid><description>&lt;p&gt;說到罰勤，應該沒有人比我多了，在國史館台灣文獻館我罰勤是最多的，一方面我沒有榮譽假，其實我也不想要有，我對這個單位國史館台灣文獻館已經徹底的灰心了，這更奠定了我以後不走公務人員這條路了，我去私人公司磨練一下會比較好，我被罰勤的原因，請看這篇 &lt;a href="http://blog.wu-boy.com/2007/02/06/19" title="http://blog.wu-boy.com/2007/02/06/19"&gt;禮拜６要罰勤&lt;/a&gt;，不過雖然公文上面是寫要拔草，可是我好像都在規畫我的程式，跟寫搜尋系統，說到這裡，就要講到新組長，８６－９０年這５年中研院幫本館弄好一個五年光碟專案整合系統，不過這套系統很多缺點，收費，加上查詢系統很沒有人性化，加上少了１－２０００冊檔案，後續也沒有人來維護，後來我就把它的資料庫整到我的系統裡面了，所以開發了另一套系統，五年光碟專案整合系統這套系統要收費，所以將來我那套系統也將會收費，這方面不會很難，只不過要等上面的長官通過才可以，還真麻煩，什麼事情上面都要知道，主秘還對我說，我每天都給他很多surprise，哈哈，我會被他笑死，館內都不會進步，就是有你這種人在阻擋，當然我也沒在鳥你，反正我做的事情將來對館內有很大的幫助，不需要給外包公司綁死，中研院接很多計畫，所以不可能每天都幫我們做事，所以我才開發了我那套系統，目前沒有對外開放，不過今年的成果展，會秀我那套系統，我想這比第一期計畫還來的有用，這２天已經把總督府整合進來了，這部分中研院還沒整合，我每次都比中研院快一步&lt;/p&gt;</description></item><item><title>禮拜6要罰勤了 YA~</title><link>https://blog.wu-boy.com/2007/02/%E7%A6%AE%E6%8B%9C6%E8%A6%81%E7%BD%B0%E5%8B%A4%E4%BA%86-ya/</link><pubDate>Wed, 07 Feb 2007 05:14:04 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/02/%E7%A6%AE%E6%8B%9C6%E8%A6%81%E7%BD%B0%E5%8B%A4%E4%BA%86-ya/</guid><description>&lt;p&gt;哈哈&lt;del&gt;上禮拜公文下來了，國史館台灣文獻館對我發出通告了，因為我2007年1月5號跟1月8號逃兵，其實也不是什麼逃兵，只不過長官不讓我請假，然後我自己跑掉，就這樣真是單純，我是為一替代役裏面沒有榮譽假的，真是囧&lt;/del&gt;不過算了，沒關係我也不需要榮譽假，我對國家的付出，我問心無愧，館內有人希望我留下來，我的專員則是不希望我留下來，畢竟他覺的埋末一個人才，哈哈，不過我還有很多該磨練的地方，在這裡感謝館內那些挺我的人。 &lt;font color="#008080"&gt;&lt;font size="3"&gt;&lt;font face="新細明體"&gt;&lt;strong&gt;&lt;a title="Photo Sharing" href="https://www.flickr.com/photos/appleboy/380070981/"&gt;&lt;img alt="替代役罰勤" src="https://i0.wp.com/farm1.static.flickr.com/130/380070981_e526abf2e9.jpg?resize=301%2C500&amp;#038;ssl=1" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;</description></item><item><title>[blog] wordpress外掛 Def-Link</title><link>https://blog.wu-boy.com/2007/02/blog-wordpress%E5%A4%96%E6%8E%9B-def-link/</link><pubDate>Mon, 05 Feb 2007 16:11:58 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/02/blog-wordpress%E5%A4%96%E6%8E%9B-def-link/</guid><description>&lt;p&gt;這個外掛是我非常想要的，因為每次再寫文章的時候，如果要加上Link的話，很麻煩，還要自己手動增加，所以我就在網路上找到了一篇　&lt;a href="http://www.robbin.cc/vb/showthread.php?t=103"&gt;&lt;strong&gt;[文章編輯]自動轉換特定文字為鍊結&lt;/strong&gt;&lt;/a&gt;　這一篇有介紹了一些WordPress的外掛，當然我最喜歡簡單的外掛Def-Link這個外掛，重點是他很容易，又很好用&lt;/p&gt;</description></item><item><title>南投重練訓練室</title><link>https://blog.wu-boy.com/2007/02/%E5%8D%97%E6%8A%95%E9%87%8D%E7%B7%B4%E8%A8%93%E7%B7%B4%E5%AE%A4/</link><pubDate>Mon, 05 Feb 2007 13:12:48 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/02/%E5%8D%97%E6%8A%95%E9%87%8D%E7%B7%B4%E8%A8%93%E7%B7%B4%E5%AE%A4/</guid><description>&lt;p&gt;役政署是管理我們替代役的單位，隸屬於國防部下面，之前發生一些不好的關係，造成正在國史館台灣文獻館當替代役的我不能進去，所以我自己弄了一個便簽，然後拿給館整審核，然後進去役政署多認識一些人，現在又可以進去了，真開心 &lt;a href="https://www.flickr.com/photos/appleboy/380071238/" title="Photo Sharing"&gt;&lt;img alt="役政署重量訓練室" src="https://i1.wp.com/farm1.static.flickr.com/153/380071238_6623272b7f.jpg?resize=385%2C500&amp;#038;ssl=1" data-recalc-dims="1" /&gt;&lt;/a&gt; 留紀念吧，下一批替代役說不定可以用上&lt;/p&gt;</description></item><item><title>[報告] 數位典藏網站報告</title><link>https://blog.wu-boy.com/2007/02/%E5%A0%B1%E5%91%8A-%E6%95%B8%E4%BD%8D%E5%85%B8%E8%97%8F%E7%B6%B2%E7%AB%99%E5%A0%B1%E5%91%8A/</link><pubDate>Sun, 04 Feb 2007 19:11:14 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/02/%E5%A0%B1%E5%91%8A-%E6%95%B8%E4%BD%8D%E5%85%B8%E8%97%8F%E7%B6%B2%E7%AB%99%E5%A0%B1%E5%91%8A/</guid><description>&lt;ul&gt;
&lt;li&gt;由來 說到數位典藏，這是我進來&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://www.th.gov.tw"&gt;國史館台灣文獻館&lt;/a&gt; 的代表作，剛進來到這個單位，看到一樓檔案閱覽室怎麼會有一部電腦光碟塔，一部電腦接上10台光碟機，原來是要給讀者使用的阿，比如說讀者想要看哪一冊檔案，我們的工作人員就要放光碟片進去，給讀者使用，以目前我們數位典藏的數位話檔案『影像檔』已經快接近1000萬頁了，可是為什麼連的網站都沒有呢，造成數位好的檔案，沒辦法提供上網，造成想看的人要來館內來看，相當不方便，畢竟我們這裡也沒有很方便的交通，所以造成檔案已經數位話了，沒辦法公佈在網路上，有些成果，當然我們也有跟中研院合作，但是又如何呢中研院，不只有這個數位典藏的計劃，他們到處接計劃，所以造成五年計劃已經結束了，然而還沒有一點成果出來，不過目前看來中研院網站已經大致上有一個雛型了
&lt;a href="http://db1n.sinica.edu.tw/textdb/twhistBrowse/"&gt; 中研院數位典藏網站&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Ubuntu] bash 記憶指令</title><link>https://blog.wu-boy.com/2007/02/ubuntu-bash-%E8%A8%98%E6%86%B6%E6%8C%87%E4%BB%A4/</link><pubDate>Fri, 02 Feb 2007 03:10:31 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/02/ubuntu-bash-%E8%A8%98%E6%86%B6%E6%8C%87%E4%BB%A4/</guid><description>&lt;p&gt;之前 在 linux連線版有問過大家 如果讓bash 有像 freebsd cshrc的記憶功能 可以按上下鍵 就可以顯示出 以前用過的指令 比如說 我輸入 cat 然後按上 就會出現 cat /etc/bash.bashrc 結果我在 將下面寫入到　&lt;strong&gt;&lt;span style="color:green"&gt;/etc/bash.bashrc&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;bind \
 '"\C-n": history-search-forward' \
 '"\M-OB": history-search-forward' \
 '"\M-[B": history-search-forward' \
 '"\C-p": history-search-backward' \
 '"\M-OA": history-search-backward' \
 '"\M-[A": history-search-backward'&lt;/pre&gt;</description></item><item><title>[apache] mod cband 頻寬限制</title><link>https://blog.wu-boy.com/2007/01/apache-mod-cband-%E9%A0%BB%E5%AF%AC%E9%99%90%E5%88%B6/</link><pubDate>Mon, 22 Jan 2007 16:09:27 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/01/apache-mod-cband-%E9%A0%BB%E5%AF%AC%E9%99%90%E5%88%B6/</guid><description>&lt;p&gt;這個MODULE相當好用,這個可以用來解決架設APACHE頻寬問題 安裝方式:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For Linux: 先去下載軟體: mod_cband 目前釋出到 0.9.7.5版 下載到 /tmp/ 資料夾裡面 解壓縮: tar -zxvf mod-cband-0.9.7.5.tgz 如果你有安裝 apsx2的話 請用下面安裝 $ cd mod-cband-0.9.7.5 $ ./configure $ make $ make install 如果沒有安裝 apsx2的話 請用下面安裝 重新編譯 configure –add-module=../mod-cband/mod_cband.c –enable-shared=cband –enable-module=so 設定方法: * 修改httpd.conf 加上2行CBandScoreFlushPeriod 1 CBandRandomPulse On mkdir /var/www/scoreboard chown apache:apache /var/www/scoreboard * 設定 VirtualHost &amp;lt;VirtualHost 1.2.3.4&amp;gt; ServerName &lt;a href="https://www.example.com"&gt;www.example.com&lt;/a&gt; ServerAdmin &lt;a href="mailto:webmaster@example.com"&gt;webmaster@example.com&lt;/a&gt; DocumentRoot /var/www CBandSpeed 1024 10 30 CBandRemoteSpeed 20kb/s 3 3 &lt;/VirtualHost&gt; 說明:# 100MB virtualhost bandwidth limit CBandLimit 100M # Maximal 1024kbps speed for this virtualhost # Maximal 10 requests per second for this virtualhost # Maximal 30 open connections for this virtualhost限制該網域總頻寬跟連線數目 CBandSpeed 1024 10 30# Maximal 10kB/s speed, 3 requests/s and 2 open connections for any remote client CBandRemoteSpeed 10kb/s 3 2 4個禮拜清除設定一次# a period of time after which the scoreboard will be cleared (4 weeks) CBandPeriod 4W # define ‘class_1′ &lt;CBandClass class_1&gt; CBandClassDst 217.172.231.67 CBandClassDst 127/8 CBandClassDst 192.168.0.0/24 CBandClassDst 10.0.0.20 &lt;/CBandClass&gt; # define ‘class_2′ &lt;CBandClass class_2&gt; CBandClassDst 192.168.100.100 CBandClassDst 153.19/16 &lt;/CBandClass&gt; &lt;CBandUser dembol&gt; CBandUserLimit 1000000 CBandUserExceededURL &lt;a href="http://edns.pl/bandwidth"&gt;http://edns.pl/bandwidth&lt;/a&gt;_exceeded.html CBandUserScoreboard /home/dembol/write/user.dembol.scoreboard# 500MB limit for ‘class_2′ CBandUserClassLimit class_2 500000 &lt;/CBandUser&gt; 實作部份: &lt;CBandClass local_class&gt; CBandClassDst 127/8 CBandClassDst 192.168.0.0/24 &lt;/CBandClass&gt; &amp;lt;VirtualHost *:80&amp;gt; ServerAdmin &lt;a href="mailto:appleboy.tw@gmail.com"&gt;appleboy.tw@gmail.com&lt;/a&gt; DocumentRoot /var/www/html ServerName nas.th.gov.tw ErrorLog logs/nas.th.gov.tw-error_log CustomLog logs/nas.th.gov.tw-access_log common CBandSpeed 1024 200 200 CBandRemoteSpeed 1024kb/s 50 50 CBandClassRemoteSpeed local_class 1000Gbps 1000 1000 CBandLimit 10G CBandPeriod 1W CBandScoreboard /var/run/apache2/default.scoreboard &lt;/VirtualHost&gt; 如果要看SERVER-Status的話 也可以設定在httpd.conf就好 # # mod_cband # &amp;lt;Location /cband-status&amp;gt; SetHandler cband-status &lt;/Location&gt;&lt;/p&gt;</description></item><item><title>[Apache] 防盜連，抓圖</title><link>https://blog.wu-boy.com/2007/01/apache-%E9%98%B2%E7%9B%9C%E9%80%A3%EF%BC%8C%E6%8A%93%E5%9C%96-2/</link><pubDate>Fri, 19 Jan 2007 02:59:14 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/01/apache-%E9%98%B2%E7%9B%9C%E9%80%A3%EF%BC%8C%E6%8A%93%E5%9C%96-2/</guid><description>&lt;p&gt;目前管理 &lt;a href="http://www.th.gov.tw"&gt;國史館-台灣文獻館&lt;/a&gt;，幾台檔案伺服器 裝了 快 1000萬的數位話檔案，如果將來對外開放，將會造成大量被下載 所以我列了下面幾個保護裝置，目前用在館內，我弄了幾個軟體去下載，果然已經被阻擋了 網頁伺服器要支援REWRITE功能&lt;/p&gt;</description></item><item><title>SSH SCP 速度</title><link>https://blog.wu-boy.com/2007/01/ssh-scp-%E9%80%9F%E5%BA%A6/</link><pubDate>Fri, 12 Jan 2007 06:33:41 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/01/ssh-scp-%E9%80%9F%E5%BA%A6/</guid><description>&lt;p&gt;好快阿 這是我用過最快的了~&lt;/p&gt;
&lt;div style="width:500px;text-align:right;"&gt;
 &lt;a href="http://beta.zooomr.com/photos/appleboy/632070/" title="Zooomr Photo Sharing :: Photo Sharing"&gt;&lt;img src="https://i1.wp.com/static.zooomr.com/images/632070_2c2b2633ea.jpg?resize=500%2C282" alt="snapshot2" border="0" style="border:1px solid #000;" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;span style="float:left;"&gt;snapshot2&lt;/span&gt; Hosted on &lt;strong&gt;Zooom&lt;span style="color:#9EAE15;"&gt;r&lt;/span&gt;&lt;/strong&gt;
&lt;/div&gt; 哈哈，雖然說在同一個hub底下 這算是蠻正常的 哈哈~ 11.1MB的速度在跑 不是蓋的</description></item><item><title>[2007年跨年]台北101大樓煙火</title><link>https://blog.wu-boy.com/2007/01/2007%E5%B9%B4%E8%B7%A8%E5%B9%B4%E5%8F%B0%E5%8C%97101%E5%A4%A7%E6%A8%93%E7%85%99%E7%81%AB/</link><pubDate>Sun, 07 Jan 2007 06:15:11 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/01/2007%E5%B9%B4%E8%B7%A8%E5%B9%B4%E5%8F%B0%E5%8C%97101%E5%A4%A7%E6%A8%93%E7%85%99%E7%81%AB/</guid><description>&lt;p&gt;會不會太漂亮？ &lt;a href="https://www.flickr.com/photos/appleboy/348647202/" title="Photo Sharing"&gt;&lt;img src="https://i2.wp.com/farm1.static.flickr.com/150/348647202_33503c3c63_o.jpg?resize=510%2C800&amp;#038;ssl=1" alt="image011" data-recalc-dims="1" /&gt;&lt;/a&gt; &lt;a href="https://www.flickr.com/photos/appleboy/348647139/" title="Photo Sharing"&gt;&lt;img src="https://i2.wp.com/farm1.static.flickr.com/142/348647139_e0d6716925_o.jpg?resize=510%2C800&amp;#038;ssl=1" alt="image010" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[文章] 剛剛在網路看到的一篇文章</title><link>https://blog.wu-boy.com/2007/01/%E6%96%87%E7%AB%A0-%E5%89%9B%E5%89%9B%E5%9C%A8%E7%B6%B2%E8%B7%AF%E7%9C%8B%E5%88%B0%E7%9A%84%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0/</link><pubDate>Sat, 06 Jan 2007 10:15:02 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/01/%E6%96%87%E7%AB%A0-%E5%89%9B%E5%89%9B%E5%9C%A8%E7%B6%B2%E8%B7%AF%E7%9C%8B%E5%88%B0%E7%9A%84%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0/</guid><description>&lt;p&gt;剛剛到一篇，如何讓自己的老闆認為自己很認真&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;■電腦：除非下班，否則請永遠保持開機狀態，螢幕顯示內容以較複雜的試算表格為佳 嘿嘿關於這點，我有做到，如下 &lt;a href="https://www.flickr.com/photos/appleboy/339401086/" title="Photo Sharing"&gt;&lt;img src="https://i2.wp.com/farm1.static.flickr.com/140/339401086_4a5b967054.jpg?resize=500%2C400&amp;#038;ssl=1" alt="Kubuntu" data-recalc-dims="1" /&gt;&lt;/a&gt; &lt;a href="https://www.flickr.com/photos/appleboy/325838356/" title="Photo Sharing"&gt;&lt;img src="https://i1.wp.com/farm1.static.flickr.com/136/325838356_551106bd90.jpg?resize=500%2C400&amp;#038;ssl=1" alt="Ubuntu Desktop KDE" data-recalc-dims="1" /&gt;&lt;/a&gt; &lt;a href="https://www.flickr.com/photos/appleboy/303330709/" title="Photo Sharing"&gt;&lt;img src="https://i2.wp.com/farm1.static.flickr.com/113/303330709_95baa65e71.jpg?resize=500%2C375&amp;#038;ssl=1" alt="My company Desktop" data-recalc-dims="1" /&gt;&lt;/a&gt; 這是kde桌面～&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[文獻館]搞定了LTO – 3580</title><link>https://blog.wu-boy.com/2007/01/%E6%90%9E%E5%AE%9A%E4%BA%86lto-3580/</link><pubDate>Mon, 01 Jan 2007 08:22:45 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2007/01/%E6%90%9E%E5%AE%9A%E4%BA%86lto-3580/</guid><description>&lt;p&gt;我用館內新買的伺服器，安裝了3個作業系統 &lt;a href="https://www.flickr.com/photos/appleboy/340499745/" title="Photo Sharing"&gt;&lt;img src="https://i2.wp.com/farm1.static.flickr.com/161/340499745_7a015097a8.jpg?resize=500%2C375&amp;#038;ssl=1" alt="DSCF0011" data-recalc-dims="1" /&gt;&lt;/a&gt; &lt;a href="https://www.flickr.com/photos/appleboy/340501055/" title="Photo Sharing"&gt;&lt;img src="https://i1.wp.com/farm1.static.flickr.com/148/340501055_bf26e3c170.jpg?resize=500%2C375&amp;#038;ssl=1" alt="DSCF0001" data-recalc-dims="1" /&gt;&lt;/a&gt; &lt;a href="https://www.flickr.com/photos/appleboy/340500930/" title="Photo Sharing"&gt;&lt;img src="https://i0.wp.com/farm1.static.flickr.com/137/340500930_da06d0d0fc.jpg?resize=500%2C375&amp;#038;ssl=1" alt="DSCF0002" data-recalc-dims="1" /&gt;&lt;/a&gt; Windows 2003 Server, Windows XP, Windows 2000 Server ，還好最後終於給我搞定了 2003的driver 如下 &lt;a href="http://www-1.ibm.com/support/docview.wss?rs=0&amp;amp;context=HW21A&amp;amp;dc=D400&amp;amp;q1=LTO+3580&amp;amp;uid=ssg1S4000055&amp;amp;loc=zh_TW&amp;amp;cs=utf-8&amp;amp;cc=tw&amp;amp;lang=zh+en"&gt;點選我&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Vim 功能介紹</title><link>https://blog.wu-boy.com/2006/12/vim-%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%B4%B9/</link><pubDate>Sat, 30 Dec 2006 13:58:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/12/vim-%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%B4%B9/</guid><description>&lt;p&gt;Vim 功能時在太多了，搜尋取代，切換視窗，多重編輯都可以 1.如果想複製整篇檔案的文字，利用下面指令&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;ggVGy&lt;/pre&gt; 2.切割畫面 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;:sp filename 會橫項切割兩個視窗來開檔案
:vsp filename 是直項切割視窗.

Ctrl+w 2次則會切換到令一個視窗

fllow mode 

:set scb 則會紀錄一邊檔案，記的要把一邊檔案按下page down才可以 這樣相差一頁，才是你想要的&lt;/pre&gt; 3.去除 ^H ^M 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;man gcc | col -b &gt; gcc.txt

vi 後 :1,$s/^v^H//g (^v = ctrl + v, ^H = ctrl+h)

sed -i -e 's/^v^H//g' file&lt;/pre&gt;</description></item><item><title>Ubuntu Edgy Release KDE 桌面環境</title><link>https://blog.wu-boy.com/2006/12/ubuntu-edgy-release-kde-%E6%A1%8C%E9%9D%A2%E7%92%B0%E5%A2%83/</link><pubDate>Mon, 18 Dec 2006 08:17:57 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/12/ubuntu-edgy-release-kde-%E6%A1%8C%E9%9D%A2%E7%92%B0%E5%A2%83/</guid><description>&lt;p&gt;剛剛安裝新的 ubuntu 作業系統 Edgy Release 然後順手安裝了 kde 桌面環境 &lt;a href="https://www.flickr.com/photos/appleboy/325838356/" title="Photo Sharing"&gt;&lt;img src="https://i1.wp.com/static.flickr.com/136/325838356_551106bd90.jpg?resize=500%2C400" alt="Ubuntu Desktop KDE" data-recalc-dims="1" /&gt;&lt;/a&gt; 還蠻漂亮的~ 哈哈 宿舍用 gnome 公司用 kde還不賴 2套都可玩看看~&lt;/p&gt;</description></item><item><title>[Linux] 在 windows底下讀寫linux</title><link>https://blog.wu-boy.com/2006/12/linux-%E5%9C%A8-windows%E5%BA%95%E4%B8%8B%E8%AE%80%E5%AF%ABlinux/</link><pubDate>Fri, 15 Dec 2006 07:16:10 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/12/linux-%E5%9C%A8-windows%E5%BA%95%E4%B8%8B%E8%AE%80%E5%AF%ABlinux/</guid><description>&lt;p&gt;剛剛在ptt看到的，一連串討論 □ XP 認得 ext2/ext3 磁區嗎 ? 裡面有很多文章 寫的不錯，可以提供出來 問題：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;想問一下,我有一個移動式硬碟 60G 所以只能format 成 NTFS or ext2/ext3 而在 Linux 下, 目前支援 NTFS 讀寫可能要另外掛 package… 所以想問,那 Windows XP 是否支援 ext2 / ext3 ext3好像不行, 因為剛剛在 Linux 下 format成 ext3了 並備份了一些東東,到進到了Windows XP底下好像認不得了, 想問,ext2 在 Windows XP 底下,OK嗎… xp認得嗎? 解法如下 作者 &lt;a href="mailto:wyocbu@kkcity.com.tw"&gt;wyocbu@kkcity.com.tw&lt;/a&gt; (wyocbu),&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[Linux] cwRsync [rsync for windows] SSH 加密異地備份</title><link>https://blog.wu-boy.com/2006/12/linux-cwrsync-rsync-for-windows-ssh-%E5%8A%A0%E5%AF%86%E7%95%B0%E5%9C%B0%E5%82%99%E4%BB%BD/</link><pubDate>Fri, 15 Dec 2006 03:35:47 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/12/linux-cwrsync-rsync-for-windows-ssh-%E5%8A%A0%E5%AF%86%E7%95%B0%E5%9C%B0%E5%82%99%E4%BB%BD/</guid><description>&lt;p&gt;這個我找了好久～因為館內用的系統2003server跟前端系統linux，2個是不同的作業系統 但是我每天都有備份linux資料，我想同步到win的server上面，但是這樣就要在win的機器上面架設rsync伺服器跟rsync client套件 所以我找了很久 終於找到了 cwRsync 有client端 跟server端 跟ssh 加密 open ssh server &lt;a href="http://www.itefix.no/phpws/index.php?module=pagemaster&amp;amp;PAGE_user_op=view_page&amp;amp;PAGE_id=6&amp;amp;MMN_position=23:23"&gt;cwRsync – Rsync for Windows&lt;/a&gt; 請點選中間的 Download cwRsync Server &lt;a href="https://www.flickr.com/photos/appleboy/322694644/" title="Photo Sharing"&gt;&lt;img src="https://i1.wp.com/static.flickr.com/133/322694644_095d6d4f70_o.jpg?resize=488%2C107" alt="1" data-recalc-dims="1" /&gt;&lt;/a&gt; 下載之後解壓縮，裡面會有一個執行檔，在安裝即可 安裝好之後，去程式集打開 cwrsync server -&amp;gt; 05. Start a Unix BASH Shell 會出現底下畫面 &lt;a href="https://www.flickr.com/photos/appleboy/322699548/" title="Photo Sharing"&gt;&lt;img src="https://i2.wp.com/static.flickr.com/125/322699548_9b0e6f0dc2.jpg?resize=500%2C322" alt="2" data-recalc-dims="1" /&gt;&lt;/a&gt; 執行之後，會出現一個 cmd 視窗但字元卻是 $ 的。&lt;/p&gt;</description></item><item><title>[Linux] 備份策略～shell script</title><link>https://blog.wu-boy.com/2006/12/linux-%E5%82%99%E4%BB%BD%E7%AD%96%E7%95%A5%EF%BD%9Eshell-script/</link><pubDate>Sun, 10 Dec 2006 08:16:52 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/12/linux-%E5%82%99%E4%BB%BD%E7%AD%96%E7%95%A5%EF%BD%9Eshell-script/</guid><description>&lt;p&gt;※ 引述《wenshian.bbs@bbs.wretch.cc (小拓)》之銘言： &amp;gt; 備份檔案時是不是只能每天整個資料夾做備份?! &amp;gt; 可以做到哪些檔案有更新就把那些更新加進備份檔裡面嗎? &amp;gt; 我也想來試試 由linux備份到windows有什麼好建議嗎? &amp;gt; 最好可以不需要FTP上傳,不過如果難易度差很多我還是會考慮~= = 你可以先把 win的硬碟 mount到 linux上面 這樣就不需要用ftp上傳了 當然希望硬碟是fat32格式 這樣你就可以每天備份東西到 win的系統上面了～ 你說 “可以做到哪些檔案有更新就把那些更新加進備份檔裡面嗎?” 我覺得不需要這樣 你可以每天備份 用日期當作檔名 ，然後備份7天 只要超過7天的資料在砍掉，這樣你的備份檔 只會有7天以內的資料&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#!/bin/bash
date=`date +%Y-%m-%d`
RETENTION_PERIOD="7"
HEADER="Backup data"
remove_oldfiles(){
 echo "Removing directory $1 files older than $RETENTION_PERIOD days" | wall
 find $1 -type f -mtime +$2 -exec rm '{}' \;
}

BACKUPDIR="/home/appleboy /var/www/html"
back_www_dir="/backup01/www_data"

#
# 開始備份
#

cd $back_www_dir

for TARGET in $BACKUPDIR
do
 echo "System backup on $TARGET" | wall
 BASENAME=`basename $TARGET`
 tar -zcvf ${BASENAME}-${date}.tar.gz $TARGET 1&gt;/dev/null
 sleep 2
done

#
# 刪除7天前的資料
#
remove_oldfiles $back_www_dir $RETENTION_PERIOD
&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://nas.th.gov.tw/~appleboy/program/backup.txt"&gt;http://nas.th.gov.tw/~appleboy/program/backup.txt&lt;/a&gt; &lt;a href="http://blog.wu-boy.com/wp-content/uploads/2007/03/backup.txt"&gt;backup script&lt;/a&gt;{#p79}&lt;/p&gt;</description></item><item><title>MRTG Server performace</title><link>https://blog.wu-boy.com/2006/12/mrtg-server-performace/</link><pubDate>Tue, 05 Dec 2006 14:15:39 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/12/mrtg-server-performace/</guid><description>&lt;p&gt;每次看到 每5分鐘執行 mrtg 的時候， 以root身份去執行它，會使系統瞬間負載增加 就算在好的電腦，我發現在mrtg畫圖的瞬間，還是會使系統負擔，要如何避免這樣呢&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The RunAsDaemon keyword enables daemon mode operation. The purpose of daemon mode is that MRTG is launched once and not repeatedly (as it is with cron). This behavior saves computing resourses as loading and parsing of configuration files happens only once. Using daemon mode MRTG itself is responible for timing the measurement intervals. Therfore its important to set the Interval keyword to an apropiate value. 那就是在 cfg檔案裏面增加&lt;/p&gt;</description></item><item><title>[Apache] mod_rewrite 實做 防盜圖</title><link>https://blog.wu-boy.com/2006/12/apache-mod_rewrite-%E5%AF%A6%E5%81%9A/</link><pubDate>Mon, 04 Dec 2006 02:29:28 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/12/apache-mod_rewrite-%E5%AF%A6%E5%81%9A/</guid><description>&lt;p&gt;PTT 的 php版 有人問到&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如何在URL隱藏’.php’ 有時候會看到一些網站的URL沒有後面的.php .jsp .xxx 自己加上去反而無法開啟 像 &lt;a href="http://www.google.com.tw/search?hl=zh-TW&amp;amp;q=abc"&gt;http://www.google.com.tw/search?hl=zh-TW&amp;amp;q=abc&lt;/a&gt; 讓人無法得知該網站是使用哪種語言開發 請問要如何隱藏 我想這對網站的安全性應該有一些幫助 謝謝回覆 以下是我的回覆： 這是利用 mod_rewrite 作法達到的，其實不只隱藏 後面的php而已，還可以你隨便取呢 在根目錄底下新增 .htaccess[這個必須你的server有支援才行，有的不會讓你新增此檔 ] 然後在該檔裏面 寫下&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[Linux] 安裝使用 Webalizer</title><link>https://blog.wu-boy.com/2006/12/linux-%E5%AE%89%E8%A3%9D%E4%BD%BF%E7%94%A8-webalizer/</link><pubDate>Sun, 03 Dec 2006 10:05:00 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/12/linux-%E5%AE%89%E8%A3%9D%E4%BD%BF%E7%94%A8-webalizer/</guid><description>&lt;p&gt;系統：CentOS 4.4 搜尋 Webalizer&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[root@NAS][~][17:52:51]# yum search webalizer Searching Packages: Setting up repositories Reading repository metadata in from local files webalizer.x86_64 2.01_10-25 base Matched from: webalizer The Webalizer is a Web server log analysis program. It is designed to scan Web server log files in various formats and produce usage statistics in HTML format for viewing through a browser. It produces professional looking graphs which make analyzing when and where your Web traffic is coming from easy. &lt;a href="http://www.mrunix.net/webalizer/"&gt;http://www.mrunix.net/webalizer/&lt;/a&gt; 設定檔放在 /etc/webalizer.conf 我的設定如下&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;LogFile /var/log/httpd/access_log OutputDir /var/www/html/webalizer HistoryName /var/lib/webalizer/webalizer.hist Incremental yes IncrementalName /var/lib/webalizer/webalizer.current HostName NAS.th.gov.tw PageType htm* PageType cgi PageType php PageType shtml DNSCache /var/lib/webalizer/dns_cache.db DNSChildren 10 Quiet yes FoldSeqErr yes HideURL *.gif HideURL *.GIF HideURL *.jpg HideURL *.JPG HideURL *.png HideURL *.PNG HideURL *.ra SearchEngine yahoo.com p= SearchEngine altavista.com q= SearchEngine google.com q= SearchEngine eureka.com q= SearchEngine lycos.com query= SearchEngine hotbot.com MT= SearchEngine msn.com MT= SearchEngine infoseek.com qt= SearchEngine webcrawler searchText= SearchEngine excite search= SearchEngine netscape.com search= SearchEngine mamma.com query= SearchEngine alltheweb.com query= SearchEngine northernlight.com qr=&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[分享] KVM 「可接4部電腦」</title><link>https://blog.wu-boy.com/2006/12/%E5%88%86%E4%BA%AB-kvm-%E3%80%8C%E5%8F%AF%E6%8E%A54%E9%83%A8%E9%9B%BB%E8%85%A6%E3%80%8D/</link><pubDate>Fri, 01 Dec 2006 07:16:13 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/12/%E5%88%86%E4%BA%AB-kvm-%E3%80%8C%E5%8F%AF%E6%8E%A54%E9%83%A8%E9%9B%BB%E8%85%A6%E3%80%8D/</guid><description>&lt;p&gt;前天剛訂購的KVM已經到了，剛剛裝上去已經可以使用了～哈 我賣家是 &lt;a href="http://tw.f2.page.bid.yahoo.com/tw/auction/b30209179?r=1006149680"&gt;http://tw.f2.page.bid.yahoo.com/tw/auction/b30209179?r=1006149680&lt;/a&gt; 先來給大家看看盒子（正面） &lt;a href="https://www.flickr.com/photos/appleboy/310905799/" title="Photo Sharing"&gt;&lt;img src="https://i2.wp.com/static.flickr.com/109/310905799_91ce95fb72.jpg?resize=500%2C375" alt="DSCF0063" data-recalc-dims="1" /&gt;&lt;/a&gt; （反面） &lt;a href="https://www.flickr.com/photos/appleboy/310905774/" title="Photo Sharing"&gt;&lt;img src="https://i0.wp.com/static.flickr.com/119/310905774_ed9f910a7f.jpg?resize=500%2C375" alt="DSCF0064" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Linux] Mrtg 實做 war3 線上人數統計</title><link>https://blog.wu-boy.com/2006/11/linux-mrtg-%E5%AF%A6%E5%81%9A-war3-%E7%B7%9A%E4%B8%8A%E4%BA%BA%E6%95%B8%E7%B5%B1%E8%A8%88/</link><pubDate>Tue, 28 Nov 2006 09:13:34 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/11/linux-mrtg-%E5%AF%A6%E5%81%9A-war3-%E7%B7%9A%E4%B8%8A%E4%BA%BA%E6%95%B8%E7%B5%B1%E8%A8%88/</guid><description>&lt;p&gt;應大家觀眾要求，來寫一下教學 當然我不想怎麼安裝mrtg了，搜尋一下本站就會找到教學 相信mrtg最主要是他的設定檔 cfg檔，先來看看 這個cfg檔怎麼寫&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;# Created by
# Appleboy 2006/09/25

WorkDir: /usr/local/www/data-dist
Language: big5

Target[bnet_person]: `/usr/local/etc/mrtg/mrtg.person.sh`
MaxBytes[bnet_person]: 10000
Options[bnet_person]: gauge, nopercent, growright
YLegend[bnet_person]: Online Users
ShortLegend[bnet_person]: 人
LegendI[bnet_person]: &amp;nbsp; 線上人數 :
LegendO[bnet_person]: &amp;nbsp; 遊戲數目 :
Title[bnet_person]: 小熊戰網 上線人數統計表
&lt;/pre&gt; 先來解釋 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;WorkDir: /usr/local/www/data-dist&lt;/pre&gt; 這個是來存放mrtg統計圖的資料夾，請對應到相關可以放html的資料夾 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;Target[bnet_person]: `/usr/local/etc/mrtg/mrtg.person.sh`&lt;/pre&gt; 以下是 mrtg.person.sh 這個檔案 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;#!/bin/sh
# 這個程式主要在計算有多少人以 bnetd 的方式連線進我們的主機！

# 1. 計算線上的數目
cat /~pvpgn/server.dat | grep "Users" | cut -d "=" -f2

# 2. 計算遊戲數目
cat /~pvpgn/server.dat | grep "Games" | cut -d "=" -f2

# 3. 輸出時間咚咚
UPtime=`/usr/bin/uptime | awk '{print $3 " " $4 " " $5}'`
echo $UPtime
echo bnet.dearbear.net
&lt;/pre&gt; 要先來看看war3在啟動的時候，會把線上人數 寫在 server.dat 檔案裏面，下面是該檔案的模式 
&lt;blockquote&gt;
&lt;p&gt;[STATUS] Version=1.8.0 Uptime=9 hours 20 minutes 0 seconds Games=62 Users=323 Channels=8 UserAccounts=1909 所以我們最主要需要下面這2個值&lt;/p&gt;</description></item><item><title>[Linux] CentOS 4.4 安裝過程 NAS 2U Server</title><link>https://blog.wu-boy.com/2006/11/linux-centos-44-%E5%AE%89%E8%A3%9D%E9%81%8E%E7%A8%8B-nas-2u-server/</link><pubDate>Sun, 26 Nov 2006 17:17:01 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/11/linux-centos-44-%E5%AE%89%E8%A3%9D%E9%81%8E%E7%A8%8B-nas-2u-server/</guid><description>&lt;p&gt;新主機 2u nas server&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2顆amd Opteron 2.2ghz&lt;/li&gt;
&lt;li&gt;機架高度2u&lt;/li&gt;
&lt;li&gt;2*1GB RAM ECC DDR400&lt;/li&gt;
&lt;li&gt;SCSI硬碟 ULTRA320磁碟陣列卡支援RAID0，1，5，1000RPM 72GB4顆&lt;/li&gt;
&lt;li&gt;網路卡10/100/ 1000 Mbps介面卡2個&lt;/li&gt;
&lt;li&gt;主機板型號&lt;span class="mb-model-name" style="color: #1a1a1a"&gt;GA-7A8DRH &lt;a title="http://www.gigabyte.com.tw/Products/Networking/Products_Spec.aspx?ProductID=1063" href="http://www.gigabyte.com.tw/Products/Networking/Products_Spec.aspx?ProductID=1063"&gt;連結&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/appleboy/307475431/" title="Photo Sharing"&gt;&lt;img alt="主機照片" src="https://i1.wp.com/static.flickr.com/122/307475431_442e5f0226.jpg?resize=500%2C375" data-recalc-dims="1" /&gt;&lt;/a&gt; 上面那台，下面那台也是NAS WIN2003 SERVER&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;安裝步驟：&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;利用光碟開機，鍵入linux dd&lt;a href="https://www.flickr.com/photos/appleboy/307475117/" title="Photo Sharing"&gt;&lt;img src="https://i1.wp.com/static.flickr.com/113/307475117_21612aa6fd.jpg?resize=500%2C375" alt="DSCF0059" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[Ubuntu] 安裝 StarDict 星際譯王 以及 字典檔</title><link>https://blog.wu-boy.com/2006/11/ubuntu-%E5%AE%89%E8%A3%9D-stardict-%E6%98%9F%E9%9A%9B%E8%AD%AF%E7%8E%8B-%E4%BB%A5%E5%8F%8A-%E5%AD%97%E5%85%B8%E6%AA%94/</link><pubDate>Sat, 25 Nov 2006 23:18:51 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/11/ubuntu-%E5%AE%89%E8%A3%9D-stardict-%E6%98%9F%E9%9A%9B%E8%AD%AF%E7%8E%8B-%E4%BB%A5%E5%8F%8A-%E5%AD%97%E5%85%B8%E6%AA%94/</guid><description>&lt;p&gt;如何在Ubuntu 底下安裝字典呢 先去搜尋 &lt;a href="http://blog.wu-boy.com/wp-content/uploads/2007/04/stardictsh.txt"&gt;StarDict Shell Script&lt;/a&gt;{#p94}&lt;a href="http://blog.wu-boy.com/wp-content/uploads/2007/04/stardictsh.txt"&gt;StarDict Shell Script&lt;/a&gt;{#p94}&lt;a href="http://blog.wu-boy.com/wp-content/uploads/2007/04/stardictsh.txt"&gt;StarDict Shell Script&lt;/a&gt;{#p94} 套件&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[root@appleboy-dorm][~][21:59:39]# apt-cache search stardict sdcv – StarDict Console Version stardict – International dictionary for GNOME 2 stardict-common – International dictionary for GNOME 2 – data files stardict-tools – The dictionary conversion tools of stardict 然後安裝&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;apt-get install stardict-* 安裝好之後就可以在 應用程式-&amp;gt;附屬應用程式-&amp;gt;星際譯王 但是安裝好之後沒有任何字典檔,所以請自行到網路上下載 &lt;a href="http://stardict.sourceforge.net/Dictionaries_zh_TW.php"&gt;http://stardict.sourceforge.net/Dictionaries_zh_TW.php&lt;/a&gt; 下載軟體後 請把他解壓縮到 /usr/share/stardict/dic/ 解壓縮的目錄應該有 *.dz *.idx *.ifo 這3個檔案 重新啟動該軟體 就可以使用了 Update: 2007.04.16 有人有寫好script了，底下給大家參考 &lt;a href="http://blog.wu-boy.com/wp-content/uploads/2007/04/stardictsh.txt"&gt;StarDict Shell Script&lt;/a&gt;{#p94}&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>[Linux,FreeBSD] scp 上傳跟下載</title><link>https://blog.wu-boy.com/2006/11/linuxfreebsd-scp-%E4%B8%8A%E5%82%B3%E8%B7%9F%E4%B8%8B%E8%BC%89/</link><pubDate>Sat, 25 Nov 2006 20:43:17 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/11/linuxfreebsd-scp-%E4%B8%8A%E5%82%B3%E8%B7%9F%E4%B8%8B%E8%BC%89/</guid><description>&lt;p&gt;上傳：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;scp -r -P 2500 /etc/crontab &lt;a href="mailto:appleboy@hostname.com"&gt;appleboy@hostname.com&lt;/a&gt;:/home/appleboy/ 下載：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;scp -r -P 2500 &lt;a href="mailto:appleboy@hostname.com"&gt;appleboy@hostname.com&lt;/a&gt;:/home/appleboy/crazy.sql . -r 遞迴 下載 -P ssh port 後面的點 . 你可以換成你想下載到你的哪個目錄&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>幸福專賣 NO.24</title><link>https://blog.wu-boy.com/2006/11/test/</link><pubDate>Sat, 25 Nov 2006 03:41:54 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/11/test/</guid><description>&lt;p&gt;這個還不錯看，講的也很實際~ 哈哈~ 看看就好，我丟給我同學看，他說它看了很傷心 好像剛跟女朋友分手~~~ — 題外話，如何讓wp支援youtube播放 1.- In admin panel, deactivate “Use the visual rich editor when writing” in “User” – “your profile”.. 2.- Deactivate “WordPress should correct invalidly nested XHTML automatically ” in “options” – “writing”. 這是我在官方找到的 &lt;a href="http://wordpress.org/support/topic/65239?replies=9"&gt;http://wordpress.org/support/topic/65239?replies=9&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[CentOS 4.4] 架設 rsync 伺服器</title><link>https://blog.wu-boy.com/2006/11/centos-44-%E6%9E%B6%E8%A8%AD-rsync-%E4%BC%BA%E6%9C%8D%E5%99%A8/</link><pubDate>Thu, 23 Nov 2006 12:23:11 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/11/centos-44-%E6%9E%B6%E8%A8%AD-rsync-%E4%BC%BA%E6%9C%8D%E5%99%A8/</guid><description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;安裝方式：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;先檢查是否有安裝rsync&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;yum list installed | grep rsync&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rsync.x86_64 2.6.3-1 installed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class="postbody"&gt;vi /etc/xinetd.d/rsync &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class="postbody"&gt;service rsync&lt;/span&gt; &lt;span class="postbody"&gt;{&lt;/span&gt; &lt;span class="postbody"&gt;disable = yes&lt;/span&gt; &lt;span class="postbody"&gt;socket_type = stream&lt;/span&gt; &lt;span class="postbody"&gt;wait = no&lt;/span&gt; &lt;span class="postbody"&gt;user = root&lt;/span&gt; &lt;span class="postbody"&gt;server = /usr/bin/rsync&lt;/span&gt; &lt;span class="postbody"&gt;server_args = –daemon&lt;/span&gt; &lt;span class="postbody"&gt;log_on_failure += USERID&lt;/span&gt; &lt;span class="postbody"&gt;}&lt;/span&gt;
&lt;span class="postbody"&gt;disable = yes&lt;/span&gt; 改成 &lt;span class="postbody"&gt;disable = no&lt;/span&gt;
然後重新啟動xinetd
/etc/init.d/xinetd restart&lt;span class="postbody" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="postbody"&gt;vi /etc/rsyncd.conf&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="postbody"&gt;[backup] path = /backup02 auth users = admin uid = root gid = root secrets file = /etc/rsyncd.secrets read only = no&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span class="postbody"&gt;[主機代號:自訂] path = 備份資料放置的路徑 auth users = 定義援權的帳號 uid = 應是執行時的uid gid = 應是執行時的gid secrets file = 認證密碼檔的位置 read only = 是否唯讀&lt;/span&gt;&lt;/p&gt;</description></item><item><title>電腦修好了～國史館停車場</title><link>https://blog.wu-boy.com/2006/11/%E9%9B%BB%E8%85%A6%E4%BF%AE%E5%A5%BD%E4%BA%86%EF%BD%9E%E5%9C%8B%E5%8F%B2%E9%A4%A8%E5%81%9C%E8%BB%8A%E5%A0%B4/</link><pubDate>Thu, 23 Nov 2006 11:28:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/11/%E9%9B%BB%E8%85%A6%E4%BF%AE%E5%A5%BD%E4%BA%86%EF%BD%9E%E5%9C%8B%E5%8F%B2%E9%A4%A8%E5%81%9C%E8%BB%8A%E5%A0%B4/</guid><description>&lt;p&gt;昨天去草屯順發，買了連鈺電子的power 350W &lt;a href="https://www.flickr.com/photos/appleboy/304051076/" title="Photo Sharing"&gt;&lt;img alt="DSCF0027" src="https://i2.wp.com/static.flickr.com/101/304051076_26520c3b13.jpg?resize=500%2C362" data-recalc-dims="1" /&gt;&lt;/a&gt; &lt;a href="https://www.flickr.com/photos/appleboy/304051101/" title="Photo Sharing"&gt;&lt;img alt="連鈺電子power" src="https://i2.wp.com/static.flickr.com/117/304051101_231b23f203.jpg?resize=263%2C500" data-recalc-dims="1" /&gt;&lt;/a&gt; 經過測試果然因為power的問題，才讓電腦不能開機，不然就是開機到一半會停掉 呼呼，裝上新power沒啥問題了，不過我還不太會整理主機 &lt;a href="https://www.flickr.com/photos/appleboy/304051092/" title="Photo Sharing"&gt;&lt;img alt="修好了，裝上新power" src="https://i1.wp.com/static.flickr.com/102/304051092_7cabd44c9f.jpg?resize=500%2C401" data-recalc-dims="1" /&gt;&lt;/a&gt; 整理的很亂，今天下午就拿給我老大了，哈解決電腦了 &lt;a href="https://www.flickr.com/photos/appleboy/304051142/" title="Photo Sharing"&gt;&lt;img alt="停車場" src="https://i2.wp.com/static.flickr.com/104/304051142_ee232a6687.jpg?resize=500%2C375" data-recalc-dims="1" /&gt;&lt;/a&gt; 光溜溜的屋頂~ &lt;a href="https://www.flickr.com/photos/appleboy/304051117/" title="Photo Sharing"&gt;&lt;img alt="史蹟大樓屋頂" src="https://i1.wp.com/static.flickr.com/106/304051117_04b5fa9bc1.jpg?resize=500%2C244" data-recalc-dims="1" /&gt;&lt;/a&gt; 應該快要裝上新的屋頂了吧&lt;/p&gt;</description></item><item><title>修電腦～～～</title><link>https://blog.wu-boy.com/2006/11/%E4%BF%AE%E9%9B%BB%E8%85%A6%EF%BD%9E%EF%BD%9E%EF%BD%9E/</link><pubDate>Wed, 22 Nov 2006 06:27:16 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/11/%E4%BF%AE%E9%9B%BB%E8%85%A6%EF%BD%9E%EF%BD%9E%EF%BD%9E/</guid><description>&lt;p&gt;嘿嘿，幫我老大的兒子修一下電腦～，後來測試的結果，好像是power有問題 所以換了一下power，現在跑得很順，我幫他灌上 &lt;strong&gt;08.20.06.WINDWOS XP 多重自動安裝光碟更新至2006.08.18&lt;/strong&gt; 這套還不錯，superxp已經過時了 &lt;a href="https://www.flickr.com/photos/appleboy/303329079/" title="Photo Sharing"&gt;&lt;img alt="修電腦" src="https://i2.wp.com/static.flickr.com/103/303329079_a143ab2184.jpg?resize=500%2C363" data-recalc-dims="1" /&gt;&lt;/a&gt; 安裝好了，更新update &lt;a href="https://www.flickr.com/photos/appleboy/303330688/" title="Photo Sharing"&gt;&lt;img alt="Windows Update" src="https://i1.wp.com/static.flickr.com/118/303330688_8be2ec7f29.jpg?resize=500%2C368" data-recalc-dims="1" /&gt;&lt;/a&gt; 目前上班地點，用2台液晶銀幕，不過快買kvm了，爽～ &lt;a href="https://www.flickr.com/photos/appleboy/303330709/" title="Photo Sharing"&gt;&lt;img alt="My company Desktop" src="https://i2.wp.com/static.flickr.com/113/303330709_95baa65e71.jpg?resize=500%2C375" data-recalc-dims="1" /&gt;&lt;/a&gt; 哈～～～還不賴吧&lt;/p&gt;</description></item><item><title>[Linux] Suse Server 9 &amp;&amp; My Company Computer</title><link>https://blog.wu-boy.com/2006/11/linux-suse-server-9-my-company-computer/</link><pubDate>Sat, 18 Nov 2006 19:35:03 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/11/linux-suse-server-9-my-company-computer/</guid><description>&lt;p&gt;館內買的17萬伺服器，剛來的時候是安裝 Suse Linux Enterprise 9&lt;/p&gt;
&lt;div style="width: 500px; text-align: right"&gt;
 &lt;a title="Zooomr Photo Sharing :: Photo Sharing" href="http://beta.zooomr.com/photos/23204@Z01/415115/"&gt;&lt;img border="0" style="border: 1px solid #000000" alt="DSCF0070" src="https://i0.wp.com/static.zooomr.com/images/415115_4a1a1a6c14.jpg?resize=500%2C375" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;span style="float: left"&gt;DSCF0070&lt;/span&gt; Hosted on &lt;strong&gt;Zooom&lt;span style="color: #9eae15"&gt;r&lt;/span&gt;&lt;/strong&gt;
&lt;/div&gt; 玩來玩去所有的linux好像都差不多，正版的linux 
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/300502248/" title="Photo Sharing"&gt;&lt;img alt="Suse LINUX Server" src="https://i2.wp.com/static.flickr.com/99/300502248_cfe083862f.jpg?resize=434%2C500" data-recalc-dims="1" /&gt;&lt;/a&gt; 其實網路上都下載的到，差別在於你買企業版，提供30天免費服務電話，打電話去煩他 不過我想一個資訊人員，應該不用這樣吧&lt;del&gt;哈 我們館內還有買dell的機器，買的是rhel4的系統，也是正版，明天去拍一下 順便看看我的桌面吧 超亂&lt;/del&gt; &lt;a href="https://www.flickr.com/photos/10526457@N00/300502207/" title="Photo Sharing"&gt;&lt;img alt="My company Desktop" src="https://i1.wp.com/static.flickr.com/119/300502207_6a7eebfea6.jpg?resize=500%2C375" data-recalc-dims="1" /&gt;&lt;/a&gt; 桌上都是一堆雜誌pchome pc office這是我們定的，都是由我保管 哈~&lt;/p&gt;</description></item><item><title>[Ubuntu] 安裝 java-tool for Flickr upload tool</title><link>https://blog.wu-boy.com/2006/11/ubuntu-%E5%AE%89%E8%A3%9D-java-tool-for-flickr-upload-tool/</link><pubDate>Sat, 18 Nov 2006 10:28:55 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/11/ubuntu-%E5%AE%89%E8%A3%9D-java-tool-for-flickr-upload-tool/</guid><description>&lt;p&gt;國外知名的相簿網站 &lt;a href="http://beta.zooomr.com/home" title="http://beta.zooomr.com/home"&gt;Zooomr&lt;/a&gt;　&lt;a href="https://www.flickr.com/" title="https://www.flickr.com/"&gt;Flickr&lt;/a&gt; 有支援同一套上傳軟體，２個相簿的網頁空間分別如下 Flickr 升級後如下 &lt;a href="https://www.flickr.com/account/order/" title="Click here to upgrade your account"&gt;&lt;img style="border: medium none " alt="Upgrade to a Pro Account today for just $24.95! Click here!" src="https://i2.wp.com/www.flickr.com/images/new_upgrade_page.gif?resize=510%2C302&amp;#038;ssl=1" data-recalc-dims="1" /&gt;&lt;/a&gt; 還蠻便宜的，zooomr　則是　１００ＭＢ用完就沒有了，Flickr 則是每個月可以上傳２０ＭＢ 接下來～來說明　ｕｂｕｎｔｕ安裝方式 下載Flickr 上傳軟體　&lt;a href="http://juploadr.sourceforge.net/" title="http://juploadr.sourceforge.net/"&gt;http://juploadr.sourceforge.net/&lt;/a&gt; 下載之後，解壓縮到桌面 ，到該資料夾之後執行 ./jUploadr , 不過如果你沒有安裝ｊａｖａ的話，會執行失敗 首先安裝ｊａｖａ apt-get install sun-java5*　java-package 安裝時會出現下面錯誤訊息&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This package is an installer package, it does not actually contain the J2SDK documentation. You will need to go download one of the archives: jdk-1_5_0-doc.zip jdk-1_5_0-doc-ja.zip (choose the non-update version if this is the first installation). Please visit &lt;a href="http://java.sun.com/j2se/1.5.0/download.html"&gt;http://java.sun.com/j2se/1.5.0/download.html&lt;/a&gt; now and download. The file should be owned by root.root and be copied to /tmp. 這時候要去下載　去 &lt;a href="http://www.google.com.tw" title="http://www.google.com.tw"&gt;www.google.com.tw&lt;/a&gt; 收尋　jdk-1_5_0-doc-ja.zip　第一個收尋就是了 然後分別下載　jdk-1_5_0-doc.zip　jdk-1_5_0-doc-ja.zip 然後在放到　/tmp/　底下 ，然後在重新執行&lt;/p&gt;</description></item><item><title>國史館台灣文獻館-拆天花板</title><link>https://blog.wu-boy.com/2006/11/%E5%9C%8B%E5%8F%B2%E9%A4%A8%E5%8F%B0%E7%81%A3%E6%96%87%E7%8D%BB%E9%A4%A8-%E6%8B%86%E5%A4%A9%E8%8A%B1%E6%9D%BF/</link><pubDate>Fri, 17 Nov 2006 11:24:37 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/11/%E5%9C%8B%E5%8F%B2%E9%A4%A8%E5%8F%B0%E7%81%A3%E6%96%87%E7%8D%BB%E9%A4%A8-%E6%8B%86%E5%A4%A9%E8%8A%B1%E6%9D%BF/</guid><description>&lt;p&gt;要拆天花板~~~&lt;/p&gt;
&lt;div style="width: 500px; text-align: right"&gt;
 &lt;a title="Zooomr Photo Sharing :: Photo Sharing" href="http://beta.zooomr.com/photos/23204@Z01/415113/"&gt;&lt;img border="0" style="border: 1px solid #000000" alt="DSCF0039" src="https://i2.wp.com/static.zooomr.com/images/415113_819cf21ab0.jpg?resize=500%2C375" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;span style="float: left"&gt;DSCF0039&lt;/span&gt; Hosted on &lt;strong&gt;Zooom&lt;span style="color: #9eae15"&gt;r&lt;/span&gt;&lt;/strong&gt;
&lt;/div&gt;
&lt;p&gt;哈哈~ 遠觀&lt;/p&gt;
&lt;div style="width: 500px; text-align: right"&gt;
 &lt;a title="Zooomr Photo Sharing :: Photo Sharing" href="http://beta.zooomr.com/photos/23204@Z01/415138/"&gt;&lt;img border="0" style="border: 1px solid #000000" alt="DSCF0040" src="https://i1.wp.com/static.zooomr.com/images/415138_d7149cc01b.jpg?resize=500%2C375" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;span style="float: left"&gt;DSCF0040&lt;/span&gt; Hosted on &lt;strong&gt;Zooom&lt;span style="color: #9eae15"&gt;r&lt;/span&gt;&lt;/strong&gt;
&lt;/div&gt;
&lt;div style="width: 500px; text-align: right"&gt;
 &lt;a title="Zooomr Photo Sharing :: Photo Sharing" href="http://beta.zooomr.com/photos/23204@Z01/415139/"&gt;&lt;img border="0" style="border: 1px solid #000000" alt="DSCF0041" src="https://i1.wp.com/static.zooomr.com/images/415139_679437fba4.jpg?resize=500%2C375" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;span style="float: left"&gt;DSCF0041&lt;/span&gt; Hosted on &lt;strong&gt;Zooom&lt;span style="color: #9eae15"&gt;r&lt;/span&gt;&lt;/strong&gt;
&lt;/div&gt;
&lt;p&gt;好多人阿~ 我們的宿舍前面 都是遊覽車&lt;/p&gt;
&lt;div style="width: 500px; text-align: right"&gt;
 &lt;a title="Zooomr Photo Sharing :: Photo Sharing" href="http://beta.zooomr.com/photos/23204@Z01/415112/"&gt;&lt;img border="0" style="border: 1px solid #000000" alt="DSCF0034" src="https://i2.wp.com/static.zooomr.com/images/415112_71489cdc5b.jpg?resize=500%2C375" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;span style="float: left"&gt;DSCF0034&lt;/span&gt; Hosted on &lt;strong&gt;Zooom&lt;span style="color: #9eae15"&gt;r&lt;/span&gt;&lt;/strong&gt;
&lt;/div&gt;</description></item><item><title>[Linux] CentOS 安裝在 2u server</title><link>https://blog.wu-boy.com/2006/11/linux-centos-%E5%AE%89%E8%A3%9D%E5%9C%A8-2u-server/</link><pubDate>Fri, 17 Nov 2006 10:50:20 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/11/linux-centos-%E5%AE%89%E8%A3%9D%E5%9C%A8-2u-server/</guid><description>&lt;p&gt;最近館內買了一台2u的伺服器，雙cpu AMD，底下圖片上面那台，下面那台是後端的圖片資料庫&lt;/p&gt;
&lt;div style="width: 500px; text-align: right"&gt;
 &lt;a title="Zooomr Photo Sharing :: Photo Sharing" href="http://beta.zooomr.com/photos/23204@Z01/415115/"&gt;&lt;img border="0" style="border: 1px solid #000000" alt="DSCF0070" src="https://i0.wp.com/static.zooomr.com/images/415115_4a1a1a6c14.jpg?resize=500%2C375" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;span style="float: left"&gt;DSCF0070&lt;/span&gt; Hosted on &lt;strong&gt;Zooom&lt;span style="color: #9eae15"&gt;r&lt;/span&gt;&lt;/strong&gt;
&lt;/div&gt; processor : 1 vendor_id : AuthenticAMD cpu family : 15 model : 37 model name : AMD Opteron(tm) Processor 248 stepping : 1 cpu MHz : 2193.217 cache size : 1024 KB MemTotal: 2055132 kB 2顆，不過重點不是這個，重點這台機器我搞了1個星期 就是因為抓不到scsi介面卡，打電話給客服，好像機器不是他們裝的 原本機器送過裝好suse 9.0 enterorise server，可是我不喜歡suse，還可以安裝桌面 一堆有的沒有程式，所以我只好砍掉自己系統重做，不過原本想用freebsd 6.1 release 也沒辦法 外接卡不支援freebsd 那就別安裝了，根本抓不到硬碟，最後上網找driver，終於找到for fc centos 想說沒玩過centOS 4.4 就裝來玩看看 , 順便動手切了LVM 
&lt;div style="width: 500px; text-align: right"&gt;
 &lt;a title="Zooomr Photo Sharing :: Photo Sharing" href="http://beta.zooomr.com/photos/23204@Z01/415116/"&gt;&lt;img border="0" style="border: 1px solid #000000" alt="DSCF0075" src="https://i0.wp.com/static.zooomr.com/images/415116_5657d082fa.jpg?resize=500%2C375" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;span style="float: left"&gt;DSCF0075&lt;/span&gt; Hosted on &lt;strong&gt;Zooom&lt;span style="color: #9eae15"&gt;r&lt;/span&gt;&lt;/strong&gt;
&lt;/div&gt; 安裝好之後機器大概就ok了，沒什麼問題 這台機器，是在 
&lt;p&gt;&lt;font size="2" face="新細明體" color="black"&gt;&lt;span style="font-size: 10pt; color: black"&gt;&lt;a title="http://www.jcnetcorp.com" href="http://www.jcnetcorp.com"&gt;捷洲資訊股份有限公司&lt;/a&gt;&lt;span lang="EN-US" /&gt;&lt;/span&gt;&lt;/font&gt; &lt;font size="2" face="新細明體" color="black"&gt;&lt;span style="font-size: 10pt; color: black"&gt;台中分公司&lt;span lang="EN-US"&gt; &lt;/span&gt;台中市南屯區大英街&lt;span lang="EN-US"&gt;636&lt;/span&gt;號&lt;span lang="EN-US" /&gt;&lt;/span&gt;&lt;/font&gt; &lt;font size="2" face="新細明體" color="black"&gt;&lt;span lang="EN-US" style="font-size: 10pt; color: black"&gt;Web Site : &lt;a target="_blank" onclick="return top.js.OpenExtLink(window,event,this)" href="http://www.jcnetcorp.com/"&gt;&lt;a href="http://www.jcnetcorp.com"&gt;http://www.jcnetcorp.com&lt;/a&gt;&lt;/a&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;</description></item><item><title>交大研究所宿舍</title><link>https://blog.wu-boy.com/2006/11/%E4%BA%A4%E5%A4%A7%E7%A0%94%E7%A9%B6%E6%89%80%E5%AE%BF%E8%88%8D/</link><pubDate>Fri, 10 Nov 2006 20:09:25 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/11/%E4%BA%A4%E5%A4%A7%E7%A0%94%E7%A9%B6%E6%89%80%E5%AE%BF%E8%88%8D/</guid><description>&lt;p&gt;好像還不錯，跟東華好像差不多 &lt;strong&gt;&lt;a href="https://www.flickr.com/photos/10526457@N00/300475472/" title="Photo Sharing"&gt;&lt;img alt="DSC00723" src="https://i1.wp.com/static.flickr.com/122/300475472_4db97b8a31.jpg?resize=500%2C375" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>[FreeBSD] 安裝基本mrtg主機流量統計圖</title><link>https://blog.wu-boy.com/2006/11/freebsd-%E5%AE%89%E8%A3%9D%E5%9F%BA%E6%9C%ACmrtg%E4%B8%BB%E6%A9%9F%E6%B5%81%E9%87%8F%E7%B5%B1%E8%A8%88%E5%9C%96/</link><pubDate>Wed, 08 Nov 2006 10:17:40 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/11/freebsd-%E5%AE%89%E8%A3%9D%E5%9F%BA%E6%9C%ACmrtg%E4%B8%BB%E6%A9%9F%E6%B5%81%E9%87%8F%E7%B5%B1%E8%A8%88%E5%9C%96/</guid><description>&lt;ul&gt;
&lt;li&gt;主機資訊 FreeBSD 6.1-RELEASE&lt;/li&gt;
&lt;li&gt;安裝步驟&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;cd /usr/ports/net-mgmt/net-snmp; make install clean

cd /usr/ports/net-mgmt/mrtg; make install clean&lt;/pre&gt; 這2個安裝好，其實基本上就已經可以使用了 在 /etc/rc.conf 加上 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;snmpd_enable="YES"
snmpd_flags="-a -p /var/run/snmpd.pid"
snmptrapd_enable="YES"
snmptrapd_flags="-a -p /var/run/snmptrapd.pid"&lt;/pre&gt; 修改 snmpd.conf 檔 目錄在 /usr/local/share/snmp/snmpd.conf 
&lt;blockquote&gt;
&lt;p&gt;&lt;span class="postbody"&gt;com2sec local localhost &lt;font color="red"&gt;public&lt;/font&gt; com2sec lan 192.168.100.0/24 public&lt;/span&gt; group RWGroup v1 local group ROGroup v1 lan view all included .1 80 access RWGroup “” any noauth prefix all all all access ROGroup “” any noauth prefix all none none 紅色部份，盡量不要用 public ，因為這樣別人可以猜到你的mrtg設定 修改好存檔&lt;/p&gt;</description></item><item><title>[FreeBSD] 安裝 sshit 設定教學</title><link>https://blog.wu-boy.com/2006/11/freebsd-%E5%AE%89%E8%A3%9D-sshit-%E8%A8%AD%E5%AE%9A%E6%95%99%E5%AD%B8/</link><pubDate>Fri, 03 Nov 2006 23:27:56 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/11/freebsd-%E5%AE%89%E8%A3%9D-sshit-%E8%A8%AD%E5%AE%9A%E6%95%99%E5%AD%B8/</guid><description>&lt;p&gt;系統：FreeBSD 6.0-RELEASE 安裝方式： cd /usr/ports/security/sshit/ make install clean 設定檔 /usr/local/etc/sshit.conf # Sample configuration file of sshit.pl # We use pf as firewall on default 看你喜歡用什麼防火牆，我熟悉ipfw FIREWALL_TYPE = ipfw # Number of failed login attempts within time before we block MAX_COUNT = 3 # Time in seconds in which all failed login attempts must occur WITHIN_TIME = 60 # Time in seconds to block ip in firewall 失敗後禁止登入幾秒鐘 RESET_IP = 300 IPFW_CMD = /sbin/ipfw # Make sure you don&amp;rsquo;t have any important rules here already IPFW_RULE_START = 2100 IPFW_RULE_END = 3100 IPFW2_CMD = /sbin/ipfw IPFW2_TABLE_NO = 0 PFCTL_CMD = /sbin/pfctl PF_TABLE = badhosts vi /etc/syslog.conf 加上 auth.info;authpriv.info |exec /usr/local/sbin/sshit 不過安裝好之後，照常裡來說可以使用，結果發現完全沒有效果 所以我去看了一下 sshit perl的這隻程式，跟官方網站提供的log檔資料 官方網log檔如下 Jul 23 05:30:51 sshd[36291]: &lt;span style="color: red"&gt;Failed&lt;/span&gt; password for root from 200.204.175.122 port 48830 ssh2 Jul 23 05:30:51 sshit.pl: BLOCKING 200.204.175.122, rule 2100FreeBSD auth.log 檔如下&lt;/p&gt;</description></item><item><title>[FreeBSD] 系統核心支援ipfw 更新kernel</title><link>https://blog.wu-boy.com/2006/10/freebsd-%E7%B3%BB%E7%B5%B1%E6%A0%B8%E5%BF%83%E6%94%AF%E6%8F%B4ipfw-%E6%9B%B4%E6%96%B0kernel/</link><pubDate>Sat, 28 Oct 2006 17:52:18 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/10/freebsd-%E7%B3%BB%E7%B5%B1%E6%A0%B8%E5%BF%83%E6%94%AF%E6%8F%B4ipfw-%E6%9B%B4%E6%96%B0kernel/</guid><description>&lt;p&gt;系統預設是不能使用 ipfw 指令，因為系統核心不支援，要使系統支援 ipfw，則需要修改核心&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;cd /usr/src/sys/i386/conf&lt;br&gt;
vi GENERIC&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;#在最後面加入&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;options IPFIREWALL&lt;br&gt;
options IPFIREWALL_DEFAULT_TO_ACCEPT&lt;br&gt;
options IPFIREWALL_VERBOSE&lt;br&gt;
options IPFIREWALL_VERBOSE_LIMIT=10&lt;br&gt;
options IPDIVERT&lt;br&gt;
#然後存檔&lt;br&gt;
config GENERIC&lt;br&gt;
cd ../compile/GENERIC/&lt;br&gt;
make cleandepend; make depend;&lt;br&gt;
make depend all install&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;編譯好沒有錯誤之後，就可以重新開機 &lt;font color="#ff0000"&gt;ipfw list 65535 allow ip from any to any&lt;/font&gt; 看到上面訊息，就是成功 我在自己的論壇寫過一遍&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.forum.wu-boy.com/t=10210" title="http://www.forum.wu-boy.com/t=10210"&gt;http://www.forum.wu-boy.com/t=10210&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/firewalls-ipfw.html" title="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/firewalls-ipfw.html"&gt;http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/firewalls-ipfw.html&lt;/a&gt;&lt;br&gt;
&lt;a href="http://freebsd.lab.mlc.edu.tw/natd/" title="http://freebsd.lab.mlc.edu.tw/natd/ "&gt;http://freebsd.lab.mlc.edu.tw/natd/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Linux] 使用 yum 更新 redhat enterprise server 4</title><link>https://blog.wu-boy.com/2006/10/linux-%E4%BD%BF%E7%94%A8-yum-%E6%9B%B4%E6%96%B0-redhat-enterprise-server-4/</link><pubDate>Sat, 28 Oct 2006 00:05:50 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/10/linux-%E4%BD%BF%E7%94%A8-yum-%E6%9B%B4%E6%96%B0-redhat-enterprise-server-4/</guid><description>&lt;p&gt;由於 &lt;a href="http://www.redhat.com/" title="http://www.redhat.com/"&gt;redhat&lt;/a&gt; &lt;a href="http://www.redhat.com/rhel/" title="http://www.redhat.com/rhel/"&gt;enterprise&lt;/a&gt; server 4 伺服器版本，沒有提供線上升級套件的功能yum 所以我利用 centos的yum/apt的server來更新 設定檔如下 [base] name=Fedora Core $releasever – $basearch – Base baseurl=http://ftp.isu.edu.tw/pub/Linux/CentOS/4.4/os/$basearch/ [updates-released] name=Fedora Core $releasever – $basearch – Released Updates baseurl=http://ftp.isu.edu.tw/pub/Linux/CentOS/4.4/updates/$basearch/ 更新 yum 指令如下 yum的常用指令: yum update [套件1] [套件2] […] 更新套件,若後面不加任何的套件,則會更新所有系統目前已經安裝了的套件 yum install 套件1 [套件2] […] 安裝套件 yum upgrade [套件1] [套件2] […] 升級套件,將一些過舊即將洮汰的套件也一起升級 yum remove 套件1 [套件2] […] 移除套件 yum clean packages 清除暫存(/var/cache/yum)目錄下的套件 yum clean headers 清除暫存(/var/cache/yum)目錄下的 headers yum clean oldheaders 清除暫存(/var/cache/yum)目錄下舊的 headers yum clean 或是 yum clean all 清除暫存(/var/cache/yum)目錄下的套件及舊的 headers 等於是執行 yum clean packages 及 yum clean oldheaders yum list 列出所有的套件 yum list updates 列出所有可以更新的套件 yum list installed 列出所有已安裝的套件 yum list extras 列出所有已安裝但不在 Yum Repository 內的套件 yum list [參數] 列出所指定的套件,參數可以是套件名稱或是在 shell 中所使用的表示式,如 ? 等 yum check-update 檢查可以更新的套件 yum info 列出所有套件的資訊 yum info updates 列出所有可以更新的套件資訊 yum info installed 列出所有已安裝的套件資訊 yum info extras 列出所有已安裝但不在 Yum Repository 內的套件資訊 yum info [參數] 列出所指定的套件資訊,參數可以是套件名稱或是在 shell 中所使用的表示式,如 ? 等 yum provides 套件1 [套件2] […] 列出套件提供哪些檔案 yum search [參數] 搜尋套件 reference &lt;a href="http://www.php5.idv.tw/modules.php?mod=books&amp;amp;act=show&amp;amp;shid=2536" title="http://www.php5.idv.tw/modules.php?mod=books&amp;amp;act=show&amp;amp;shid=2536"&gt;http://www.php5.idv.tw/modules.php?mod=books&amp;amp;act=show&amp;amp;shid=2536&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Ubuntu] 開機自動執行script</title><link>https://blog.wu-boy.com/2006/10/ubuntu-%E9%96%8B%E6%A9%9F%E8%87%AA%E5%8B%95%E5%9F%B7%E8%A1%8Cscript/</link><pubDate>Sat, 21 Oct 2006 22:33:49 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/10/ubuntu-%E9%96%8B%E6%A9%9F%E8%87%AA%E5%8B%95%E5%9F%B7%E8%A1%8Cscript/</guid><description>&lt;p&gt;因為在安裝 maple bbs 的時候 發現itoc的方式沒辦法解決開機自動執行 沒有 inetd.conf 也沒有 xinetd 的方式 ，所以利用下面方式才可以達成 我是增加一個檔案 /etc/init.d/bbsd 然後增加以下內容 ————————————–&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;#!/bin/sh # # MapleBBS # su bbs -c ‘/home/bbs/bin/camera’ su bbs -c ‘/home/bbs/bin/account’ /home/bbs/bin/bbsd /home/bbs/bin/bmtad /home/bbs/bin/bpop3d /home/bbs/bin/gemd /home/bbs/bin/bguard /home/bbs/bin/xchatd /home/bbs/innd/innbbsd —————————————&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;chmod 755 /etc/init.d/bbsd 然後 cd /etc&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;update-rc.d bbsd defaults 90 &lt;span class="postbody"&gt;90為開機時的執行順序, 端看您如何設定.&lt;/span&gt; update-rc.d會自動幫各個rcX.d目錄下建立一link至/etc/init.d/執行檔 或者是 &lt;span class="postbody"&gt;update-rc.d iptables start 20 2 3 4 5 . stop 0 1 6 .&lt;/span&gt; 後面有一個點喔 &lt;span class="postbody"&gt;2.3.4.5 是指 rcX.d 複製到底下 當開機run level 2.3.4.5 當開機run level的話才會執行 該執行檔&lt;/span&gt;&lt;/p&gt;</description></item><item><title>[Linux] Ubuntu 6.06 Proftpd + Mysql 安裝方式</title><link>https://blog.wu-boy.com/2006/10/linux-ubuntu-606-proftpd-mysql-%E5%AE%89%E8%A3%9D%E6%96%B9%E5%BC%8F/</link><pubDate>Sat, 21 Oct 2006 16:17:51 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/10/linux-ubuntu-606-proftpd-mysql-%E5%AE%89%E8%A3%9D%E6%96%B9%E5%BC%8F/</guid><description>&lt;p&gt;ProFTPD Version 1.2.10 Mysql Version 4.1.0 支援 UTF8 請確定你的proftpd有支援sql module&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;proftpd -l | grep mysql

proftpd -l | grep sql
mod_sql.c
mod_sql_mysql.c
mod_quotatab_sql.c&lt;/pre&gt; 確定有支援之後 再來就是建立mysql資料庫 * 建立 proftp 資料庫 
&lt;pre class="brush: sql; title: ; notranslate" title=""&gt;CREATE DATABASE `ftp` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;&lt;/pre&gt; * 建立使用者資料表 
&lt;pre class="brush: sql; title: ; notranslate" title=""&gt;CREATE TABLE `ftp` (
`username` varchar( 60 ) default NULL ,
`uid` int( 11 ) NOT NULL ,
`gid` int( 11 ) default NULL ,
`password` varchar( 30 ) default NULL ,
`homedir` varchar( 60 ) default NULL ,
`shell` varchar( 11 ) default ‘/bin/false’,
PRIMARY KEY ( `uid` ) ,
UNIQUE KEY ( `username` )
) TYPE = MYISAM;&lt;/pre&gt; 此資料表是在紀錄使用者的基本資訊，uid是使用者系統uid，gid是使用者group的id，passwd使用者的密碼 homedir為使用者登入的家目錄， shell可以為該使用者指定相應的shell * 建立使用者群組資料表 
&lt;pre class="brush: sql; title: ; notranslate" title=""&gt;CREATE TABLE `groups` (
`groupname` varchar( 30 ) NOT NULL default ‘’,
`gid` int( 11 ) NOT NULL default ‘0′,
`members` text default NULL
) TYPE = MYISAM;&lt;/pre&gt; 其中grpname是組的名稱，gid是系統組的ID，members是組的成員。注意：多成員，他們之間要用逗號隔開，不能使用空格 例如 3個使用者 test1 test2 test3 ，members就要寫 (test1,test2,test3) #設置MySQL認證： SQLConnectInfo 資料庫 資料庫帳號 資料庫密碼 #設置user資料表資訊『對應你的設定的資料表』 SQLUserInfo ftp username password uid gid homedir shell #設置group資料表資訊『對應你的設定的資料表』 SQLGroupInfo groups groupname gid members #設定使用者密碼編碼方式 ex：Plaintext 純文字 SQLAuthTypes Plaintext #設定mysql log檔 SQLLogFile /var/log/sql.log PersistentPasswd off #如果home目錄不存在，則系統會為根據它的home項新建一個目錄： SQLHomedirOnDemand on 再來呢，建立ftp的專屬group，當然你如果有許多群組，請自行建立 1. 建立groupgroupadd ftpgroup 2. 建立一個使用者home目錄 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;useradd -G ftpgroup -d /home/ftp -m -s /bin/false ftp&lt;/pre&gt; 為FTPUSR建立HOME，把所有的FTP user 活動空間全放在此目錄下： 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;mkdir /home/ftp #剛剛建立使用者已經建立了
chown -R ftp:ftpgroup /home/ftp&lt;/pre&gt; 開始建立ftp的使用者，可以的話利用phpmyadmin 
&lt;pre class="brush: sql; title: ; notranslate" title=""&gt;INSERT INTO user (`userid`, `passwd`, `uid`, `gid`, `home`, `shell`) values (’test’, ‘1234′, ‘1000′, ‘1001′, ‘/home/ftp/’, ‘/bin/false’ );
INSERT INTO `groups` VALUES (’ftpgroup’, 1001, ‘test’);
&lt;/pre&gt; 上面那個是新增group對應使用者，如果你有多個使用者對應到同一個group 那麼你就要修改 group 改成 VALUES (’ftpgroup’, 1001, ‘test1,test2,test3′) 所以每增加一個使用者，就要去修改一次，有點麻煩，不過寫程式就可以解決了 大致上是如此，有問題在提出吧 我的proftpd.conf設定檔 http://bbs.ee.ndhu.edu.tw/~appleboy/proftpd.conf</description></item><item><title>[FreeBSD] 安裝Awstats 6.6</title><link>https://blog.wu-boy.com/2006/10/freebsd-%E5%AE%89%E8%A3%9Dawstats-66/</link><pubDate>Thu, 19 Oct 2006 11:02:43 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/10/freebsd-%E5%AE%89%E8%A3%9Dawstats-66/</guid><description>&lt;p&gt;&lt;strong&gt;安裝路徑&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;cd /usr/ports/www/awstats-devel/ 安裝好之後 請在 httpd.conf 最後面加入 # Directives to allow use of AWStats as a CGI # &lt;strong&gt;Alias /awstatsclasses “/usr/local/www/awstats/classes/” Alias /awstatscss “/usr/local/www/awstats/css/” Alias /awstatsicons “/usr/local/www/awstats/icons/” ScriptAlias /awstats/ “/usr/local/www/awstats/cgi-bin/”&lt;/strong&gt; 執行 &lt;strong&gt;/usr/local/www/awstats/tools/awstats_configure.pl&lt;/strong&gt; 會出現錯誤訊息～&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Error: Failed to open ‘/usr/local/www/awstats/wwwroot/cgi-bin/awstats.model.conf’ for read. Error: AWStats database directory defined in config file by ‘DirData’ parameter (/var/lib/awstats) does not exist or is not writable. Setup (‘/etc/awstats/awstats.192.168.100.244.conf’ file, web server or permissions) may be wrong. Check config file, permissions and AWStats documentation (in ‘docs’ directory). &lt;span class="postbody"&gt;建立 &lt;span style="color: blue"&gt;/var/lib/awstats&lt;/span&gt; 目錄，並給予 777 之權限&lt;/span&gt; &lt;span class="postbody"&gt;chmod 777 /var/lib/awstats 註：若不給予777權限，將來若設定 &lt;span style="color: green"&gt;AllowToUpdateStatsFromBrowser=1&lt;/span&gt; 時，會無法透過Browser來即時更新Report&lt;/span&gt;&lt;/p&gt;</description></item><item><title>[FreeBSD] Ports 更新 index 或 更新kernel</title><link>https://blog.wu-boy.com/2006/09/freebsd-ports-%E6%9B%B4%E6%96%B0-index/</link><pubDate>Mon, 25 Sep 2006 21:45:33 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/09/freebsd-ports-%E6%9B%B4%E6%96%B0-index/</guid><description>&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;1. cd /usr/ports &amp;#038;&amp; make fetchindex
2. portsdb -uU
3. rm -f /var/db/pkg/pkgdb.db
4. pkgdb -Fu
5. cd /usr/src ; make buildworld; make kernel; make installworld; reboot&lt;/pre&gt; &amp;#8212; 這招很好用 上面步驟如果只需要更新ports tree 只需要 cd /usr/ports &amp;&amp; make fetchindex 就可以了</description></item><item><title>[FC4] snmpd + mrtg 安裝教學「注意事項」</title><link>https://blog.wu-boy.com/2006/09/fc4-snmpd-mrtg-%E5%AE%89%E8%A3%9D%E6%95%99%E5%AD%B8%E3%80%8C%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85%E3%80%8D/</link><pubDate>Mon, 25 Sep 2006 21:30:50 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/09/fc4-snmpd-mrtg-%E5%AE%89%E8%A3%9D%E6%95%99%E5%AD%B8%E3%80%8C%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85%E3%80%8D/</guid><description>&lt;p&gt;其實安裝方面並不難 FreeBSD 就用ports安裝 fc系列 就用 yum 或者是 apt FreeBSD: /usr/ports/net-mgmt/net-snmp /usr/ports/net-mgmt/mrtg &lt;a href="http://phorum.study-area.org/viewtopic.php?t=21142&amp;amp;highlight=public+cfgmaker" title="http://phorum.study-area.org/viewtopic.php?t=21142&amp;amp;highlight=public+cfgmaker"&gt;http://phorum.study-area.org/viewtopic.php?t=21142&amp;amp;highlight=public+cfgmaker&lt;/a&gt; 我找到的資料 ～ 照上面修改大致上ok&lt;/p&gt;</description></item><item><title>[FC4] 限制connection 連線數目「架設war3伺服器」</title><link>https://blog.wu-boy.com/2006/09/fc4-%E9%99%90%E5%88%B6connection-%E9%80%A3%E7%B7%9A%E6%95%B8%E7%9B%AE%E3%80%8C%E6%9E%B6%E8%A8%ADwar3%E4%BC%BA%E6%9C%8D%E5%99%A8%E3%80%8D/</link><pubDate>Sun, 24 Sep 2006 23:58:32 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/09/fc4-%E9%99%90%E5%88%B6connection-%E9%80%A3%E7%B7%9A%E6%95%B8%E7%9B%AE%E3%80%8C%E6%9E%B6%E8%A8%ADwar3%E4%BC%BA%E6%9C%8D%E5%99%A8%E3%80%8D/</guid><description>&lt;p&gt;fc4作業系統 預設 有連線數目的限制 還有使用者連線的限制 不過解決方法很容易 &lt;a href="http://www.ithome.com.tw/plog/index.php?op=ViewArticle&amp;amp;articleId=761&amp;amp;blogId=131" title="http://www.ithome.com.tw/plog/index.php?op=ViewArticle&amp;amp;articleId=761&amp;amp;blogId=131"&gt;http://www.ithome.com.tw/plog/index.php?op=ViewArticle&amp;amp;articleId=761&amp;amp;blogId=131&lt;/a&gt; 我查到的解決方式 我改完之後如下&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited pending signals (-i) 16255 max locked memory (kbytes, -l) 32 max memory size (kbytes, -m) unlimited open files (-n) 819200 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 102400 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited ulimit：顯示（或設定）用戶可以使用的資源限制 ulimit -a 顯示用戶可以使用的資源限制 ulimit unlimited 不限制用戶可以使用的資源，但本設定對可打開的最大文件數（max open files） 和可同時執行的最大進程數（max user processes）無效 ulimit -n &amp;lt;可以同時打開的檔案數&amp;gt; 設定用戶可以同時打開的最大檔案數（max open files） 例如：ulimit -n 8192 如果本參數設定過小，對於併發訪問量大的網站，可能會出現too many open files的錯誤 ulimit -u &amp;lt;可以執行的最大併發進程數&amp;gt; 設定用戶可以同時執行的最大進程數（max user processes） 例如：ulimit -u 1024&lt;/p&gt;</description></item><item><title>[FreeBSD] Proftpd + SSL 虛擬帳號設定安裝</title><link>https://blog.wu-boy.com/2006/09/freebsd-proftpd-ssl-%E8%99%9B%E6%93%AC%E5%B8%B3%E8%99%9F%E8%A8%AD%E5%AE%9A%E5%AE%89%E8%A3%9D/</link><pubDate>Fri, 22 Sep 2006 08:41:53 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/09/freebsd-proftpd-ssl-%E8%99%9B%E6%93%AC%E5%B8%B3%E8%99%9F%E8%A8%AD%E5%AE%9A%E5%AE%89%E8%A3%9D/</guid><description>&lt;p&gt;系統 ubuntu 6.06 + proftpd 1.2.10&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;TLSEngine on
TLSLog /var/log/proftpd-tls.log
TLSProtocol TLSv1
TLSRequired on
TLSRSACertificateFile /etc/proftpd/HostCA.crt
TLSRSACertificateKeyFile /etc/proftpd/HostCA.key
TLSCACertificateFile /etc/proftpd/RootCA.crt
TLSVerifyClient off&lt;/pre&gt; 虛擬帳號實做 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;AuthUserFile /etc/proftpd/proftpd.passwd
AuthGroupFile /etc/proftpd/proftpd.group
SystemLog /etc/proftpd/proftpd.syslog 

TransferLog /var/log/xferlog
LogFormat awstats "%t %h %u %m %f %s %b"
ExtendedLog /var/log/xferlog read,write awstats&lt;/pre&gt; 在linux底下如何新增帳號： 
&lt;pre class="brush: bash; title: ; notranslate" title=""&gt;ftpasswd --passwd --file=/etc/proftpd/proftpd.passwd --name=test --uid=2000 --gid=1001 --home=/home/ftp --shell=/bin/false&lt;/pre&gt;</description></item><item><title>FreeBSD + Lighttpd + php + mysql 安裝過程</title><link>https://blog.wu-boy.com/2006/09/freebsd-lighttpd-php-mysql-%E5%AE%89%E8%A3%9D%E9%81%8E%E7%A8%8B/</link><pubDate>Wed, 20 Sep 2006 01:57:13 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/09/freebsd-lighttpd-php-mysql-%E5%AE%89%E8%A3%9D%E9%81%8E%E7%A8%8B/</guid><description>&lt;p&gt;系統環境 ：FreeBSD 6.0-RELEASE 安裝過程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;mysql-server-5.0.24a&lt;/li&gt;
&lt;li&gt;php5-5.1.6&lt;/li&gt;
&lt;li&gt;lighttpd-1.4.11_1 先安裝&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="http://www.lighttpd.net/" title="lighttpd"&gt;lighttpd&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;cd /usr/ports/www/lighttpd/ make config [X] OPENSSL Enable SSL support [ ] OPENLDAP Enable LDAP support [X] MYSQL Enable MYSQL support [X] IPV6 Enable IPV6 support [X] CML Enable Cache Meta Language support make install clean 安裝 &lt;a href="http://www.mysql.com/" title="mysql"&gt;mysql&lt;/a&gt; cd /usr/ports/databases/mysql50-server make install clean WITH_CHARSET=utf8 WITH_LINUXTHREADS=yes 安裝 &lt;a href="http://www.php.net" title="php"&gt;php&lt;/a&gt; cd /usr/ports/lang/php5 &lt;a target="_blank" href="http://photobucket.com/"&gt;&lt;img src="https://i0.wp.com/i108.photobucket.com/albums/n5/appleboy46/blog/1.gif?w=840" data-recalc-dims="1" /&gt; &lt;/a&gt; cd /usr/ports/lang/php5-extensions/ make config 選擇你想要的 extensions 灌好之後 就可以用了 然後打開 &lt;strong&gt;家目錄設定&lt;/strong&gt; userdir.path = “public_html” userdir.basepath = “/home/” 重點來了 如果執行網頁 http://localhost/phpinfo.php 出現 550 error 則你忘記執行fastcgi php-cgi -v PHP 5.1.6 (&lt;strong&gt;cgi-fcgi&lt;/strong&gt;) (built: Sep 19 2006 22:42:28) (DEBUG) Copyright (c) 1997-2006 The PHP Group Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies 然後執行 php-cgi -b 127.0.0.1:81 &amp;amp; 即可 port部份 隨機bind一個即可 &lt;a href="http://blog.wu-boy.com/wp-content/uploads/2007/03/lighttpd.txt"&gt;lighttpd 設定檔&lt;/a&gt;{#p83}&lt;/p&gt;</description></item><item><title>【好康】SEEDNET 學生方案申請只剩 10 天(申請至九月底止)</title><link>https://blog.wu-boy.com/2006/09/%E3%80%90%E5%A5%BD%E5%BA%B7%E3%80%91seednet-%E5%AD%B8%E7%94%9F%E6%96%B9%E6%A1%88%E7%94%B3%E8%AB%8B%E5%8F%AA%E5%89%A9-10-%E5%A4%A9%E7%94%B3%E8%AB%8B%E8%87%B3%E4%B9%9D%E6%9C%88%E5%BA%95%E6%AD%A2/</link><pubDate>Tue, 19 Sep 2006 01:06:45 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/09/%E3%80%90%E5%A5%BD%E5%BA%B7%E3%80%91seednet-%E5%AD%B8%E7%94%9F%E6%96%B9%E6%A1%88%E7%94%B3%E8%AB%8B%E5%8F%AA%E5%89%A9-10-%E5%A4%A9%E7%94%B3%E8%AB%8B%E8%87%B3%E4%B9%9D%E6%9C%88%E5%BA%95%E6%AD%A2/</guid><description>&lt;p&gt;來源：&lt;a href="http://www.pczone.com.tw/vbb3/showthread.php?t=124936" title="http://www.pczone.com.tw/vbb3/showthread.php?t=124936"&gt;http://www.pczone.com.tw/vbb3/showthread.php?t=124936&lt;/a&gt; SEEDNET 學生方案開放申請 (申請至九月底止) 「18個月均一價，免綁約，目前 ADSL 市場上最優惠的方案」 「此優惠方案僅供申請至9月底，錯過就要再等明年了!!」&lt;img border="0" onmouseover="this.style.cursor='hand';" alt="在新的瀏覽器視窗中開啟?" title="在新的瀏覽器視窗中開啟?" src="https://i2.wp.com/www.pczone.com.tw/images/banner-1.gif?w=840" data-recalc-dims="1" /&gt; 速率 費率 方案說明如下： ———————————————————– 1M / 64k　　前18個月 $180元/月，第19個月起 $399 2M / 256k 　前18個月 $240元/月，第19個月起 $440 8M / 640k 　前18個月 $360元/月，第19個月起 $550 注意事項： 1、僅限「新申請」或「異動ISP (異動ISP , 沒有加送一個月免費)」才能辦理 現有 SEEDNET 用戶無法&lt;font color="red"&gt;直接轉換或者退掉後立刻再申請&lt;/font&gt;此學生方案 2、前18個月為均一價 (累計年資，但無老客戶折扣)，第19個月起恢復牌價並享老客戶折扣。 3、方案期限 ：95/6/15 ~ 95/9/30 4、需提供「學生證件影本」方能申請 5、學生方案不享有好友推薦優惠 下載 SEEDNET 學生方案申請書： &lt;a target="_blank" href="http://www.pczone.com.tw/seednet/student.doc"&gt;&lt;font color="#0000ff"&gt; &lt;a href="http://www.pczone.com.tw/seednet/student.doc"&gt;http://www.pczone.com.tw/seednet/student.doc&lt;/a&gt; &lt;/font&gt;&lt;/a&gt; 詳細申請程序： &lt;a target="_blank" href="http://www.pczone.com.tw/seednet/html/student/2006/0616/14.html"&gt;&lt;font color="#0000ff"&gt; &lt;a href="http://www.pczone.com.tw/seednet/htm&amp;amp;#8230;6/0616/14.html"&gt;http://www.pczone.com.tw/seednet/htm&amp;amp;#8230;6/0616/14.html&lt;/a&gt; &lt;/font&gt;&lt;/a&gt; 若有不瞭解的地方，歡迎來電或 MSN 線上洽詢：&lt;img border="0" onmouseover="this.style.cursor='hand';" alt="在新的瀏覽器視窗中開啟?" title="在新的瀏覽器視窗中開啟?" src="https://i2.wp.com/www.pczone.com.tw/seednet/images/tel.gif?w=840" data-recalc-dims="1" /&gt;&lt;img border="0" onmouseover="this.style.cursor='hand';" alt="在新的瀏覽器視窗中開啟?" title="在新的瀏覽器視窗中開啟?" src="https://i1.wp.com/www.pczone.com.tw/seednet/images/fax.gif?w=840" data-recalc-dims="1" /&gt;&lt;img border="0" onmouseover="this.style.cursor='hand';" alt="在新的瀏覽器視窗中開啟?" title="在新的瀏覽器視窗中開啟?" src="https://i2.wp.com/www.pczone.com.tw/seednet/images/msn.gif?w=840" data-recalc-dims="1" /&gt;&lt;img border="0" onmouseover="this.style.cursor='hand';" alt="在新的瀏覽器視窗中開啟?" title="在新的瀏覽器視窗中開啟?" src="https://i2.wp.com/www.pczone.com.tw/seednet/images/email.gif?w=840" data-recalc-dims="1" /&gt;&lt;/p&gt;</description></item><item><title>Linux 大量建制帳號</title><link>https://blog.wu-boy.com/2006/09/linux-%E5%A4%A7%E9%87%8F%E5%BB%BA%E5%88%B6%E5%B8%B3%E8%99%9F/</link><pubDate>Mon, 18 Sep 2006 10:20:48 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/2006/09/linux-%E5%A4%A7%E9%87%8F%E5%BB%BA%E5%88%B6%E5%B8%B3%E8%99%9F/</guid><description>&lt;table cellspacing="0" cellpadding="0" border="0"&gt;
 &lt;tr&gt;
 &lt;td valign="top" style="width: 14px"&gt;
 &lt;/td&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;td bgcolor=&amp;quot;#fffff1&amp;quot;&amp;gt;
 &amp;lt;table width=&amp;quot;479&amp;quot; style=&amp;quot;table-layout: fixed; height: 86px&amp;quot;&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;
 &amp;lt;span class=&amp;quot;postbody&amp;quot;&amp;gt;&amp;lt;a title=&amp;quot;http://phorum.study-area.org/viewtopic.php?t=27276&amp;quot; href=&amp;quot;http://phorum.study-area.org/viewtopic.php?t=27276&amp;quot;&amp;gt;http://phorum.study-area.org/viewtopic.php?t=27276&amp;lt;/a&amp;gt; &amp;lt;a title=&amp;quot;http://linux.vbird.org/linux_basic/0410accountmanager.php#manual_amount&amp;quot; href=&amp;quot;http://linux.vbird.org/linux_basic/0410accountmanager.php#manual_amount&amp;quot;&amp;gt; http://linux.vbird.org/linux_basic/0410accountmanager.php#manual_amount&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/table&amp;gt;
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span class="postbody"&gt;for line in &lt;code&gt;cat account.txt&lt;/code&gt; do account=&lt;code&gt;echo $line | cut -d : -f 1&lt;/code&gt; passwd=&lt;code&gt;echo $line | cut -d : -f 2&lt;/code&gt; useradd -m $account echo $account:$passwd | chpasswd done&lt;/span&gt; &lt;span class="postbody"&gt;account.txt 格式:&lt;/span&gt; &lt;span class="postbody"&gt;account:password&lt;/span&gt;&lt;/p&gt;</description></item><item><title>關於我</title><link>https://blog.wu-boy.com/about/</link><pubDate>Thu, 22 Jun 2006 13:08:07 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/about/</guid><description>&lt;h2 id="personal-picture"&gt;Personal Picture：&lt;/h2&gt;
&lt;p&gt;&lt;a data-flickr-embed="true" href="https://www.flickr.com/photos/appleboy/22870317377/in/datetaken/" title="CIMG6600"&gt;&lt;img src="https://i2.wp.com/farm1.staticflickr.com/721/22870317377_7f9a6d09e5.jpg?resize=375%2C500&amp;#038;ssl=1" alt="CIMG6600" data-recalc-dims="1" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="personal-information"&gt;Personal Information：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;：Bo-Yi Wu (吳柏毅)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nick&lt;/strong&gt;：appleboy&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Birth Date&lt;/strong&gt;：Feb. 25th, 1983&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Email&lt;/strong&gt;：appleboy.tw AT gmail.com&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="education"&gt;Education：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;M.S &lt;a href="http://www.ccu.edu.tw"&gt;National Chung Cheng University&lt;/a&gt; Electric engineering ( 2007.09 ~ 2009.01)&lt;/li&gt;
&lt;li&gt;B.S &lt;a href="http://www.ndhu.edu.tw"&gt;National Dong Hwa University&lt;/a&gt; Electric engineering ( 2001.09 ~ 2005.06 )&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dmhs.kh.edu.tw/" title="http://www.dmhs.kh.edu.tw/"&gt;高雄市道明中學&lt;/a&gt; ( 1999.09 ~ 2001.06 )&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cysh.khc.edu.tw/index1.htm" title="http://www.cysh.khc.edu.tw/index1.htm"&gt;高雄市正義高中&lt;/a&gt; ( 1998.09 ~ 1999.06 )&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.inmjh.kh.edu.tw/" title="http://www.inmjh.kh.edu.tw/"&gt;高雄市英明國中&lt;/a&gt; ( 1995.09 ~ 1998.06 )&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.swps.kh.edu.tw/" title="http://www.swps.kh.edu.tw/"&gt;高雄市四維國小&lt;/a&gt; ( 1989.09 ~ 1995.06 )&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="specialty"&gt;Specialty：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Programming languages&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.perl.org/"&gt;Perl&lt;/a&gt;, Shell Program, C#, Java, C/C++, Python, Golang&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web development&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Frontend: CSS3, HTML5, &lt;a href="http://getbootstrap.com/"&gt;Bootstrap&lt;/a&gt;/&lt;a href="https://www.google.com/design/spec/material-design/introduction.html"&gt;Material Design&lt;/a&gt;, RWD, &lt;a href="https://babeljs.io/docs/learn-es2015/"&gt;ES2015&lt;/a&gt; / &lt;a href="https://github.com/tc39/ecma262"&gt;ES2016&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;, &lt;a href="https://facebook.github.io/react/"&gt;ReactJS&lt;/a&gt;, &lt;a href="http://backbonejs.org/"&gt;BackboneJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webpack.github.io/"&gt;Webpack&lt;/a&gt; / &lt;a href="http://requirejs.org/"&gt;RequireJS&lt;/a&gt; / &lt;a href="http://gruntjs.com/"&gt;GruntJS&lt;/a&gt; / &lt;a href="http://yeoman.io/"&gt;Yeoman&lt;/a&gt; / &lt;a href="http://gulpjs.com/"&gt;GulpJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lesscss.org/"&gt;LESS&lt;/a&gt; / &lt;a href="http://sass-lang.com/"&gt;SASS&lt;/a&gt; / &lt;a href="http://cssnext.io/"&gt;CSSNext&lt;/a&gt; / &lt;a href="https://github.com/postcss/postcss"&gt;PostCSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Backend: &lt;a href="http://www.php.net/"&gt;PHP&lt;/a&gt;, &lt;a href="http://www.asp.net/"&gt;ASP.NET&lt;/a&gt;, &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt;, &lt;a href="https://www.python.org/"&gt;Python&lt;/a&gt;, &lt;a href="https://golang.org/"&gt;Golang&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Database: &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt;, &lt;a href="http://www.postgresql.org/"&gt;Postgresql&lt;/a&gt;, MSSQL, &lt;a href="https://www.percona.com/software/mysql-database/percona-xtradb-cluster"&gt;Percona XtraDB Cluster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MVC: &lt;a href="http://codeigniter.org.tw/"&gt;CodeIgniter&lt;/a&gt;, &lt;a href="https://laravel.tw/"&gt;Laravel&lt;/a&gt;, &lt;a href="http://expressjs.com/"&gt;Express&lt;/a&gt;, &lt;a href="http://sailsjs.org/"&gt;SailsJS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System administration&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.freebsd.org/"&gt;FreeBSD&lt;/a&gt;&lt;strong&gt;,&lt;/strong&gt; Linux(&lt;a href="http://www.ubuntu-tw.org/"&gt;Ubuntu&lt;/a&gt;,&lt;a href="http://fedoraproject.org/"&gt;Fedora&lt;/a&gt;,&lt;a href="http://www.centos.com.tw/CentosWeb/index.htm"&gt;CentOS&lt;/a&gt;), &lt;a href="https://aws.amazon.com/tw/"&gt;Amazon Web Services&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="interests"&gt;Interests：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Computer Science &amp;amp; Programming&lt;/li&gt;
&lt;li&gt;Weight Training&lt;/li&gt;
&lt;li&gt;Mountain-climbing&lt;/li&gt;
&lt;li&gt;Movie&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="project-程式相關作品集可以參考"&gt;Project： 程式相關作品集可以參考&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/appleboy"&gt;Github 連結&lt;/a&gt;&lt;/p&gt;</description></item><item><title>歷年文章</title><link>https://blog.wu-boy.com/archives/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>appleboy.tw@gmail.com (Appleboy)</author><guid>https://blog.wu-boy.com/archives/</guid><description>歷年文章</description></item></channel></rss>