<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>戲中話</title><link>https://blog.iphpo.com/</link><description>Recent content on 戲中話</description><generator>Hugo</generator><language>zh-tw</language><managingEditor>herb09638@gmail.com (Herb)</managingEditor><webMaster>herb09638@gmail.com (Herb)</webMaster><lastBuildDate>Thu, 14 Nov 2019 23:50:29 +0800</lastBuildDate><atom:link href="https://blog.iphpo.com/index.xml" rel="self" type="application/rss+xml"/><item><title>[Golang] 解決 Go 1.13 之後下載私有倉庫專案錯誤(410 Gone)</title><link>https://blog.iphpo.com/blog/2019/golang-%E8%A7%A3%E6%B1%BA-go-1.13-%E4%B9%8B%E5%BE%8C%E4%B8%8B%E8%BC%89%E7%A7%81%E6%9C%89%E5%80%89%E5%BA%AB%E5%B0%88%E6%A1%88%E9%8C%AF%E8%AA%A4/</link><pubDate>Thu, 14 Nov 2019 23:50:29 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2019/golang-%E8%A7%A3%E6%B1%BA-go-1.13-%E4%B9%8B%E5%BE%8C%E4%B8%8B%E8%BC%89%E7%A7%81%E6%9C%89%E5%80%89%E5%BA%AB%E5%B0%88%E6%A1%88%E9%8C%AF%E8%AA%A4/</guid><description>Go 1.13 之後會預設 GOPROXY 為 proxy.golang.org，導致私有專案無法被檢查checksum，然後下載失敗</description></item><item><title>[Ubuntu] MySQL 5.7 無痛升級到 8.0</title><link>https://blog.iphpo.com/blog/2019/ubuntu-mysql5.7%E7%84%A1%E7%97%9B%E5%8D%87%E7%B4%9A%E5%88%B08.0/</link><pubDate>Wed, 15 May 2019 22:53:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2019/ubuntu-mysql5.7%E7%84%A1%E7%97%9B%E5%8D%87%E7%B4%9A%E5%88%B08.0/</guid><description>完整紀錄從Mysql 5.7 升級到 8.0 的過程</description></item><item><title>升級編譯 sshd 8.0 並移除版本資訊</title><link>https://blog.iphpo.com/blog/2019/%E5%8D%87%E7%B4%9A%E7%B7%A8%E8%AD%AF-sshd-8.0-%E4%B8%A6%E7%A7%BB%E9%99%A4%E7%89%88%E6%9C%AC%E8%B3%87%E8%A8%8A/</link><pubDate>Sun, 05 May 2019 01:00:29 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2019/%E5%8D%87%E7%B4%9A%E7%B7%A8%E8%AD%AF-sshd-8.0-%E4%B8%A6%E7%A7%BB%E9%99%A4%E7%89%88%E6%9C%AC%E8%B3%87%E8%A8%8A/</guid><description>自己從source編譯的好處是可以隱藏版本資訊，並能即時更新到最新版本，修復各種新發現的漏洞</description></item><item><title>Nchan Summary</title><link>https://blog.iphpo.com/blog/nchan/summary/</link><pubDate>Sat, 29 Dec 2018 16:28:29 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/nchan/summary/</guid><description>&lt;h1 id="summary"&gt;Summary&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;大綱&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/03/%E5%8D%B3%E6%99%82%E9%80%9A%E7%9F%A5%E7%B3%BB%E7%B5%B1%E7%B0%A1%E4%BB%8B/"&gt;即時通知系統簡介&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/03/nchan-%E7%89%B9%E8%89%B2/"&gt;Nchan 特色&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/03/%E5%AE%89%E8%A3%9Dnchan/"&gt;安裝 Nchan&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;用套件管理程式安裝&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/03/nchan%E5%AE%89%E8%A3%9D-%E7%B7%A8%E8%AD%AF%E5%8E%9F%E5%A7%8B%E7%A2%BC-install-nginx-from-source/"&gt;編譯原始碼&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/03/%E4%BD%BF%E7%94%A8docker%E5%95%9F%E5%8B%95-install-nchan-docker/"&gt;使用 Docker 啟動&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/04/nchan-%E5%9F%BA%E7%A4%8E%E8%A8%AD%E5%AE%9A-basic-setting/"&gt;基礎設定&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/04/nchan-%E5%9F%BA%E7%A4%8E%E8%A8%AD%E5%AE%9A%E5%AF%A6%E4%BD%9C/"&gt;基礎設定實作&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/04/nchan-%E9%A0%BB%E9%81%93-channel-id/"&gt;頻道 Channel ID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/04/nchan-%E9%A0%BB%E9%81%93-group-id/"&gt;頻道 Group ID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/04/%E7%99%BC%E4%BD%88%E8%80%85publisher%E8%A8%AD%E5%AE%9A/"&gt;發佈者(Publisher)設定&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/04/nchan-%E8%A8%82%E9%96%B1%E8%80%85subscriber%E8%A8%AD%E5%AE%9A/"&gt;訂閱者(Subscriber)設定&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/04/nchan-%E5%90%8C%E6%99%82%E6%94%AF%E6%8F%B4%E7%99%BC%E4%BD%88%E8%88%87%E8%A8%82%E9%96%B1pubsub%E8%A8%AD%E5%AE%9A/"&gt;同時支援發佈與訂閱(PubSub)設定&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/04/nchan-%E8%88%87%E5%BE%8C%E7%AB%AF%E7%A8%8B%E5%BC%8F%E7%9A%84%E7%B5%90%E5%90%88/"&gt;Nchan 與後端程式的結合&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/04/nchan-%E8%A8%82%E9%96%B1%E8%80%85%E4%B8%8A%E7%B7%9A%E8%88%87%E4%B8%8B%E7%B7%9A%E9%80%9A%E7%9F%A5/"&gt;訂閱者上線與下線通知&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/04/nchan-%E8%A8%82%E9%96%B1%E8%88%87%E7%99%BC%E4%BD%88%E6%99%82%E7%9A%84%E9%A9%97%E8%AD%89/"&gt;訂閱與發佈時的驗證&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/04/nchan-%E8%A8%8A%E6%81%AF%E8%BD%89%E7%99%BC/"&gt;訊息轉發&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;安全性設置
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/04/nchan-%E7%99%BC%E4%BD%88%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7%E8%A8%AD%E7%BD%AE/"&gt;發佈的安全性設置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/04/nchan-%E8%A8%82%E9%96%B1%E7%9A%84%E5%AE%89%E5%85%A8%E8%A8%AD%E7%BD%AE/"&gt;訂閱的安全性設置&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/04/nchan-%E5%A6%82%E4%BD%95%E6%B0%B4%E5%B9%B3%E6%93%B4%E5%B1%95%E8%88%87%E9%81%94%E5%88%B0%E9%AB%98%E5%8F%AF%E7%94%A8%E6%80%A7high-availability/"&gt;如何水平擴展與達到高可用性(HA)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>判斷兩線斷相交</title><link>https://blog.iphpo.com/blog/2018-12/%E5%88%A4%E6%96%B7%E5%85%A9%E7%B7%9A%E6%96%B7%E7%9B%B8%E4%BA%A4/</link><pubDate>Sat, 29 Dec 2018 16:28:29 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018-12/%E5%88%A4%E6%96%B7%E5%85%A9%E7%B7%9A%E6%96%B7%E7%9B%B8%E4%BA%A4/</guid><description>利用向量積判斷 AB 線段與 CD 線段是否相交</description></item><item><title>利用Yubikey登入遠端SSH主機</title><link>https://blog.iphpo.com/blog/2018/04/%E5%88%A9%E7%94%A8yubikey%E7%99%BB%E5%85%A5%E9%81%A0%E7%AB%AFssh%E4%B8%BB%E6%A9%9F-yubikey-login-ssh/</link><pubDate>Sun, 29 Apr 2018 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/04/%E5%88%A9%E7%94%A8yubikey%E7%99%BB%E5%85%A5%E9%81%A0%E7%AB%AFssh%E4%B8%BB%E6%A9%9F-yubikey-login-ssh/</guid><description>&lt;p&gt;Yubikey 是一個硬體鎖&lt;/p&gt;
&lt;p&gt;可以產生金鑰並把私鑰儲存在上面&lt;/p&gt;
&lt;p&gt;這次就是要利用這個特性&lt;/p&gt;
&lt;p&gt;來登入遠端主機的SSH服務&lt;/p&gt;
&lt;p&gt;這樣除非拿到這個硬體裝置&lt;/p&gt;
&lt;p&gt;不然沒有人可以登入你的伺服器&lt;/p&gt;
&lt;p&gt;首先我是&lt;a href="https://medium.com/@SSWilsonKao/%E5%A6%82%E4%BD%95%E5%9C%A8-mac-%E4%B8%8A-%E6%8A%8A-yubikey-%E8%88%87-gpg-ssh-%E6%90%AD%E9%85%8D%E5%9C%A8%E4%B8%80%E8%B5%B7-5f842d20ad6a"&gt;照著&lt;/a&gt;這篇文章來做&lt;/p&gt;
&lt;p&gt;但因為在Mac上有一些變化需要更新&lt;/p&gt;
&lt;p&gt;所以我就整理我的步驟讓整個流程更順利些&lt;/p&gt;</description></item><item><title>Nchan - 如何水平擴展與達到高可用性(High Availability)</title><link>https://blog.iphpo.com/blog/2018/04/nchan-%E5%A6%82%E4%BD%95%E6%B0%B4%E5%B9%B3%E6%93%B4%E5%B1%95%E8%88%87%E9%81%94%E5%88%B0%E9%AB%98%E5%8F%AF%E7%94%A8%E6%80%A7high-availability/</link><pubDate>Sun, 15 Apr 2018 12:01:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/04/nchan-%E5%A6%82%E4%BD%95%E6%B0%B4%E5%B9%B3%E6%93%B4%E5%B1%95%E8%88%87%E9%81%94%E5%88%B0%E9%AB%98%E5%8F%AF%E7%94%A8%E6%80%A7high-availability/</guid><description>&lt;h1 id="如何水平擴展與達到高可用性high-availability"&gt;如何水平擴展與達到高可用性(High Availability)&lt;/h1&gt;
&lt;p&gt;Nchan可將訊息儲存在檔案、記憶體與Redis，速度最快的是儲存在記憶體裡，但如果重開機訊息就會不見，而且如果需要兩台做Load Balance，彼此之間的訊息也無法同步，很可能造成A連線上第一台，B卻往第二台發送訊息，卻永遠發送不到的狀況發生，所以要做到水平擴展，勢必要跟Redis做結合，而在Nchan要做到這件事，也相當容易。&lt;/p&gt;</description></item><item><title>Nchan - 發佈的安全性設置</title><link>https://blog.iphpo.com/blog/2018/04/nchan-%E7%99%BC%E4%BD%88%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7%E8%A8%AD%E7%BD%AE/</link><pubDate>Sun, 15 Apr 2018 12:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/04/nchan-%E7%99%BC%E4%BD%88%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7%E8%A8%AD%E7%BD%AE/</guid><description>&lt;h1 id="發佈的安全性設置"&gt;發佈的安全性設置&lt;/h1&gt;
&lt;p&gt;官方的建議，是將發佈的端點完全隱藏，只允許local存取發佈的位置。&lt;/p&gt;</description></item><item><title>Nchan - 訂閱的安全設置</title><link>https://blog.iphpo.com/blog/2018/04/nchan-%E8%A8%82%E9%96%B1%E7%9A%84%E5%AE%89%E5%85%A8%E8%A8%AD%E7%BD%AE/</link><pubDate>Sun, 15 Apr 2018 11:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/04/nchan-%E8%A8%82%E9%96%B1%E7%9A%84%E5%AE%89%E5%85%A8%E8%A8%AD%E7%BD%AE/</guid><description>&lt;h1 id="訂閱的安全設置"&gt;訂閱的安全設置&lt;/h1&gt;
&lt;p&gt;在訂閱的安全方面，官方建議三種做法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;產生編碼過的Channel ID&lt;/li&gt;
&lt;li&gt;使用&lt;code&gt;nchan_authorize_request&lt;/code&gt;做驗證&lt;/li&gt;
&lt;li&gt;使用&lt;code&gt;X-Accel-Redirect&lt;/code&gt;隱藏Channel ID&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>在CentOS7修改由systemd控制的service開檔數目限制</title><link>https://blog.iphpo.com/blog/2018/04/%E5%9C%A8centos7%E4%BF%AE%E6%94%B9%E7%94%B1systemd%E6%8E%A7%E5%88%B6%E7%9A%84service%E9%96%8B%E6%AA%94%E6%95%B8%E7%9B%AE%E9%99%90%E5%88%B6-edit-open-file-limit-on-centos7-systemd/</link><pubDate>Sun, 15 Apr 2018 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/04/%E5%9C%A8centos7%E4%BF%AE%E6%94%B9%E7%94%B1systemd%E6%8E%A7%E5%88%B6%E7%9A%84service%E9%96%8B%E6%AA%94%E6%95%B8%E7%9B%AE%E9%99%90%E5%88%B6-edit-open-file-limit-on-centos7-systemd/</guid><description>&lt;p&gt;今天在解決C10K問題的時候&lt;/p&gt;
&lt;p&gt;發現一般Linux可以在sysctl控制開檔數目&lt;/p&gt;
&lt;p&gt;但是在CentOS7一直被限制在1024個而已&lt;/p&gt;
&lt;p&gt;不管任何修改方式都一樣&lt;/p&gt;</description></item><item><title>Nchan - 與後端程式的結合</title><link>https://blog.iphpo.com/blog/2018/04/nchan-%E8%88%87%E5%BE%8C%E7%AB%AF%E7%A8%8B%E5%BC%8F%E7%9A%84%E7%B5%90%E5%90%88/</link><pubDate>Mon, 09 Apr 2018 10:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/04/nchan-%E8%88%87%E5%BE%8C%E7%AB%AF%E7%A8%8B%E5%BC%8F%E7%9A%84%E7%B5%90%E5%90%88/</guid><description>&lt;h1 id="nchan與後端程式的結合"&gt;Nchan與後端程式的結合&lt;/h1&gt;
&lt;p&gt;我之所以推薦nchan，是因為他可以與現有程式做緊密結合，包括但不限於&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/04/nchan-%E8%A8%82%E9%96%B1%E8%80%85%E4%B8%8A%E7%B7%9A%E8%88%87%E4%B8%8B%E7%B7%9A%E9%80%9A%E7%9F%A5/"&gt;訂閱者上線與下線通知&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/04/nchan-%E8%A8%82%E9%96%B1%E8%88%87%E7%99%BC%E4%BD%88%E6%99%82%E7%9A%84%E9%A9%97%E8%AD%89/"&gt;訊息轉發&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/04/nchan-%E8%A8%8A%E6%81%AF%E8%BD%89%E7%99%BC/"&gt;訂閱與發佈時的驗證&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;當然還有更多的應用場景，這邊只列出我有用到的部分，其他可以參考&lt;a href="https://nchan.io/#hooks-and-callbacks"&gt;官方網站的Hooks and Callbacks&lt;/a&gt;章節。&lt;/p&gt;</description></item><item><title>Nchan - 訂閱者上線與下線通知</title><link>https://blog.iphpo.com/blog/2018/04/nchan-%E8%A8%82%E9%96%B1%E8%80%85%E4%B8%8A%E7%B7%9A%E8%88%87%E4%B8%8B%E7%B7%9A%E9%80%9A%E7%9F%A5/</link><pubDate>Mon, 09 Apr 2018 09:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/04/nchan-%E8%A8%82%E9%96%B1%E8%80%85%E4%B8%8A%E7%B7%9A%E8%88%87%E4%B8%8B%E7%B7%9A%E9%80%9A%E7%9F%A5/</guid><description>&lt;h1 id="訂閱者上線與下線通知"&gt;訂閱者上線與下線通知&lt;/h1&gt;
&lt;p&gt;上線與下線，其實只是該設定的其中一種應用，要達到此種效果，使用的是nchan提供的&lt;code&gt;nchan_subscribe_request&lt;/code&gt;與&lt;code&gt;nchan_unsubscribe_request&lt;/code&gt;這兩個設定。&lt;/p&gt;
&lt;p&gt;顧名思義，就是在訂閱者訂閱時發送一個request到後端伺服器，進而達到上線追蹤的功能，但也不限定此種應用，要如何應用，全由通知的後端伺服器來決定。&lt;/p&gt;</description></item><item><title>Nchan - 訂閱與發佈時的驗證</title><link>https://blog.iphpo.com/blog/2018/04/nchan-%E8%A8%82%E9%96%B1%E8%88%87%E7%99%BC%E4%BD%88%E6%99%82%E7%9A%84%E9%A9%97%E8%AD%89/</link><pubDate>Mon, 09 Apr 2018 08:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/04/nchan-%E8%A8%82%E9%96%B1%E8%88%87%E7%99%BC%E4%BD%88%E6%99%82%E7%9A%84%E9%A9%97%E8%AD%89/</guid><description>&lt;h1 id="訂閱與發佈時的驗證"&gt;訂閱與發佈時的驗證&lt;/h1&gt;
&lt;p&gt;這是一個滿重要的應用，想像一個場景，在聊天室裡，每個人有自己的channel id，如果沒有經過身份驗證，任何一個人都可以訂閱別人的channel，代表大家的聊天訊息會被監聽，或是沒有經過驗證，就可以隨意發送訊息給任意的人，這都是很危險的情況。&lt;/p&gt;
&lt;p&gt;在Nchan裡它提供了&lt;code&gt;nchan_authorize_request&lt;/code&gt;的設定，這不管是訂閱的路徑還是發佈的路徑都可以使用。&lt;/p&gt;</description></item><item><title>Nchan - 訊息轉發</title><link>https://blog.iphpo.com/blog/2018/04/nchan-%E8%A8%8A%E6%81%AF%E8%BD%89%E7%99%BC/</link><pubDate>Mon, 09 Apr 2018 07:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/04/nchan-%E8%A8%8A%E6%81%AF%E8%BD%89%E7%99%BC/</guid><description>&lt;h1 id="訊息轉發"&gt;訊息轉發&lt;/h1&gt;
&lt;p&gt;訊息轉發可以讓後端伺服器接收傳來的訊息，可以儲存、處理甚至修改原有的訊息。&lt;/p&gt;</description></item><item><title>Nchan - 同時支援發佈與訂閱(PubSub)設定</title><link>https://blog.iphpo.com/blog/2018/04/nchan-%E5%90%8C%E6%99%82%E6%94%AF%E6%8F%B4%E7%99%BC%E4%BD%88%E8%88%87%E8%A8%82%E9%96%B1pubsub%E8%A8%AD%E5%AE%9A/</link><pubDate>Thu, 05 Apr 2018 06:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/04/nchan-%E5%90%8C%E6%99%82%E6%94%AF%E6%8F%B4%E7%99%BC%E4%BD%88%E8%88%87%E8%A8%82%E9%96%B1pubsub%E8%A8%AD%E5%AE%9A/</guid><description>&lt;h1 id="同時支援發佈與訂閱pubsub設定"&gt;同時支援發佈與訂閱(PubSub)設定&lt;/h1&gt;
&lt;p&gt;Nchan也支援同時可以訂閱與發佈的設定，這對WebSocket全雙工的通道來說，是最方便的，連上一個位置，就可以訂閱訊息也可以發送訊息到同個channel。&lt;/p&gt;</description></item><item><title>Nchan - 發佈者(Publisher)設定</title><link>https://blog.iphpo.com/blog/2018/04/%E7%99%BC%E4%BD%88%E8%80%85publisher%E8%A8%AD%E5%AE%9A/</link><pubDate>Thu, 05 Apr 2018 05:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/04/%E7%99%BC%E4%BD%88%E8%80%85publisher%E8%A8%AD%E5%AE%9A/</guid><description>&lt;h1 id="發佈者40publisher41設定"&gt;發佈者(Publisher)設定&lt;/h1&gt;
&lt;p&gt;可以從之前章節發現，要讓某個位置成為發佈的端點，只需要加入&lt;code&gt;nchan_publisher&lt;/code&gt;的關鍵字，至於要發送到哪個channel則是設定&lt;code&gt;nchan_channel_id&lt;/code&gt;跟&lt;code&gt;nchan_channel_group&lt;/code&gt;即可。&lt;/p&gt;
&lt;p&gt;除了使用WebSocket發送訊息之外，Nchan還提供一般的HTTP POST方式發送訊息，以下用curl作為範例。&lt;/p&gt;
&lt;p&gt;假設在&lt;code&gt;/pub&lt;/code&gt;位置設定了publisher&lt;/p&gt;</description></item><item><title>Nchan - 訂閱者(Subscriber)設定</title><link>https://blog.iphpo.com/blog/2018/04/nchan-%E8%A8%82%E9%96%B1%E8%80%85subscriber%E8%A8%AD%E5%AE%9A/</link><pubDate>Thu, 05 Apr 2018 04:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/04/nchan-%E8%A8%82%E9%96%B1%E8%80%85subscriber%E8%A8%AD%E5%AE%9A/</guid><description>&lt;h1 id="訂閱者40subscriber41設定"&gt;訂閱者(Subscriber)設定&lt;/h1&gt;
&lt;p&gt;Nchan提供多種訂閱方式，包括&lt;a href="https://nchan.io/#websocket"&gt;WebSocket&lt;/a&gt;、&lt;a href="https://nchan.io/#eventsource"&gt;EventSource&lt;/a&gt;、&lt;a href="https://nchan.io/#long-polling"&gt;Long Poll&lt;/a&gt;、&lt;a href="https://nchan.io/#interval-polling"&gt;Interval-Poll&lt;/a&gt;、&lt;a href="https://nchan.io/#http-chunked-transfer"&gt;HTTP Chunked Transfer&lt;/a&gt;、&lt;a href="https://nchan.io/#http-multipart-mixed"&gt;HTTP multipart/mixed，&lt;/a&gt;但我只有使用過WebSocket，所以會以WebSocket為主，若對其他方式有興趣的可以到&lt;a href="https://nchan.io"&gt;nchan官方&lt;/a&gt;網站上查看。&lt;/p&gt;
&lt;p&gt;經過前面幾個章節，大家一定都已經知道，要讓某個位置變成可訂閱，只需要加上&lt;code&gt;nchan_subscriber&lt;/code&gt;的關鍵字&lt;/p&gt;</description></item><item><title>Nchan - 頻道 Channel ID</title><link>https://blog.iphpo.com/blog/2018/04/nchan-%E9%A0%BB%E9%81%93-channel-id/</link><pubDate>Sun, 01 Apr 2018 03:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/04/nchan-%E9%A0%BB%E9%81%93-channel-id/</guid><description>&lt;h1 id="頻道-channel-id"&gt;頻道 Channel ID&lt;/h1&gt;
&lt;p&gt;經過以上實作&lt;/p&gt;
&lt;p&gt;可以發現channel id是nchan流通資訊的識別ID&lt;/p&gt;
&lt;p&gt;所以在設定channel id時就特別重要&lt;/p&gt;
&lt;p&gt;以下提供三種設定方式&lt;/p&gt;</description></item><item><title>Nchan - 頻道 Group ID</title><link>https://blog.iphpo.com/blog/2018/04/nchan-%E9%A0%BB%E9%81%93-group-id/</link><pubDate>Sun, 01 Apr 2018 02:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/04/nchan-%E9%A0%BB%E9%81%93-group-id/</guid><description>&lt;h1 id="頻道-group-id"&gt;頻道 Group ID&lt;/h1&gt;
&lt;p&gt;Group ID是用來輔助Channel ID的，在某些設計下，channel ID會有重複的情況，Group ID則是避免在Channel ID重複下，彼此收到同樣的訊息。&lt;/p&gt;</description></item><item><title>Nchan 基礎設定實作</title><link>https://blog.iphpo.com/blog/2018/04/nchan-%E5%9F%BA%E7%A4%8E%E8%A8%AD%E5%AE%9A%E5%AF%A6%E4%BD%9C/</link><pubDate>Sun, 01 Apr 2018 01:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/04/nchan-%E5%9F%BA%E7%A4%8E%E8%A8%AD%E5%AE%9A%E5%AF%A6%E4%BD%9C/</guid><description>&lt;h1 id="基礎設定實作"&gt;基礎設定實作&lt;/h1&gt;
&lt;p&gt;我們把剛剛提到的基礎設定放進nginx，並用docker跑起來實驗看看&lt;/p&gt;
&lt;p&gt;直接修改 nginx.vh.default.conf 並加入&lt;/p&gt;</description></item><item><title>Nchan 基礎設定</title><link>https://blog.iphpo.com/blog/2018/04/nchan-%E5%9F%BA%E7%A4%8E%E8%A8%AD%E5%AE%9A-basic-setting/</link><pubDate>Sun, 01 Apr 2018 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/04/nchan-%E5%9F%BA%E7%A4%8E%E8%A8%AD%E5%AE%9A-basic-setting/</guid><description>&lt;h1 id="基礎設定"&gt;基礎設定&lt;/h1&gt;
&lt;p&gt;nchan提供了pub/sub的功能，所以最主要設定也會圍繞在這兩者之上&lt;/p&gt;
&lt;p&gt;最基礎的設定，就是指定兩個固定位置，提供pub/sub的功能&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#...
http { 
 server {
 #...

 location = /sub {
 nchan_subscriber;
 nchan_channel_id $arg_id;
 }

 location = /pub {
 nchan_publisher;
 nchan_channel_id $arg_id;
 }
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這裡使用query string(get參數)id當作channel id&lt;/p&gt;</description></item><item><title>Golang 的跨平台編譯</title><link>https://blog.iphpo.com/blog/2018/03/golang-%E7%9A%84%E8%B7%A8%E5%B9%B3%E5%8F%B0%E7%B7%A8%E8%AD%AF/</link><pubDate>Sat, 31 Mar 2018 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/03/golang-%E7%9A%84%E8%B7%A8%E5%B9%B3%E5%8F%B0%E7%B7%A8%E8%AD%AF/</guid><description>&lt;p&gt;Golang 可在任何平台上做 cross compile&lt;/p&gt;
&lt;p&gt;所以可以在MacOSX編譯出Linux的可執行檔&lt;/p&gt;
&lt;p&gt;只要給定編譯平台的環境變數&lt;/p&gt;
&lt;p&gt;go build時就會依照環境變數&lt;/p&gt;
&lt;p&gt;編譯出相對應的平台&lt;/p&gt;</description></item><item><title>Nchan安裝 - 使用Docker</title><link>https://blog.iphpo.com/blog/2018/03/%E4%BD%BF%E7%94%A8docker%E5%95%9F%E5%8B%95-install-nchan-docker/</link><pubDate>Mon, 26 Mar 2018 05:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/03/%E4%BD%BF%E7%94%A8docker%E5%95%9F%E5%8B%95-install-nchan-docker/</guid><description>&lt;h1 id="使用docker啟動"&gt;使用Docker啟動&lt;/h1&gt;
&lt;h2 id="使用別人製作好的image"&gt;使用別人製作好的image&lt;/h2&gt;
&lt;p&gt;可以使用我製作好的docker image&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker run -p 80:80 herb123456/nchan-alpine
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Google後有其他人也有製作nchan的docker image&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker run -p 80:80 meroje/alpine-nchan
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只是版本還停留在1.1.5&lt;/p&gt;
&lt;h2 id="從nginx官方docker-file修改40建議41"&gt;從nginx官方Docker file修改(建議)&lt;/h2&gt;
&lt;p&gt;自己修改dockerfile不僅自由度高，掌握度也比較高，而且也不難，讓我們先看看nginx官方dockerfile長怎樣吧。&lt;/p&gt;</description></item><item><title>Nchan安裝 - 編譯原始碼</title><link>https://blog.iphpo.com/blog/2018/03/nchan%E5%AE%89%E8%A3%9D-%E7%B7%A8%E8%AD%AF%E5%8E%9F%E5%A7%8B%E7%A2%BC-install-nginx-from-source/</link><pubDate>Mon, 26 Mar 2018 04:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/03/nchan%E5%AE%89%E8%A3%9D-%E7%B7%A8%E8%AD%AF%E5%8E%9F%E5%A7%8B%E7%A2%BC-install-nginx-from-source/</guid><description>&lt;h1 id="編譯原始碼"&gt;編譯原始碼&lt;/h1&gt;
&lt;p&gt;以下流程皆是在CentOS 7下進行，其他系統雖有不同，但都大同小異。&lt;/p&gt;
&lt;h2 id="編譯前的準備"&gt;編譯前的準備&lt;/h2&gt;
&lt;p&gt;安裝編譯所需套件&lt;/p&gt;</description></item><item><title>安裝Nchan</title><link>https://blog.iphpo.com/blog/2018/03/%E5%AE%89%E8%A3%9Dnchan/</link><pubDate>Mon, 26 Mar 2018 03:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/03/%E5%AE%89%E8%A3%9Dnchan/</guid><description>&lt;h1 id="安裝nchan"&gt;安裝Nchan&lt;/h1&gt;
&lt;p&gt;安裝方法有三種&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用套件管理程式安裝&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/03/nchan%E5%AE%89%E8%A3%9D-%E7%B7%A8%E8%AD%AF%E5%8E%9F%E5%A7%8B%E7%A2%BC-install-nginx-from-source/"&gt;編譯原始碼&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.iphpo.com/blog/2018/03/%E4%BD%BF%E7%94%A8docker%E5%95%9F%E5%8B%95-install-nchan-docker/"&gt;使用Docker&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;選擇適合自己的方式即可&lt;/p&gt;</description></item><item><title>Nchan 特色</title><link>https://blog.iphpo.com/blog/2018/03/nchan-%E7%89%B9%E8%89%B2/</link><pubDate>Mon, 26 Mar 2018 02:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/03/nchan-%E7%89%B9%E8%89%B2/</guid><description>&lt;h1 id="nchan-特色"&gt;Nchan 特色&lt;/h1&gt;
&lt;h2 id="nchan-簡介"&gt;Nchan 簡介&lt;/h2&gt;
&lt;p&gt;Nchan是Nginx與Channel兩個字的新造字，顧名思義Nchan是一個Nginx的module，所以帶有Nginx的可擴展性，與多種服務結合的高彈性，甚至可輕鬆與現有後端程式結合，並支援將訊息暫存在記憶體、檔案或Redis內，不僅提高訊息傳遞效率，與Redis Cluster結合更可達到無縫水平擴展的強大韌性。&lt;/p&gt;</description></item><item><title>即時通知系統簡介</title><link>https://blog.iphpo.com/blog/2018/03/%E5%8D%B3%E6%99%82%E9%80%9A%E7%9F%A5%E7%B3%BB%E7%B5%B1%E7%B0%A1%E4%BB%8B/</link><pubDate>Mon, 26 Mar 2018 01:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/03/%E5%8D%B3%E6%99%82%E9%80%9A%E7%9F%A5%E7%B3%BB%E7%B5%B1%E7%B0%A1%E4%BB%8B/</guid><description>&lt;h1 id="即時通知系統簡介"&gt;即時通知系統簡介&lt;/h1&gt;
&lt;p&gt;即時通知系統，顧名思義，就是在 發佈者（Publisher） 發佈訊息時能立即通知所有 訂閱者（Subscriber），實際例子就像Facebook的訊息牆，只要好友發了一則動態，我不必重新整理頁面，即可立即收到通知，我的好友即是發佈者，而我則是訂閱者。&lt;/p&gt;
&lt;p&gt;在過去（約十幾年前），要達到這樣的效果，必須讓Client端不斷向伺服器發出詢問，才能在短時間內知道變化，此種方法耗費大量無謂的系統資源，最差情況是從上線到下線都無任何新訊息，但Client卻向伺服器發出了上萬次的請求，最終都得到無任何變化的回覆，此種方式稱為Polling。&lt;/p&gt;</description></item><item><title>利用 Nchan 快速打造即時聊天系統</title><link>https://blog.iphpo.com/blog/2018/03/%E5%88%A9%E7%94%A8-nchan-%E5%BF%AB%E9%80%9F%E6%89%93%E9%80%A0%E5%8D%B3%E6%99%82%E8%81%8A%E5%A4%A9%E7%B3%BB%E7%B5%B1/</link><pubDate>Mon, 26 Mar 2018 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/03/%E5%88%A9%E7%94%A8-nchan-%E5%BF%AB%E9%80%9F%E6%89%93%E9%80%A0%E5%8D%B3%E6%99%82%E8%81%8A%E5%A4%A9%E7%B3%BB%E7%B5%B1/</guid><description>&lt;h1 id="利用-nchan-快速打造即時聊天系統"&gt;利用 Nchan 快速打造即時聊天系統&lt;/h1&gt;
&lt;p&gt;此一系列文章，將教導大家如何使用 Nchan 融入現有系統，極快速的時間將未有 Server push 的傳統 Web Application，瞬間變成可主動通知使用者的即時通知系統。&lt;/p&gt;</description></item><item><title>UPSERT in MySQL and Oracle</title><link>https://blog.iphpo.com/blog/2018/02/upsert-mysql-oracle/</link><pubDate>Mon, 19 Feb 2018 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/02/upsert-mysql-oracle/</guid><description>&lt;p&gt;UPSERT 是由 Update 和 Insert 所組成的&lt;/p&gt;
&lt;p&gt;顧名思義就是用一道SQL指令&lt;/p&gt;
&lt;p&gt;完成Insert或Update的動作&lt;/p&gt;
&lt;p&gt;這通常用在不知道這筆資料新增過了沒&lt;/p&gt;
&lt;p&gt;往往要先下一道SELECT確認之後&lt;/p&gt;
&lt;p&gt;再用SELECT結果判斷要 Insert 還是 Update&lt;/p&gt;
&lt;p&gt;而如果用 UPSERT 語法就可以用一道SQL完成這件事&lt;/p&gt;</description></item><item><title>kubernetes 切換 cluster</title><link>https://blog.iphpo.com/blog/2018/01/kubernetes-%E5%88%87%E6%8F%9B-cluster/</link><pubDate>Sat, 27 Jan 2018 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/01/kubernetes-%E5%88%87%E6%8F%9B-cluster/</guid><description>&lt;p&gt;在學習時&lt;/p&gt;
&lt;p&gt;通常都是使用 minikube&lt;/p&gt;
&lt;p&gt;來練習各種指令&lt;/p&gt;</description></item><item><title>kops 建立 cluster 時加入 insecure registry</title><link>https://blog.iphpo.com/blog/2018/01/kops-%E5%BB%BA%E7%AB%8B-cluster-%E6%99%82%E5%8A%A0%E5%85%A5-insecure-registry/</link><pubDate>Thu, 25 Jan 2018 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/01/kops-%E5%BB%BA%E7%AB%8B-cluster-%E6%99%82%E5%8A%A0%E5%85%A5-insecure-registry/</guid><description>&lt;p&gt;用 kops 可以輕易在 aws or gcp 上建立 kubernetes cluster&lt;/p&gt;
&lt;p&gt;但如果有自己的私人倉庫&lt;/p&gt;
&lt;p&gt;又沒有為這個倉庫買憑證的話&lt;/p&gt;
&lt;p&gt;就會遇到 pull 不了 image 的問題&lt;/p&gt;</description></item><item><title>產生自簽的SSL憑證</title><link>https://blog.iphpo.com/blog/2018/01/%E7%94%A2%E7%94%9F%E8%87%AA%E7%B0%BD%E7%9A%84ssl%E6%86%91%E8%AD%89/</link><pubDate>Sun, 21 Jan 2018 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/01/%E7%94%A2%E7%94%9F%E8%87%AA%E7%B0%BD%E7%9A%84ssl%E6%86%91%E8%AD%89/</guid><description>&lt;p&gt;只是做個紀錄&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048
...
$ openssl rsa -passin pass:x -in server.pass.key -out server.key
writing RSA key
$ rm server.pass.key
$ openssl req -new -key server.key -out server.csr
...
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:California
...
A challenge password []:
$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nginx ssl config&lt;/p&gt;</description></item><item><title>Kubernetes 使用 私有 docker 倉庫並解決SSL憑證問題</title><link>https://blog.iphpo.com/blog/2018/01/kubernetes-%E4%BD%BF%E7%94%A8-%E7%A7%81%E6%9C%89-docker-%E5%80%89%E5%BA%AB%E4%B8%A6%E8%A7%A3%E6%B1%BAssl%E6%86%91%E8%AD%89%E5%95%8F%E9%A1%8C-kubernetes-private-registry-insecure/</link><pubDate>Sat, 20 Jan 2018 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/01/kubernetes-%E4%BD%BF%E7%94%A8-%E7%A7%81%E6%9C%89-docker-%E5%80%89%E5%BA%AB%E4%B8%A6%E8%A7%A3%E6%B1%BAssl%E6%86%91%E8%AD%89%E5%95%8F%E9%A1%8C-kubernetes-private-registry-insecure/</guid><description>&lt;p&gt;要在 Kubernetes 使用私有倉庫並不難&lt;/p&gt;
&lt;p&gt;只需要照著&lt;a href="https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/"&gt;官方的教學&lt;/a&gt;設定即可&lt;/p&gt;
&lt;p&gt;當我在用 &lt;a href="https://github.com/kubernetes/minikube"&gt;minikube&lt;/a&gt; 時卻一直無法成功 pull image&lt;/p&gt;
&lt;p&gt;我的 pod yaml 設定：&lt;/p&gt;</description></item><item><title>最快的 hash function</title><link>https://blog.iphpo.com/blog/2018/01/%E6%9C%80%E5%BF%AB%E7%9A%84-hash-function-fastest-hash-xxxhash/</link><pubDate>Sat, 13 Jan 2018 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/01/%E6%9C%80%E5%BF%AB%E7%9A%84-hash-function-fastest-hash-xxxhash/</guid><description>&lt;p&gt;今天在找速度最快的 hash function&lt;/p&gt;
&lt;p&gt;不必考慮安全因素&lt;/p&gt;
&lt;p&gt;只要速度!!&lt;/p&gt;
&lt;p&gt;主要用途是給css, js加上 hash name&lt;/p&gt;</description></item><item><title>Build Docker image 時出現 no space left on device</title><link>https://blog.iphpo.com/blog/2018/01/build-docker-image-%E6%99%82%E5%87%BA%E7%8F%BE-no-space-left-device/</link><pubDate>Tue, 02 Jan 2018 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/01/build-docker-image-%E6%99%82%E5%87%BA%E7%8F%BE-no-space-left-device/</guid><description>&lt;p&gt;我的 Macbook air 只有 128 GB 的硬碟空間(對這不叫內存!!!!!!)&lt;/p&gt;
&lt;p&gt;在某次build image的時候出現空間不足的錯誤&lt;/p&gt;</description></item><item><title>MacOS X 下 docker-compose 速度非常慢的解決方法</title><link>https://blog.iphpo.com/blog/2018/01/macos-x-%E4%B8%8B-docker-compose-%E9%80%9F%E5%BA%A6%E9%9D%9E%E5%B8%B8%E6%85%A2%E7%9A%84%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95/</link><pubDate>Tue, 02 Jan 2018 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/01/macos-x-%E4%B8%8B-docker-compose-%E9%80%9F%E5%BA%A6%E9%9D%9E%E5%B8%B8%E6%85%A2%E7%9A%84%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;每次執行 docker-compose up&lt;/p&gt;
&lt;p&gt;跟docker-compose down&lt;/p&gt;
&lt;p&gt;速度都超級慢&lt;/p&gt;
&lt;p&gt;正常來講&lt;/p&gt;
&lt;p&gt;幾秒鐘之內就可以關掉好幾個container&lt;/p&gt;
&lt;p&gt;但在我家電腦要花最少一分鐘以上&lt;/p&gt;
&lt;p&gt;這速度真是無法忍受&lt;/p&gt;
&lt;p&gt;搜尋後找到神奇的答案&lt;/p&gt;</description></item><item><title>在 CentOS 7 將 yum base repo 改為 hinet</title><link>https://blog.iphpo.com/blog/2018/01/%E5%9C%A8-centos-7-%E5%B0%87-yum-base-repo-%E6%94%B9%E7%82%BA-hinet/</link><pubDate>Tue, 02 Jan 2018 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2018/01/%E5%9C%A8-centos-7-%E5%B0%87-yum-base-repo-%E6%94%B9%E7%82%BA-hinet/</guid><description>&lt;p&gt;最近在用 docker&lt;/p&gt;
&lt;p&gt;預設的 CentOS 7&lt;/p&gt;
&lt;p&gt;yum install 都超慢&lt;/p&gt;
&lt;p&gt;所以就找了方法把 base repo 改成 hinet&lt;/p&gt;
&lt;p&gt;果然速度就快多了&lt;/p&gt;
&lt;p&gt;首先先備份原本的base repo&lt;/p&gt;</description></item><item><title>PHP7.2 新特性 新功能</title><link>https://blog.iphpo.com/blog/2017/12/php7-2-%E6%96%B0%E7%89%B9%E6%80%A7-%E6%96%B0%E5%8A%9F%E8%83%BD-php72-new-feature/</link><pubDate>Sun, 31 Dec 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/12/php7-2-%E6%96%B0%E7%89%B9%E6%80%A7-%E6%96%B0%E5%8A%9F%E8%83%BD-php72-new-feature/</guid><description>&lt;p&gt;PHP 7.2 在 2017年十一月30號釋出了&lt;/p&gt;
&lt;p&gt;趕緊用 phpbrew 裝在 Mac 上測試玩玩&lt;/p&gt;
&lt;p&gt;來看看有哪些新功能吧&lt;/p&gt;</description></item><item><title>Golang 用 goroutine 減少大量檔案讀取時間</title><link>https://blog.iphpo.com/blog/2017/12/golang-%E7%94%A8-goroutine-%E6%B8%9B%E5%B0%91%E5%A4%A7%E9%87%8F%E6%AA%94%E6%A1%88%E8%AE%80%E5%8F%96%E6%99%82%E9%96%93/</link><pubDate>Sat, 30 Dec 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/12/golang-%E7%94%A8-goroutine-%E6%B8%9B%E5%B0%91%E5%A4%A7%E9%87%8F%E6%AA%94%E6%A1%88%E8%AE%80%E5%8F%96%E6%99%82%E9%96%93/</guid><description>&lt;p&gt;之前做了一個可以掃描多資料夾下檔案變動的程式&lt;/p&gt;
&lt;p&gt;但只要檔案變多&lt;/p&gt;
&lt;p&gt;速度就會變很慢&lt;/p&gt;
&lt;p&gt;所以這次要用 golang 自帶的 goroutine 來優化&lt;/p&gt;</description></item><item><title>為什麼要寫部落格?</title><link>https://blog.iphpo.com/blog/2017/12/%E7%82%BA%E4%BB%80%E9%BA%BC%E8%A6%81%E5%AF%AB%E9%83%A8%E8%90%BD%E6%A0%BC/</link><pubDate>Sat, 30 Dec 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/12/%E7%82%BA%E4%BB%80%E9%BA%BC%E8%A6%81%E5%AF%AB%E9%83%A8%E8%90%BD%E6%A0%BC/</guid><description>&lt;p&gt;好久沒更新了&lt;/p&gt;
&lt;p&gt;最近的技術心得都是片段片段的&lt;/p&gt;
&lt;p&gt;沒法寫出太完整的文章&lt;/p&gt;
&lt;p&gt;就來寫點抒情文&lt;/p&gt;
&lt;p&gt;到底為什麼要寫部落格？&lt;/p&gt;</description></item><item><title>choosing mysql or postgresql</title><link>https://blog.iphpo.com/blog/2017/12/choosing-mysql-postgresql/</link><pubDate>Fri, 15 Dec 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/12/choosing-mysql-postgresql/</guid><description>&lt;p&gt;&lt;a href="https://blog.kedare.net/blog/choosing-mysql-or-postgresql.html"&gt;https://blog.kedare.net/blog/choosing-mysql-or-postgresql.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;好文&lt;/p&gt;</description></item><item><title>[Ansible] 利用 ad-hoc command 列出所有可用參數</title><link>https://blog.iphpo.com/blog/2017/11/ansible-%E5%88%A9%E7%94%A8-ad-hoc-command-%E5%88%97%E5%87%BA%E6%89%80%E6%9C%89%E5%8F%AF%E7%94%A8%E5%8F%83%E6%95%B8/</link><pubDate>Sat, 25 Nov 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/11/ansible-%E5%88%A9%E7%94%A8-ad-hoc-command-%E5%88%97%E5%87%BA%E6%89%80%E6%9C%89%E5%8F%AF%E7%94%A8%E5%8F%83%E6%95%B8/</guid><description>&lt;p&gt;所謂 ad-hoc，意思比較偏向 &amp;ldquo;即時的&amp;rdquo; 的意思&lt;/p&gt;
&lt;p&gt;就是直接在command line調用 ansible 的模組並執行&lt;/p&gt;
&lt;p&gt;完整的介紹可以看&lt;a href="http://docs.ansible.com/ansible/latest/intro_adhoc.html"&gt;官方網站&lt;/a&gt;&lt;/p&gt;</description></item><item><title>logrotate 的設定翻譯</title><link>https://blog.iphpo.com/blog/2017/11/logrotate-%E7%9A%84%E8%A8%AD%E5%AE%9A%E7%BF%BB%E8%AD%AF/</link><pubDate>Sat, 25 Nov 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/11/logrotate-%E7%9A%84%E8%A8%AD%E5%AE%9A%E7%BF%BB%E8%AD%AF/</guid><description>&lt;p&gt;logrotate 是一個自動分割、打包檔案的工具&lt;/p&gt;
&lt;p&gt;log檔案會隨著時間日益增大&lt;/p&gt;
&lt;p&gt;不止不好查看&lt;/p&gt;
&lt;p&gt;大到一個程度寫入Log效能也會變差&lt;/p&gt;
&lt;p&gt;所以需要 logrotate 來幫忙分割打包壓縮處理&lt;/p&gt;
&lt;p&gt;有鑒於網路上都是分享自己的設定&lt;/p&gt;
&lt;p&gt;並沒有一個很全面的說明&lt;/p&gt;
&lt;p&gt;所以我就把 man logrotate 的設定翻譯一下&lt;/p&gt;</description></item><item><title>在command line下移動游標(cursor)</title><link>https://blog.iphpo.com/blog/2017/11/%E5%9C%A8command-line%E4%B8%8B%E7%A7%BB%E5%8B%95%E6%B8%B8%E6%A8%99-move-cursor-in-command/</link><pubDate>Sat, 25 Nov 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/11/%E5%9C%A8command-line%E4%B8%8B%E7%A7%BB%E5%8B%95%E6%B8%B8%E6%A8%99-move-cursor-in-command/</guid><description>&lt;p&gt;對常使用command line的人來說&lt;/p&gt;
&lt;p&gt;移動游標一直是很不方便的事情&lt;/p&gt;
&lt;p&gt;尤其是打了一大串指令&lt;/p&gt;
&lt;p&gt;發現中間有錯字&lt;/p&gt;
&lt;p&gt;就會很崩潰的按著方向鍵等游標飄過去&lt;/p&gt;
&lt;p&gt;或是從網路上複製一大串指令&lt;/p&gt;
&lt;p&gt;發現中間要修改一個參數&lt;/p&gt;
&lt;p&gt;也是只能嘆口氣按下方向鍵等它飄過去&lt;/p&gt;
&lt;p&gt;其實不必這麼麻煩&lt;/p&gt;
&lt;p&gt;目前在 MacOSX 跟 Linux 上實測&lt;/p&gt;
&lt;p&gt;都有移動指標的快速鍵&lt;/p&gt;</description></item><item><title>測試 PHP 裡的 serialize 函式效能</title><link>https://blog.iphpo.com/blog/2017/11/%E6%B8%AC%E8%A9%A6-php-%E8%A3%A1%E7%9A%84-serialize-%E5%87%BD%E5%BC%8F%E6%95%88%E8%83%BD/</link><pubDate>Mon, 13 Nov 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/11/%E6%B8%AC%E8%A9%A6-php-%E8%A3%A1%E7%9A%84-serialize-%E5%87%BD%E5%BC%8F%E6%95%88%E8%83%BD/</guid><description>&lt;p&gt;這次比較的有最常用的三種方式&lt;/p&gt;
&lt;p&gt;PHP內建的serialize&lt;/p&gt;
&lt;p&gt;還有json_encode&lt;/p&gt;
&lt;p&gt;另一個可能有人不知道&lt;/p&gt;
&lt;p&gt;叫 igbinary&lt;/p&gt;
&lt;p&gt;這東西在PHP5時代&lt;/p&gt;
&lt;p&gt;效能可是海放 PHP 內建的 serialize&lt;/p&gt;
&lt;p&gt;但是在效能大耀進的PHP 7上呢？&lt;/p&gt;
&lt;p&gt;馬上來做個實驗看看&lt;/p&gt;</description></item><item><title>製作可安裝多系統的USB</title><link>https://blog.iphpo.com/blog/2017/11/%E8%A3%BD%E4%BD%9C%E5%8F%AF%E5%AE%89%E8%A3%9D%E5%A4%9A%E7%B3%BB%E7%B5%B1%E7%9A%84usb/</link><pubDate>Tue, 07 Nov 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/11/%E8%A3%BD%E4%BD%9C%E5%8F%AF%E5%AE%89%E8%A3%9D%E5%A4%9A%E7%B3%BB%E7%B5%B1%E7%9A%84usb/</guid><description>&lt;p&gt;目前測試可用的有&lt;/p&gt;
&lt;p&gt;CentOS7&lt;/p&gt;
&lt;p&gt;Ubuntu 17.04&lt;/p&gt;
&lt;p&gt;Windows 10&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pendrivelinux.com/yumi-multiboot-usb-creator/"&gt;https://www.pendrivelinux.com/yumi-multiboot-usb-creator/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;使用方法也超簡單&lt;/p&gt;
&lt;p&gt;下載這軟體之後&lt;/p&gt;
&lt;p&gt;把各OS安裝ISO依序丟進去就好了&lt;/p&gt;</description></item><item><title>Ansible 與 Vagrant 結合練習多環境狀況</title><link>https://blog.iphpo.com/blog/2017/11/ansible-%E8%88%87-vagrant-%E7%B5%90%E5%90%88%E7%B7%B4%E7%BF%92%E5%A4%9A%E7%92%B0%E5%A2%83%E7%8B%80%E6%B3%81/</link><pubDate>Mon, 06 Nov 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/11/ansible-%E8%88%87-vagrant-%E7%B5%90%E5%90%88%E7%B7%B4%E7%BF%92%E5%A4%9A%E7%92%B0%E5%A2%83%E7%8B%80%E6%B3%81/</guid><description>&lt;p&gt;Vagrant &lt;a href="https://www.vagrantup.com/"&gt;https://www.vagrantup.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;是一個輕量化簡單建置與管理VM的工具&lt;/p&gt;
&lt;p&gt;不同於VirtualBox，Vagrant沒有圖形介面&lt;/p&gt;
&lt;p&gt;一切都是文字（console）&lt;/p&gt;
&lt;p&gt;這也剛好可以用它來開多個不同vm&lt;/p&gt;
&lt;p&gt;來模擬多個環境下的Ansible play script&lt;/p&gt;
&lt;p&gt;為什麼不用docker呢？&lt;/p&gt;
&lt;p&gt;docker 跟實體的VM其實還有一段小小的差距&lt;/p&gt;
&lt;p&gt;像是我的playbook第一步驟是設定時區&lt;/p&gt;
&lt;p&gt;結果docker下的centos不能設定時區&lt;/p&gt;
&lt;p&gt;雖然可以跳過這一步驟&lt;/p&gt;
&lt;p&gt;但這就失去了測試的意義&lt;/p&gt;
&lt;p&gt;所以最後決定還是回到VM的懷抱&lt;/p&gt;</description></item><item><title>ReactStudio v1.2 新版釋出</title><link>https://blog.iphpo.com/blog/2017/11/reactstudio-v1-2-%E6%96%B0%E7%89%88%E9%87%8B%E5%87%BA/</link><pubDate>Mon, 06 Nov 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/11/reactstudio-v1-2-%E6%96%B0%E7%89%88%E9%87%8B%E5%87%BA/</guid><description>&lt;p&gt;&lt;a href="https://reactstudio.com/"&gt;https://reactstudio.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;之前是寫 Vue.js&lt;/p&gt;
&lt;p&gt;ReactJS一直是我心裡的痛&lt;/p&gt;
&lt;p&gt;希望這東西能讓我順利玩下去啊~~&lt;/p&gt;</description></item><item><title>Linux 下用名稱刪除 process</title><link>https://blog.iphpo.com/blog/2017/11/linux-%E4%B8%8B%E7%94%A8%E5%90%8D%E7%A8%B1%E5%88%AA%E9%99%A4-process/</link><pubDate>Sun, 05 Nov 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/11/linux-%E4%B8%8B%E7%94%A8%E5%90%8D%E7%A8%B1%E5%88%AA%E9%99%A4-process/</guid><description>&lt;p&gt;kill &lt;process-id&gt; 可刪除某個程序&lt;/p&gt;
&lt;p&gt;但如果他開了一堆sub-process&lt;/p&gt;
&lt;p&gt;要一個一個砍就很麻煩&lt;/p&gt;
&lt;p&gt;這時候可以用其他指令來達成&lt;/p&gt;</description></item><item><title>MariaDB 10.2.2 開始支援 WITH RECURSIVE Query</title><link>https://blog.iphpo.com/blog/2017/10/mariadb-10-2-2-%E9%96%8B%E5%A7%8B%E6%94%AF%E6%8F%B4-recursive-query/</link><pubDate>Tue, 17 Oct 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/10/mariadb-10-2-2-%E9%96%8B%E5%A7%8B%E6%94%AF%E6%8F%B4-recursive-query/</guid><description>&lt;p&gt;我現在是用 10.2.7&lt;/p&gt;
&lt;p&gt;雖然 CTE 在其他資料庫上可以用很久了&lt;/p&gt;
&lt;p&gt;但是從MySQL入門&lt;/p&gt;
&lt;p&gt;甚至一直以來都只用MySQL的人應該對這很陌生&lt;/p&gt;
&lt;p&gt;因為MySQL還要等到未來的 MySQL 8 才會支援 with&lt;/p&gt;</description></item><item><title>如何寫 Fail2ban 的 filter</title><link>https://blog.iphpo.com/blog/2017/09/%E5%A6%82%E4%BD%95%E5%AF%AB-fail2ban-%E7%9A%84-filter/</link><pubDate>Sun, 24 Sep 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/09/%E5%A6%82%E4%BD%95%E5%AF%AB-fail2ban-%E7%9A%84-filter/</guid><description>&lt;p&gt;如果要在Fail2ban自訂封鎖條件&lt;/p&gt;
&lt;p&gt;就要先寫好 filter&lt;/p&gt;
&lt;p&gt;並在jail裡開啟&lt;/p&gt;</description></item><item><title>在 CentOS 7 上安裝 Nginx 的 Modsecurity module</title><link>https://blog.iphpo.com/blog/2017/09/%E5%9C%A8-centos-7-%E4%B8%8A%E5%AE%89%E8%A3%9Dnginx-%E7%9A%84-modsecurity-module/</link><pubDate>Sun, 10 Sep 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/09/%E5%9C%A8-centos-7-%E4%B8%8A%E5%AE%89%E8%A3%9Dnginx-%E7%9A%84-modsecurity-module/</guid><description>&lt;p&gt;之前有寫過&lt;a href="https://blog.iphpo.com/blog/2017/03/%E5%9C%A8centos7-%E4%B8%8A-%E5%AE%89%E8%A3%9Dnginx-modsecurity%E5%BB%BA%E7%AB%8B%E5%85%8D%E8%B2%BBwaf-build-free-waf-using-nginx-and-modsecurity/"&gt;如何自己Compile Nginx + Modsecurity&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;這次在官方網站上看到&lt;a href="https://www.nginx.com/blog/compiling-and-installing-modsecurity-for-open-source-nginx/"&gt;一篇&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;不需要重新compile nginx&lt;/p&gt;
&lt;p&gt;只需要把 modsecurity compile 成 module 就可以用的方案&lt;/p&gt;
&lt;p&gt;這對使用 yum 安裝 nginx 的人來說才是最好的方案&lt;/p&gt;</description></item><item><title>Nested Transaction using savepoint</title><link>https://blog.iphpo.com/blog/2017/09/nested-transaction-using-savepoint/</link><pubDate>Sat, 09 Sep 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/09/nested-transaction-using-savepoint/</guid><description>&lt;p&gt;這次測試的資料庫是 Oracle 12c&lt;/p&gt;
&lt;p&gt;但MySQL Postgre SQL應該都有支援savepoint&lt;/p&gt;
&lt;p&gt;這次測試的code有用到doctrine ORM&lt;/p&gt;</description></item><item><title>資料庫的 ACID</title><link>https://blog.iphpo.com/blog/2017/09/%E8%B3%87%E6%96%99%E5%BA%AB%E7%9A%84-acid/</link><pubDate>Sat, 09 Sep 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/09/%E8%B3%87%E6%96%99%E5%BA%AB%E7%9A%84-acid/</guid><description>&lt;p&gt;一直以來都沒把ACID的定義記清楚&lt;/p&gt;
&lt;p&gt;只知道在程式裡開transaction&lt;/p&gt;
&lt;p&gt;最後commit或rollback&lt;/p&gt;
&lt;p&gt;不過這也誤打誤撞的符合ACID要求&lt;/p&gt;</description></item><item><title>可將ID編碼的工具</title><link>https://blog.iphpo.com/blog/2017/09/%E5%8F%AF%E5%B0%87id%E7%B7%A8%E7%A2%BC%E7%9A%84%E5%B7%A5%E5%85%B7/</link><pubDate>Fri, 08 Sep 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/09/%E5%8F%AF%E5%B0%87id%E7%B7%A8%E7%A2%BC%E7%9A%84%E5%B7%A5%E5%85%B7/</guid><description>&lt;p&gt;其實應用很廣泛&lt;/p&gt;
&lt;p&gt;也因為可以控制雜湊的長度&lt;/p&gt;
&lt;p&gt;所以可以做為短網址的應用&lt;/p&gt;</description></item><item><title>租屋合約要看清楚再簽</title><link>https://blog.iphpo.com/blog/2017/08/%E7%A7%9F%E5%B1%8B%E5%90%88%E7%B4%84%E8%A6%81%E7%9C%8B%E6%B8%85%E6%A5%9A%E5%86%8D%E7%B0%BD/</link><pubDate>Sun, 13 Aug 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/08/%E7%A7%9F%E5%B1%8B%E5%90%88%E7%B4%84%E8%A6%81%E7%9C%8B%E6%B8%85%E6%A5%9A%E5%86%8D%E7%B0%BD/</guid><description>&lt;p&gt;今天租屋經驗非常不愉快&lt;/p&gt;
&lt;p&gt;我本來都會詳細看合約書&lt;/p&gt;
&lt;p&gt;之前簽約房東也會帶著我看一遍合約&lt;/p&gt;
&lt;p&gt;這次我準備要看的時候&lt;/p&gt;
&lt;p&gt;旁邊的仲介開始說&lt;/p&gt;
&lt;p&gt;這你都要看？&lt;/p&gt;
&lt;p&gt;這些都很制式啦&lt;/p&gt;
&lt;p&gt;書局都買得到&lt;/p&gt;
&lt;p&gt;不用看吧&lt;/p&gt;</description></item><item><title>Ansible 安裝多個 package</title><link>https://blog.iphpo.com/blog/2017/08/ansible-%E5%AE%89%E8%A3%9D%E5%A4%9A%E5%80%8B-package/</link><pubDate>Fri, 11 Aug 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/08/ansible-%E5%AE%89%E8%A3%9D%E5%A4%9A%E5%80%8B-package/</guid><description>&lt;p&gt;安裝一個package&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;install epel&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;yum&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;epel-release&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;update_cache&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;yes&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安裝多個package&lt;/p&gt;
&lt;p&gt;不能在name的部分用空格給多個package名稱&lt;/p&gt;
&lt;p&gt;該怎麼辦呢？&lt;/p&gt;</description></item><item><title>Linux commands that every DevOps engineer should know</title><link>https://blog.iphpo.com/blog/2017/08/linux-commands-every-devops-engineer-know/</link><pubDate>Tue, 08 Aug 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/08/linux-commands-every-devops-engineer-know/</guid><description>&lt;p&gt;今天看到一篇文章滿實用&lt;/p&gt;
&lt;p&gt;轉貼來記錄一下XD&lt;/p&gt;
&lt;p&gt;&lt;a href="https://vinta.ws/code/linux-commands-that-every-devops-engineer-should-know.html"&gt;https://vinta.ws/code/linux-commands-that-every-devops-engineer-should-know.html&lt;/a&gt;&lt;/p&gt;</description></item><item><title>面試心得</title><link>https://blog.iphpo.com/blog/2017/08/%E9%9D%A2%E8%A9%A6%E5%BF%83%E5%BE%97/</link><pubDate>Tue, 08 Aug 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/08/%E9%9D%A2%E8%A9%A6%E5%BF%83%E5%BE%97/</guid><description>&lt;p&gt;最近面試告一段落&lt;/p&gt;
&lt;p&gt;其實滿喜歡跟大家交流的感覺&lt;/p&gt;
&lt;p&gt;我也收穫滿多&lt;/p&gt;</description></item><item><title>[閒聊] 社群裡的大神就真的是大神嗎？</title><link>https://blog.iphpo.com/blog/2017/07/%E9%96%92%E8%81%8A-%E7%A4%BE%E7%BE%A4%E8%A3%A1%E7%9A%84%E5%A4%A7%E7%A5%9E%E5%B0%B1%E7%9C%9F%E7%9A%84%E6%98%AF%E5%A4%A7%E7%A5%9E%E5%97%8E/</link><pubDate>Sun, 30 Jul 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/07/%E9%96%92%E8%81%8A-%E7%A4%BE%E7%BE%A4%E8%A3%A1%E7%9A%84%E5%A4%A7%E7%A5%9E%E5%B0%B1%E7%9C%9F%E7%9A%84%E6%98%AF%E5%A4%A7%E7%A5%9E%E5%97%8E/</guid><description>&lt;p&gt;這是一篇抒情文&lt;/p&gt;
&lt;p&gt;前因是這陣子陸續有在面試&lt;/p&gt;
&lt;p&gt;跟其中一間聊到一些大神不需要丟履歷&lt;/p&gt;
&lt;p&gt;別人都會搶著找他去工作&lt;/p&gt;
&lt;p&gt;其實我不反對社群裡有些真的是大神&lt;/p&gt;</description></item><item><title>CentOS上的Nginx在新版Chrome上無法啟動 HTTP/2</title><link>https://blog.iphpo.com/blog/2017/07/centos%E4%B8%8A%E7%9A%84nginx%E5%9C%A8%E6%96%B0%E7%89%88chrome%E4%B8%8A%E7%84%A1%E6%B3%95%E5%95%9F%E5%8B%95-http2/</link><pubDate>Thu, 27 Jul 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/07/centos%E4%B8%8A%E7%9A%84nginx%E5%9C%A8%E6%96%B0%E7%89%88chrome%E4%B8%8A%E7%84%A1%E6%B3%95%E5%95%9F%E5%8B%95-http2/</guid><description>&lt;p&gt;我一直以為 我在設定檔裡加入http2 就會開啟http2&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen &lt;span class="m"&gt;443&lt;/span&gt; ssl http2&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;結果我用 Chrome 內建的工具檢查&lt;/p&gt;
&lt;p&gt;卻沒有啟動 HTTP/2&lt;/p&gt;
&lt;p&gt;&lt;a href="chrome://net-internals/#http2"&gt;chrome://net-internals/#http2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;這才驚覺我的網站一直都沒有啟動HTTP/2&lt;/p&gt;
&lt;p&gt;原來是 CentOS 內建的OpenSSL版本&lt;/p&gt;
&lt;p&gt;沒有支援 ALPN&lt;/p&gt;
&lt;p&gt;導致Chrome會自動切換成HTTP/1.1&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# ./openssl version &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OpenSSL 1.0.1e-fips &lt;span class="m"&gt;11&lt;/span&gt; Feb &lt;span class="m"&gt;2013&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是用 yum update這就已經是最新版本&lt;/p&gt;
&lt;p&gt;所以只好自己編譯新版OpenSSL了&lt;/p&gt;</description></item><item><title>Vue.js webpack template 在IE下顯示空白</title><link>https://blog.iphpo.com/blog/2017/07/vue-js-webpack-template-%E5%9C%A8ie%E4%B8%8B%E9%A1%AF%E7%A4%BA%E7%A9%BA%E7%99%BD/</link><pubDate>Wed, 19 Jul 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/07/vue-js-webpack-template-%E5%9C%A8ie%E4%B8%8B%E9%A1%AF%E7%A4%BA%E7%A9%BA%E7%99%BD/</guid><description>&lt;p&gt;打開開發人員工具&lt;/p&gt;
&lt;p&gt;出現的錯誤是&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;polyfill-eventsource added missing EventSource to window&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Google後加入 Babel-polyfill 即可正常運作&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -save babel-polyfill
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然後在初始文件加入&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;babel-polyfill&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt; &lt;/p&gt;</description></item><item><title>[工具]檢查檔案是否被任意變更 - FileChecker</title><link>https://blog.iphpo.com/blog/2017/05/%E5%B7%A5%E5%85%B7-%E6%AA%A2%E6%9F%A5%E6%AA%94%E6%A1%88%E6%98%AF%E5%90%A6%E8%A2%AB%E4%BB%BB%E6%84%8F%E8%AE%8A%E6%9B%B4-filechecker/</link><pubDate>Thu, 04 May 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/05/%E5%B7%A5%E5%85%B7-%E6%AA%A2%E6%9F%A5%E6%AA%94%E6%A1%88%E6%98%AF%E5%90%A6%E8%A2%AB%E4%BB%BB%E6%84%8F%E8%AE%8A%E6%9B%B4-filechecker/</guid><description>&lt;p&gt;最近用Golang寫了一個工具&lt;/p&gt;
&lt;p&gt;這是很久以前就想寫的&lt;/p&gt;
&lt;p&gt;那時候還沒有golang&lt;/p&gt;
&lt;p&gt;當初的想法是&lt;/p&gt;
&lt;p&gt;一台Server被成功入侵&lt;/p&gt;
&lt;p&gt;大部分都是看Log才知道&lt;/p&gt;
&lt;p&gt;但一台被針對並且成功提權的機器&lt;/p&gt;
&lt;p&gt;是不會留下任何被入侵的Log的&lt;/p&gt;
&lt;p&gt;但是絕對會留下駭客下次進入的後門&lt;/p&gt;
&lt;p&gt;或是被置入的惡意程式&lt;/p&gt;
&lt;p&gt;畢竟漏洞只是一時的&lt;/p&gt;
&lt;p&gt;如果沒放後門等漏洞被補起來&lt;/p&gt;
&lt;p&gt;這台機器就不能用了&lt;/p&gt;</description></item><item><title>Golang如何確認檔案是否存在</title><link>https://blog.iphpo.com/blog/2017/04/golang%E5%A6%82%E4%BD%95%E7%A2%BA%E8%AA%8D%E6%AA%94%E6%A1%88%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8/</link><pubDate>Mon, 17 Apr 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/04/golang%E5%A6%82%E4%BD%95%E7%A2%BA%E8%AA%8D%E6%AA%94%E6%A1%88%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8/</guid><description>&lt;p&gt;在php裡有個函式可以檢查檔案是否存在&lt;/p&gt;
&lt;p&gt;&lt;a href="http://php.net/manual/en/function.file-exists.php"&gt;file_exists&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;那在Golang又該如何判斷呢？&lt;/p&gt;</description></item><item><title>在Golang用簡單的方式Mock function</title><link>https://blog.iphpo.com/blog/2017/04/%E5%9C%A8golang%E7%94%A8%E7%B0%A1%E5%96%AE%E7%9A%84%E6%96%B9%E5%BC%8Fmock-function-how-to-mock-function-in-golang/</link><pubDate>Wed, 12 Apr 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/04/%E5%9C%A8golang%E7%94%A8%E7%B0%A1%E5%96%AE%E7%9A%84%E6%96%B9%E5%BC%8Fmock-function-how-to-mock-function-in-golang/</guid><description>&lt;p&gt;其實&lt;a href="https://github.com/golang/mock"&gt;官方有Mock package&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;但我稍微看了一下&lt;/p&gt;
&lt;p&gt;都是在Mock interface&lt;/p&gt;
&lt;p&gt;我遇到的問題是&lt;/p&gt;
&lt;p&gt;我用到其他package的function&lt;/p&gt;
&lt;p&gt;而那隻package沒有用interface&lt;/p&gt;
&lt;p&gt;所以無法產生Mock object&lt;/p&gt;
&lt;p&gt;Google上的解法&lt;/p&gt;
&lt;p&gt;都偏向Dependency Injection&lt;/p&gt;</description></item><item><title>在Composer加入本地端開發中的Package</title><link>https://blog.iphpo.com/blog/2017/04/%E5%9C%A8composer%E5%8A%A0%E5%85%A5%E6%9C%AC%E5%9C%B0%E7%AB%AF%E9%96%8B%E7%99%BC%E4%B8%AD%E7%9A%84package-add-local-package-in-composer/</link><pubDate>Tue, 11 Apr 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/04/%E5%9C%A8composer%E5%8A%A0%E5%85%A5%E6%9C%AC%E5%9C%B0%E7%AB%AF%E9%96%8B%E7%99%BC%E4%B8%AD%E7%9A%84package-add-local-package-in-composer/</guid><description>&lt;p&gt;在PHP已經進化到7的時代&lt;/p&gt;
&lt;p&gt;不只速度的提升&lt;/p&gt;
&lt;p&gt;也代表很多標準被定義出來&lt;/p&gt;
&lt;p&gt;標準被定義出來也代表著&lt;/p&gt;
&lt;p&gt;遵循這些定義所產生的Package, Library就會很多&lt;/p&gt;
&lt;p&gt;用&lt;a href="https://getcomposer.org/"&gt;Composer&lt;/a&gt;管理套件的相依性就變成無法阻擋的趨勢&lt;/p&gt;</description></item><item><title>如何自製Composer的套件</title><link>https://blog.iphpo.com/blog/2017/04/%E5%A6%82%E4%BD%95%E8%87%AA%E8%A3%BDcomposer%E7%9A%84%E5%A5%97%E4%BB%B6-how-to-create-own-composer-package/</link><pubDate>Tue, 11 Apr 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/04/%E5%A6%82%E4%BD%95%E8%87%AA%E8%A3%BDcomposer%E7%9A%84%E5%A5%97%E4%BB%B6-how-to-create-own-composer-package/</guid><description>&lt;p&gt;首先一定要有&lt;a href="https://getcomposer.org/"&gt;Composer&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;建議安裝在可直接執行的地方&lt;/p&gt;
&lt;p&gt;像我就裝在 /usr/local/bin&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;php -r &lt;span class="s2"&gt;&amp;#34;copy(&amp;#39;https://getcomposer.org/installer&amp;#39;, &amp;#39;composer-setup.php&amp;#39;);&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;php composer-setup.php --install-dir&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mv /usr/local/bin/composer.phar /usr/local/bin/composer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x /usr/local/bin/composer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然後建立一個專案資料夾&lt;/p&gt;</description></item><item><title>Webpack 筆記（二）初始化設定檔</title><link>https://blog.iphpo.com/blog/2017/04/webpack-%E7%AD%86%E8%A8%98%E4%BA%8C%E5%88%9D%E5%A7%8B%E5%8C%96%E8%A8%AD%E5%AE%9A%E6%AA%94/</link><pubDate>Sun, 09 Apr 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/04/webpack-%E7%AD%86%E8%A8%98%E4%BA%8C%E5%88%9D%E5%A7%8B%E5%8C%96%E8%A8%AD%E5%AE%9A%E6%AA%94/</guid><description>&lt;p&gt;當剛安裝完Webpack&lt;/p&gt;
&lt;p&gt;第一次執行會看到如下的訊息&lt;/p&gt;
&lt;p&gt;&lt;img src="../%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7-2017-04-07-%E4%B8%8B%E5%8D%8811.09.36-300x31.png" alt=""&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; $ webpack &lt;span class="o"&gt;[&lt;/span&gt;23:07:04&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;No configuration file found and no output filename configured via CLI option.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;A configuration file could be named &lt;span class="s1"&gt;&amp;#39;webpack.config.js&amp;#39;&lt;/span&gt; in the current directory.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Use --help to display the CLI options.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;也就是他找不到 webpack.config.js 的設定檔&lt;/p&gt;
&lt;p&gt;所以就在專案目錄下新增一個webpack.config.js&lt;/p&gt;
&lt;p&gt;裡面的內容可以參考&lt;a href="https://webpack.js.org/configuration/"&gt;官方的Document&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;設定檔的基礎架構由幾個部分組成&lt;/p&gt;</description></item><item><title>Webpack 筆記（三）用npm script管理開發流程裡的指令</title><link>https://blog.iphpo.com/blog/2017/04/webpack-%E7%AD%86%E8%A8%98%E4%B8%89%E7%94%A8npm-script%E7%AE%A1%E7%90%86%E9%96%8B%E7%99%BC%E6%B5%81%E7%A8%8B%E8%A3%A1%E7%9A%84%E6%8C%87%E4%BB%A4/</link><pubDate>Sun, 09 Apr 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/04/webpack-%E7%AD%86%E8%A8%98%E4%B8%89%E7%94%A8npm-script%E7%AE%A1%E7%90%86%E9%96%8B%E7%99%BC%E6%B5%81%E7%A8%8B%E8%A3%A1%E7%9A%84%E6%8C%87%E4%BB%A4/</guid><description>&lt;p&gt;&lt;img src="../%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7-2017-04-09-%E4%B8%8B%E5%8D%883.06.01-300x64.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;通常開發跟最終的輸出會有一定差距&lt;/p&gt;
&lt;p&gt;像是在開發時需要自動compile&lt;/p&gt;
&lt;p&gt;或是autoreload&lt;/p&gt;
&lt;p&gt;而最終的輸出會需要minify&lt;/p&gt;
&lt;p&gt;所以這時候的webpack指令就會不同&lt;/p&gt;
&lt;p&gt;一般不使用config的使用方法是&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;webpack entry.js output.js
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>PHP-FPM如何產生core dump檔案</title><link>https://blog.iphpo.com/blog/2017/04/php-fpm%E5%A6%82%E4%BD%95%E7%94%A2%E7%94%9Fcore-dump%E6%AA%94%E6%A1%88-how-to-generate-core-dump-file-on-nginx/</link><pubDate>Sat, 08 Apr 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/04/php-fpm%E5%A6%82%E4%BD%95%E7%94%A2%E7%94%9Fcore-dump%E6%AA%94%E6%A1%88-how-to-generate-core-dump-file-on-nginx/</guid><description>&lt;p&gt;這陣子裝了Jetpack plugin&lt;/p&gt;
&lt;p&gt;發現一直有 &lt;a href="https://blog.iphpo.com/blog/2017/04/%E6%95%B4%E7%90%86-exited-on-signal-11-sigsegv-%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95/"&gt;EXITED ON SIGNAL 11 (SIGSEGV)&lt;/a&gt; 的問題&lt;/p&gt;
&lt;p&gt;改了一堆設定&lt;/p&gt;
&lt;p&gt;把buffer加大&lt;/p&gt;
&lt;p&gt;timeout加大&lt;/p&gt;
&lt;p&gt;都沒用&lt;/p&gt;
&lt;p&gt;伺服器上的php是用remi repo安裝的&lt;/p&gt;
&lt;p&gt;預設沒有開啟debug&lt;/p&gt;
&lt;p&gt;所以無法產生core dump文件&lt;/p&gt;
&lt;p&gt;今天心一橫&lt;/p&gt;
&lt;p&gt;決定自己來compile php&lt;/p&gt;</description></item><item><title>Webpack 筆記（一）安裝Webpack</title><link>https://blog.iphpo.com/blog/2017/04/webpack-%E7%AD%86%E8%A8%98%E4%B8%80%E5%AE%89%E8%A3%9Dwebpack/</link><pubDate>Fri, 07 Apr 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/04/webpack-%E7%AD%86%E8%A8%98%E4%B8%80%E5%AE%89%E8%A3%9Dwebpack/</guid><description>&lt;p&gt;&lt;img src="../%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7-2017-04-07-%E4%B8%8B%E5%8D%883.38.34-300x159.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;最近在看&lt;a href="https://laracasts.com/series/webpack-for-everyone"&gt;Laracasts上的Webpack課程&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;做點筆記加強記憶&lt;/p&gt;
&lt;p&gt;對我來說gulp比較清晰明瞭&lt;/p&gt;
&lt;p&gt;一個一個task各自獨立之後再以先後順序串起來&lt;/p&gt;
&lt;p&gt;但是Webpack就不是了&lt;/p&gt;</description></item><item><title>整理 exited on signal 11 (SIGSEGV) 解決方法</title><link>https://blog.iphpo.com/blog/2017/04/%E6%95%B4%E7%90%86-exited-on-signal-11-sigsegv-%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95/</link><pubDate>Fri, 07 Apr 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/04/%E6%95%B4%E7%90%86-exited-on-signal-11-sigsegv-%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;&lt;code&gt; [06-Apr-2017 22:55:02] WARNING: [pool www] child 6785 exited on signal 11 (SIGSEGV) after 7896.992354 seconds from start &lt;/code&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;首先這個錯誤是某個php script崩潰&lt;/p&gt;
&lt;p&gt;不是error也不是遇到什麼錯誤&lt;/p&gt;
&lt;p&gt;而是執行過程整個process崩潰&lt;/p&gt;
&lt;p&gt;查了一些資料&lt;/p&gt;
&lt;p&gt;整理出有幾個原因&lt;/p&gt;</description></item><item><title>Bootstrap 3 讓物件垂直置中的新方法</title><link>https://blog.iphpo.com/blog/2017/03/bootstrap-3-%E8%AE%93%E7%89%A9%E4%BB%B6%E5%9E%82%E7%9B%B4%E7%BD%AE%E4%B8%AD%E7%9A%84%E6%96%B0%E6%96%B9%E6%B3%95/</link><pubDate>Fri, 31 Mar 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/03/bootstrap-3-%E8%AE%93%E7%89%A9%E4%BB%B6%E5%9E%82%E7%9B%B4%E7%BD%AE%E4%B8%AD%E7%9A%84%E6%96%B0%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;之前要垂直置中&lt;/p&gt;
&lt;p&gt;不外乎就是設定height跟line-height&lt;/p&gt;
&lt;p&gt;不然就是parent position relative&lt;/p&gt;
&lt;p&gt;child position absolute&lt;/p&gt;
&lt;p&gt;top, right, bottom, left = 0&lt;/p&gt;
&lt;p&gt;或是&lt;a href="http://vanseodesign.com/css/vertical-centering/"&gt;這篇文章&lt;/a&gt;有提供六種垂直置中方法&lt;/p&gt;
&lt;p&gt;今天看到一個沒看過的用法&lt;/p&gt;</description></item><item><title>Google 提供的顏色選擇器 Color picker</title><link>https://blog.iphpo.com/blog/2017/03/google-%E6%8F%90%E4%BE%9B%E7%9A%84%E9%A1%8F%E8%89%B2%E9%81%B8%E6%93%87%E5%99%A8-color-picker/</link><pubDate>Fri, 31 Mar 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/03/google-%E6%8F%90%E4%BE%9B%E7%9A%84%E9%A1%8F%E8%89%B2%E9%81%B8%E6%93%87%E5%99%A8-color-picker/</guid><description>&lt;p&gt;&lt;img src="../%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7-2017-03-31-%E4%B8%8A%E5%8D%8810.16.31-300x220.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;之前偶然發現的&lt;/p&gt;
&lt;p&gt;只要在搜尋列上打 color picker&lt;/p&gt;
&lt;p&gt;google就會跑出顏色選擇器&lt;/p&gt;
&lt;p&gt;實在很方便啊！&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description></item><item><title>用JS取得GET參數</title><link>https://blog.iphpo.com/blog/2017/03/%E7%94%A8js%E5%8F%96%E5%BE%97get%E5%8F%83%E6%95%B8/</link><pubDate>Fri, 31 Mar 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/03/%E7%94%A8js%E5%8F%96%E5%BE%97get%E5%8F%83%E6%95%B8/</guid><description>&lt;p&gt;&lt;a href="http://stackoverflow.com/a/21210643"&gt;出自這裡&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;主要是利用 location.search&lt;/p&gt;
&lt;p&gt;一開始會得到包含 ? 的字串&lt;/p&gt;
&lt;p&gt;像我的網址是&lt;/p&gt;</description></item><item><title>在electron新增選擇資料夾的按鈕</title><link>https://blog.iphpo.com/blog/2017/03/%E5%9C%A8electron%E6%96%B0%E5%A2%9E%E9%81%B8%E6%93%87%E8%B3%87%E6%96%99%E5%A4%BE%E7%9A%84%E6%8C%89%E9%88%95/</link><pubDate>Fri, 31 Mar 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/03/%E5%9C%A8electron%E6%96%B0%E5%A2%9E%E9%81%B8%E6%93%87%E8%B3%87%E6%96%99%E5%A4%BE%E7%9A%84%E6%8C%89%E9%88%95/</guid><description>&lt;p&gt;一般瀏覽器&lt;/p&gt;
&lt;p&gt;依據安全性問題&lt;/p&gt;
&lt;p&gt;不會讓使用者選擇整個資料夾&lt;/p&gt;
&lt;p&gt;而electron是用chrome當底層&lt;/p&gt;
&lt;p&gt;所以一般的 &lt;input type="file"&gt;&lt;/p&gt;
&lt;p&gt;也就不能選擇整個資料夾&lt;/p&gt;
&lt;p&gt;這時候可以用electron所提供的dialog來實現&lt;/p&gt;</description></item><item><title>在Mac裡用bless找啟動磁碟</title><link>https://blog.iphpo.com/blog/2017/03/%E5%9C%A8mac%E8%A3%A1%E7%94%A8bless%E6%89%BE%E5%95%9F%E5%8B%95%E7%A3%81%E7%A2%9F-find-boot-drive-on-mac-using-bless-command/</link><pubDate>Fri, 31 Mar 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/03/%E5%9C%A8mac%E8%A3%A1%E7%94%A8bless%E6%89%BE%E5%95%9F%E5%8B%95%E7%A3%81%E7%A2%9F-find-boot-drive-on-mac-using-bless-command/</guid><description>&lt;p&gt;雖然筆電通常只有一顆硬碟&lt;/p&gt;
&lt;p&gt;但寫程式為了通用性&lt;/p&gt;
&lt;p&gt;還是會以某方式確定是哪一顆為準&lt;/p&gt;
&lt;p&gt;在Mac底下可以用以下指令確認&lt;/p&gt;</description></item><item><title>增加Handlebars更多的if判斷</title><link>https://blog.iphpo.com/blog/2017/03/%E5%A2%9E%E5%8A%A0handlebars%E6%9B%B4%E5%A4%9A%E7%9A%84if%E5%88%A4%E6%96%B7/</link><pubDate>Fri, 31 Mar 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/03/%E5%A2%9E%E5%8A%A0handlebars%E6%9B%B4%E5%A4%9A%E7%9A%84if%E5%88%A4%E6%96%B7/</guid><description>&lt;p&gt;&lt;a href="http://stackoverflow.com/a/16315366"&gt;出自這裡&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;handlebars 只有提供簡單的 true, false判斷&lt;/p&gt;
&lt;p&gt;如果要判斷某個值大於多少&lt;/p&gt;
&lt;p&gt;就要另外寫extension了&lt;/p&gt;
&lt;p&gt;在stackoverflow上已經有人寫好完整的extension&lt;/p&gt;
&lt;p&gt;所有比較都在裡面了&lt;/p&gt;</description></item><item><title>Javascript Array.filter</title><link>https://blog.iphpo.com/blog/2017/03/javascript-array-filter/</link><pubDate>Thu, 30 Mar 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/03/javascript-array-filter/</guid><description>&lt;p&gt;今天在處理一串資料&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;要取出第三個並顯示3&lt;/p&gt;
&lt;p&gt;很顯然的第二行的第三個是4&lt;/p&gt;
&lt;p&gt;這不是我要的資訊&lt;/p&gt;</description></item><item><title>柯文哲：應給蔣介石公平正確的評斷 不要一開始就否定</title><link>https://blog.iphpo.com/blog/2017/03/%E6%9F%AF%E6%96%87%E5%93%B2%E6%87%89%E7%B5%A6%E8%94%A3%E4%BB%8B%E7%9F%B3%E5%85%AC%E5%B9%B3%E6%AD%A3%E7%A2%BA%E7%9A%84%E8%A9%95%E6%96%B7-%E4%B8%8D%E8%A6%81%E4%B8%80%E9%96%8B%E5%A7%8B%E5%B0%B1/</link><pubDate>Wed, 29 Mar 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/03/%E6%9F%AF%E6%96%87%E5%93%B2%E6%87%89%E7%B5%A6%E8%94%A3%E4%BB%8B%E7%9F%B3%E5%85%AC%E5%B9%B3%E6%AD%A3%E7%A2%BA%E7%9A%84%E8%A9%95%E6%96%B7-%E4%B8%8D%E8%A6%81%E4%B8%80%E9%96%8B%E5%A7%8B%E5%B0%B1/</guid><description>&lt;p&gt;&lt;a href="https://tw.news.yahoo.com/%E6%9F%AF%E6%96%87%E5%93%B2%EF%BC%9A%E6%87%89%E7%B5%A6%E8%94%A3%E4%BB%8B%E7%9F%B3%E5%85%AC%E5%B9%B3%E6%AD%A3%E7%A2%BA%E7%9A%84%E8%A9%95%E6%96%B7-054959391.html"&gt;https://tw.news.yahoo.com/%E6%9F%AF%E6%96%87%E5%93%B2%EF%BC%9A%E6%87%89%E7%B5%A6%E8%94%A3%E4%BB%8B%E7%9F%B3%E5%85%AC%E5%B9%B3%E6%AD%A3%E7%A2%BA%E7%9A%84%E8%A9%95%E6%96%B7-054959391.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;228已經過去多日&lt;/p&gt;
&lt;p&gt;各方的情緒已經消退不少&lt;/p&gt;
&lt;p&gt;這時候出來講真話&lt;/p&gt;
&lt;p&gt;是最佳的時機&lt;/p&gt;
&lt;p&gt;蔣家過去做了多少事&lt;/p&gt;
&lt;p&gt;有好有壞&lt;/p&gt;
&lt;p&gt;有功有過&lt;/p&gt;
&lt;p&gt;但是有些人喜歡抓著他的功勞&lt;/p&gt;
&lt;p&gt;炫耀吹捧&lt;/p&gt;
&lt;p&gt;有些人喜歡抓著他的過失&lt;/p&gt;</description></item><item><title>使用gvm管理Golang版本</title><link>https://blog.iphpo.com/blog/2017/03/%E4%BD%BF%E7%94%A8gvm%E7%AE%A1%E7%90%86golang%E7%89%88%E6%9C%AC-manage-golang-version-by-gvm/</link><pubDate>Tue, 21 Mar 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/03/%E4%BD%BF%E7%94%A8gvm%E7%AE%A1%E7%90%86golang%E7%89%88%E6%9C%AC-manage-golang-version-by-gvm/</guid><description>&lt;p&gt;&lt;a href="https://github.com/moovweb/gvm"&gt;gvm&lt;/a&gt;是Go Version Manager的縮寫&lt;/p&gt;
&lt;p&gt;跟&lt;a href="https://github.com/creationix/nvm"&gt;nvm(node version manager)&lt;/a&gt;和&lt;a href="https://github.com/phpbrew/phpbrew"&gt;phpbrew&lt;/a&gt;功能一樣&lt;/p&gt;
&lt;p&gt;在一次升級Go版本的過程中&lt;/p&gt;
&lt;p&gt;偶然發現這個東西&lt;/p&gt;
&lt;p&gt;就決定使用它&lt;/p&gt;
&lt;p&gt;其實Go目前還沒有安裝多版本的需求&lt;/p&gt;
&lt;p&gt;不像PHP需要很多版本來測試&lt;/p&gt;
&lt;p&gt;但已經習慣使用command line來管理套件&lt;/p&gt;
&lt;p&gt;我的php, nodejs都是用版本管理系統來管理的&lt;/p&gt;
&lt;p&gt;所以Go也不想例外&lt;/p&gt;
&lt;p&gt;安裝也很簡單&lt;/p&gt;
&lt;p&gt;只需要一行&lt;/p&gt;</description></item><item><title>如何在 Golang 讀取/寫入檔案</title><link>https://blog.iphpo.com/blog/2017/03/%E5%A6%82%E4%BD%95%E5%9C%A8-golang-%E8%AE%80%E5%8F%96%E5%AF%AB%E5%85%A5%E6%AA%94%E6%A1%88-how-to-read-write-file-using-golang/</link><pubDate>Wed, 15 Mar 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/03/%E5%A6%82%E4%BD%95%E5%9C%A8-golang-%E8%AE%80%E5%8F%96%E5%AF%AB%E5%85%A5%E6%AA%94%E6%A1%88-how-to-read-write-file-using-golang/</guid><description>&lt;p&gt;這篇是在 &lt;a href="http://stackoverflow.com/questions/1821811/how-to-read-write-from-to-file-using-golang"&gt;stackoverflow&lt;/a&gt; 上看到的&lt;/p&gt;
&lt;p&gt;覺得滿實用&lt;/p&gt;
&lt;p&gt;在Golang要操作檔案有三種方法&lt;/p&gt;
&lt;p&gt;第一種就是操作檔案的指標&lt;/p&gt;
&lt;p&gt;跟php的fopen差不多&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 18pt; color: #ff0000;"&gt;&lt;strong&gt;以下是第一段程式碼&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;</description></item><item><title>修改CentOS 7的hostname</title><link>https://blog.iphpo.com/blog/2017/03/%E4%BF%AE%E6%94%B9centos-7%E7%9A%84hostname-edit-centos7-hostname/</link><pubDate>Mon, 13 Mar 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/03/%E4%BF%AE%E6%94%B9centos-7%E7%9A%84hostname-edit-centos7-hostname/</guid><description>&lt;p&gt;Centos 7我發現多了很多指令&lt;/p&gt;
&lt;p&gt;以往都要自己修改某個檔案的方式已經過去了&lt;/p&gt;
&lt;p&gt;CentOS 7用指令取代腦袋(要記憶的路徑)&lt;/p&gt;
&lt;p&gt;也許會說指令也需要記憶&lt;/p&gt;
&lt;p&gt;但其實只需要記開頭就好了&lt;/p&gt;</description></item><item><title>在CentOS7 上 安裝Nginx + ModSecurity建立免費WAF</title><link>https://blog.iphpo.com/blog/2017/03/%E5%9C%A8centos7-%E4%B8%8A-%E5%AE%89%E8%A3%9Dnginx-modsecurity%E5%BB%BA%E7%AB%8B%E5%85%8D%E8%B2%BBwaf-build-free-waf-using-nginx-and-modsecurity/</link><pubDate>Sun, 12 Mar 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/03/%E5%9C%A8centos7-%E4%B8%8A-%E5%AE%89%E8%A3%9Dnginx-modsecurity%E5%BB%BA%E7%AB%8B%E5%85%8D%E8%B2%BBwaf-build-free-waf-using-nginx-and-modsecurity/</guid><description>&lt;p&gt;WAF是Web Application Firewall的縮寫&lt;/p&gt;
&lt;p&gt;其原理是將已知的攻擊手法，用匹配方式偵測並阻擋&lt;/p&gt;
&lt;p&gt;所以可以預想得到&lt;/p&gt;
&lt;p&gt;規則會列很多條&lt;/p&gt;
&lt;p&gt;也不一定全面&lt;/p&gt;
&lt;p&gt;只需要熟悉漏洞原理的人&lt;/p&gt;
&lt;p&gt;照樣可以繞過&lt;/p&gt;
&lt;p&gt;但有總比沒有好&lt;/p&gt;
&lt;p&gt;至少可以過濾掉大部分的script kiddie&lt;/p&gt;
&lt;p&gt;除了ModSecurity之外&lt;/p&gt;
&lt;p&gt;還有一個專門for nginx的WAF叫做&lt;a href="https://github.com/nbs-system/naxsi"&gt;naxsi&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;這個有機會也可以試用看看&lt;/p&gt;
&lt;p&gt;不過這次先用ModSecurity&lt;/p&gt;
&lt;p&gt;要把nginx跟ModSecurity結合&lt;/p&gt;
&lt;p&gt;必須要自己compile nginx和ModSecurity&lt;/p&gt;
&lt;p&gt;以下用我寫的shell script一步一步做講解&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 18pt;"&gt;Step 1. 安裝compile所需套件&lt;/span&gt;&lt;/p&gt;</description></item><item><title>[Golang] 取得使用者的Home資料夾位置</title><link>https://blog.iphpo.com/blog/2017/03/golang-%E5%8F%96%E5%BE%97%E4%BD%BF%E7%94%A8%E8%80%85%E7%9A%84home%E8%B3%87%E6%96%99%E5%A4%BE%E4%BD%8D%E7%BD%AE-how-to-get-user-home-directory-using-golang/</link><pubDate>Fri, 10 Mar 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/03/golang-%E5%8F%96%E5%BE%97%E4%BD%BF%E7%94%A8%E8%80%85%E7%9A%84home%E8%B3%87%E6%96%99%E5%A4%BE%E4%BD%8D%E7%BD%AE-how-to-get-user-home-directory-using-golang/</guid><description>&lt;p&gt;golang 有提供 &lt;a href="https://golang.org/pkg/os/user/"&gt;user的package&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;可以直接取得使用者的資訊&lt;/p&gt;
&lt;p&gt;在文件裡面寫到&lt;/p&gt;
&lt;p&gt;user.Current() 可以取得包含目前使用者資訊的&lt;a href="https://golang.org/pkg/os/user/#User"&gt;User struct&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;struct結構長這樣&lt;/p&gt;</description></item><item><title>[Golang] 產生檔案的MD5 hash - Generate file MD5 hash in golang</title><link>https://blog.iphpo.com/blog/2017/03/golang-%E7%94%A2%E7%94%9Fmd5-hash-generate-md5-hash-golang/</link><pubDate>Tue, 07 Mar 2017 00:00:00 +0800</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/blog/2017/03/golang-%E7%94%A2%E7%94%9Fmd5-hash-generate-md5-hash-golang/</guid><description>&lt;p&gt;此篇文章是一個用Golang產生檔案MD5的function範例&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;genMd5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Abspath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;filepath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Abspath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Convert file absolute path error: &amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Abspath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;defer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;New&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EncodeToString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt; &lt;/p&gt;</description></item><item><title>歸檔</title><link>https://blog.iphpo.com/archives/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/archives/</guid><description/></item><item><title>關於</title><link>https://blog.iphpo.com/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>herb09638@gmail.com (Herb)</author><guid>https://blog.iphpo.com/about/</guid><description>&lt;p&gt;全端工程師，從嵌入式系統、Web Programming、伺服器管理到現在的 AI Agent 客製化開發，各種語言都寫過，管理過 CentOS、Ubuntu、Debian、k8s。這裡大多是工作上踩過的坑與整理過的解法，其中一個系列記錄了用 Nchan 打造即時聊天系統的完整過程。&lt;/p&gt;</description></item></channel></rss>