<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>貳夢の弦 &#187; 程式</title>
	<atom:link href="http://blog.frost.tw/tag/%e7%a8%8b%e5%bc%8f/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.frost.tw</link>
	<description>夢醒之時，驚覺一切都是虛幻。前行吧！迷途者。</description>
	<lastBuildDate>Wed, 26 Oct 2011 13:28:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<atom:link rel='hub' href='http://blog.frost.tw/?pushpress=hub'/>
		<item>
		<title>Socket.IO + Express 生成聊天室</title>
		<link>http://blog.frost.tw/code/poston-2011-10-05/postid-1256</link>
		<comments>http://blog.frost.tw/code/poston-2011-10-05/postid-1256#comments</comments>
		<pubDate>Tue, 04 Oct 2011 16:08:15 +0000</pubDate>
		<dc:creator>蒼時弦や</dc:creator>
				<category><![CDATA[程式語言]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[程式]]></category>

		<guid isPermaLink="false">http://blog.frost.tw/?p=1256</guid>
		<description><![CDATA[最近又開始研究Node.JS，也因此開始接觸一些 Module 。 （實際上很久之前就接觸了，只是人懶拉……） 這次接觸的是有名的MVC Framework &#8211; Express 和 方便的 Socket.IO 。 說實在的，用來做聊天室真的「非常省時」 （想當初我慢慢寫程式，現在竟然只要半小時……） 大家自己用 NPM 安裝好 Express 後，就用 express -t ejs 生成一個專案吧！ （以下只會針對 Socket.IO 對聊天室製作的程式碼做說明喔！） app.js var io = require("socket.io").listen(app); //app 是 var app = express.createServer(); /* .... 略 &#8230; <a href="http://blog.frost.tw/code/poston-2011-10-05/postid-1256">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>最近又開始研究Node.JS，也因此開始接觸一些 Module 。</p>
<p>（實際上很久之前就接觸了，只是人懶拉……）</p>
<p>這次接觸的是有名的MVC Framework &#8211; Express 和 方便的 Socket.IO 。</p>
<p>說實在的，用來做聊天室真的「非常省時」</p>
<p>（想當初我慢慢寫程式，現在竟然只要半小時……）</p>
<p><span id="more-1256"></span></p>
<p>大家自己用 NPM 安裝好 Express 後，就用 express -t ejs 生成一個專案吧！</p>
<p>（以下只會針對 Socket.IO 對聊天室製作的程式碼做說明喔！）</p>
<p><strong> app.js </strong></p>
<pre class="brush:js">var io = require("socket.io").listen(app); //app 是 var app = express.createServer();

/* .... 略 .... */
app.listen(3000);

//Chat Room
var onlineList = {}; //建立一個線上列表物件

io.sockets.on('connection', function(socket){ //照官方的處理，基本上就是當Clinet連線時要做的事情

  socket.emit('reqNickname'); //向Client要求暱稱（其實應該用 join 而不是這樣，因為這樣會造成一些問題）
  socket.on('setNickname', function(nickname){ //當Client設定暱稱時
    if(!onlineList[nickname]){ //檢查暱稱是否重複
      socket.set('nickname', nickname, function(){ //Socket.IO 支援類似 Session 的儲存，這邊用來紀錄使用者暱稱
        onlineList[nickname] = socket; //這邊把 socket 物件存進去，用於之後的 Private Message 功能（Socket.IO 的每個 socket 都是對應個別 Client 的，不能搞混）
        socket.broadcast.emit('system', {'msg' : '<strong>' + nickname + '</strong> join!'}); //使用Broadcast可以發給除了自己外全部的Client (通知某使用者加入聊天室)
        socket.emit('ready'); //告訴Client可以開始聊天（此時發訊息等才會解鎖，本範例沒有特別限制）
      });
    }else{
      socket.emit('reqNickname'); //如果暱稱存在，則重新要求暱稱
    }
  });

  socket.on('chat', function(data){ //當Client發送聊天訊息
    socket.get('nickname', function(err, nickname){ //先取得暱稱
      if(!err){ //檢查是否有發生錯誤
        if(data.indexOf('/pm ') === 0){ //檢查是否為 /pm 的開頭，如果是判定為「私訊」
          var receiver = data.substr(4); //切割字串
          receiver = receiver.substr(0, receiver.indexOf(' ')); //取得收訊人的暱稱
          var chatMsg = data.substr(receiver.length + 5); //把剩下文字當要傳送的訊息
          if(onlineList[receiver]){ //檢查接收者是否存在
            onlineList[receiver].emit('pm', {'nickname' : nickname, 'msg' : chatMsg, 'rec' : receiver}); //發送給接收者私訊
            socket.emit('pm', {'nickname' : nickname, 'msg' : chatMsg, 'rec' : receiver}); //對Client也發送一次
          }else{
            socket.emit('system', {'msg' : '<strong>' + receiver + '</strong> not found.'});  //接收者不存在則出現錯誤訊息
          }
        }else{
          //一般情況正常聊天
          socket.broadcast.emit('chat', {'nickname' : nickname, 'msg' : data});
          socket.emit('chat', {'nickname' : nickname, 'msg' : data});
        }
      }
    });
  });

  socket.on('disconnect', function(){ //使用者斷開（系統）
    socket.get('nickname', function(err, nickname){ //先取得暱稱
      if(!err){
        if(onlineList[nickname]){ //確認是否存在使用者
          socket.broadcast.emit('system', {'msg' : '<strong>' + nickname + '</strong> exit.'}); //發送系統訊息告知其他使用者Client離線
        }
      }
    });
  });
});</pre>
<p><strong> index.ejs </strong></p>
<p>這邊用 jQuery 輔助，沒有做版面排版（CSS則略，因為除了設定 overflow:hide 之外其他沒有特別設定）</p>
<pre class="brush:html">&lt;script src="/socket.io/socket.io.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;

&lt;h1&gt;&lt;%= title %&gt;&lt;/h1&gt;
&lt;p&gt;Welcome to &lt;%= title %&gt;&lt;/p&gt;

&lt;div id="chatArea"&gt;

&lt;/div&gt;
&lt;div id="chatForm"&gt;
	&lt;form action="" method="post" name="charForm" id="chat"&gt;
		&lt;span id="nickname"&gt;Unknow&lt;/span&gt; :
		&lt;input type="text" name="message" size="50" id="message" /&gt;
		&lt;input type="submit" name="send" value="Send" id="send" /&gt;
	&lt;/form&gt;
&lt;/div&gt;

&lt;script type="text/javascript"&gt;

    function scrollChatArea()
    {

    }

	var socket = io.connect("dmd.frost.tw", {'port':3030});

	var nickname = "Unknow";

	socket.on('reqNickname', function(){
		nickname = prompt('Type your nickname', '');
		socket.emit('setNickname', nickname);
	});

	socket.on('ready', function(){
		$("#nickname").html("&lt;strong&gt;" + nickname + "&lt;/strong&gt;");
		$("#chat").submit(function(e){

			var msg = $('input[name="message"]').val();
			socket.emit('chat', msg);
			$('input[name="message"]').val('').focus();

			return false;

		});
	});

	socket.on('chat', function(data){
		$("&lt;div&gt;&lt;strong&gt;" + data.nickname + "&lt;/strong&gt; Says: " + data.msg + "&lt;/div&gt;").hide().appendTo("#chatArea").fadeIn();
		$("#chatArea").scrollTop( $("#chatArea").innerHeight() );
	});

    socket.on('system', function(data){
    	$("&lt;div&gt;&amp;gt; " + data.msg + "&lt;/div&gt;").hide().appendTo("#chatArea").fadeIn();
		$("#chatArea").scrollTop( $("#chatArea").innerHeight() );
	});

    socket.on('pm', function(data){
        $("&lt;div&gt;&lt;strong&gt;" + data.nickname + "&lt;/strong&gt; to &lt;strong&gt;" + data.rec + "&lt;/strong&gt; Says: " + data.msg + "&lt;/div&gt;").hide().appendTo("#chatArea").fadeIn();
    	$("#chatArea").scrollTop( $("#chatArea").innerHeight() );
    });

&lt;/script&gt;</pre>
<p>前端使用方法和後端大同小異，都是用 on 和 emit 處理。<br />
如此一來，就完成一個有 PM 功能的聊天室了！<br />
（其實 Socket.IO 還支援 Room 的概念，只要把 Client 用 .join(&#8216;room name&#8217;) 就可以了！）<br />
有不清楚的部份請告知一下，我會解釋……<br />
（這篇文章就針對Server-Side做解釋而已，其他有問題還是可以問的～）<!-- PHP 5.x --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.frost.tw/code/poston-2011-10-05/postid-1256/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>我所知道的遊戲製作～</title>
		<link>http://blog.frost.tw/life/poston-2011-10-02/postid-1254</link>
		<comments>http://blog.frost.tw/life/poston-2011-10-02/postid-1254#comments</comments>
		<pubDate>Sun, 02 Oct 2011 15:21:01 +0000</pubDate>
		<dc:creator>蒼時弦や</dc:creator>
				<category><![CDATA[生活雜記]]></category>
		<category><![CDATA[大學]]></category>
		<category><![CDATA[生活]]></category>
		<category><![CDATA[程式]]></category>
		<category><![CDATA[遊戲]]></category>

		<guid isPermaLink="false">http://blog.frost.tw/?p=1254</guid>
		<description><![CDATA[這篇是拿來Share給同學的～ 因為班導似乎打算讓我們先體驗製作遊戲，不過大家還是對於像是「不會寫程式」這類東西有疑問。 所以，還是讓大家對這個疑問先解除，恐懼感才不會這麼大拉～ 一般來說，製作一個遊戲除了自己生成之外，大多是團隊合作。 （自己做通常不是人類就是違反著作權了吧……） 最基本的就是一個寫劇本的人，負責規劃遊戲的劇情、內容等等。 再來就是要有繪圖師，負責場景、角色等等的繪製。 然後是樂師，負責編曲等等…… 最後才是程式員，因為很多工具都幫你做好基本模組了，不太需要這人（淚 因為我自己沒有詳細研究劇情對玩家影響，不過我想劇情好，即使畫面普通，玩家也是會給予好評的。 因此負責劇情的人在遊戲中算是非常重要的角色（大家都很重要，不過劇情不好真的難混……） 再來就是繪圖師，說實在的，不管程式多好，畫面不漂亮也就沒人想玩了！ （有人會想玩看起來像幼稚園塗鴉的遊戲嗎？即使是那種風格也會夠精緻吧！） 樂師其實也扮演重要角色，畢竟，氣氛事由樂師搭配繪師呈現的，音樂選錯，那遊戲就會有違和感了！ 阿，再來就是苦命的程序員拉！說實在，如果是想做電子小說或AVG, RPG這類遊戲，程序員大多可以領便當了！ 電子小說和AVG遊戲可以靠像是 戀愛遊戲製作大師/KrKr 來完成。 而RPG遊戲可以用RPG Maker來完成摟！ 不過最近也有像是 Unity3D 的軟體出現，程序員整個崩潰了（苦笑 像是要做FPS之類的遊戲，靠簡單的設定Unity3D也能夠做出來…… 不過，以上都是個幻想（誤 如果你想弄個大規模的遊戲，這時候就是程序員的世界了！ 當然，如果你很不齒Maker系列或者不想用什麼Game Engine(遊戲引擎)那就只好告訴程序員：「你爆肝的時間到了！」沒錯，以上不用真的會爆肝！ 以下就來談談程式，小弟最擅長這個拉！ 先從電子小說的 KrKr 談起，因為電子小說是最為簡單的遊戲類型（製作超容易～） KrKr是一款日本人開發的遊戲引擎（稱作製作工具也許會比較好）相應的程式語言是 TJS (自己開發的，類似於C/C++) 一般使用其實不會動到這部份，只要去撰寫 Script (腳本) 即可。不過如果想要更多功能，就可以使用 &#8230; <a href="http://blog.frost.tw/life/poston-2011-10-02/postid-1254">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>這篇是拿來Share給同學的～<br />
因為班導似乎打算讓我們先體驗製作遊戲，不過大家還是對於像是「不會寫程式」這類東西有疑問。<br />
所以，還是讓大家對這個疑問先解除，恐懼感才不會這麼大拉～</p>
<p><span id="more-1254"></span></p>
<p>一般來說，製作一個遊戲除了自己生成之外，大多是團隊合作。<br />
（自己做通常不是人類就是違反著作權了吧……）</p>
<p>最基本的就是一個寫劇本的人，負責規劃遊戲的劇情、內容等等。<br />
再來就是要有繪圖師，負責場景、角色等等的繪製。<br />
然後是樂師，負責編曲等等……<br />
最後才是程式員，因為很多工具都幫你做好基本模組了，不太需要這人（淚</p>
<p>因為我自己沒有詳細研究劇情對玩家影響，不過我想劇情好，即使畫面普通，玩家也是會給予好評的。<br />
因此負責劇情的人在遊戲中算是非常重要的角色（大家都很重要，不過劇情不好真的難混……）<br />
再來就是繪圖師，說實在的，不管程式多好，畫面不漂亮也就沒人想玩了！<br />
（有人會想玩看起來像幼稚園塗鴉的遊戲嗎？即使是那種風格也會夠精緻吧！）<br />
樂師其實也扮演重要角色，畢竟，氣氛事由樂師搭配繪師呈現的，音樂選錯，那遊戲就會有違和感了！</p>
<p>阿，再來就是苦命的程序員拉！說實在，如果是想做電子小說或AVG, RPG這類遊戲，程序員大多可以領便當了！<br />
電子小說和AVG遊戲可以靠像是 戀愛遊戲製作大師/KrKr 來完成。<br />
而RPG遊戲可以用RPG Maker來完成摟！</p>
<p>不過最近也有像是 Unity3D 的軟體出現，程序員整個崩潰了（苦笑<br />
像是要做FPS之類的遊戲，靠簡單的設定Unity3D也能夠做出來……</p>
<p>不過，以上都是個幻想（誤<br />
如果你想弄個大規模的遊戲，這時候就是程序員的世界了！<br />
當然，如果你很不齒Maker系列或者不想用什麼Game Engine(遊戲引擎)那就只好告訴程序員：「你爆肝的時間到了！」沒錯，以上不用真的會爆肝！</p>
<p>以下就來談談程式，小弟最擅長這個拉！<br />
先從電子小說的 KrKr 談起，因為電子小說是最為簡單的遊戲類型（製作超容易～）<br />
KrKr是一款日本人開發的遊戲引擎（稱作製作工具也許會比較好）相應的程式語言是 TJS (自己開發的，類似於C/C++)<br />
一般使用其實不會動到這部份，只要去撰寫 Script (腳本) 即可。不過如果想要更多功能，就可以使用 TJS 去做延伸摟！</p>
<p>再來是 RPG Maker 系列，這部份使用的是 Ruby 當作程式語言（不過實際上是一種叫做 RGSS 的腳本語言，不過基本上跟 Ruby 相同，除了部份功能無法使用外）<br />
這部份，就讓 RPG Maker 脫離了 RPG 世界，成為一種非常多運用的遊戲開發工具了！（在RPG Maker XP之後才支援，在那之前就是一個得靠複雜設定才能做出變化的製作工具）有了 RGSS 的輔助，不但不需要處理太多繪圖上的問題（做遊戲很麻煩的部份，要確實把圖片顯示正確遊戲才會正確顯示）還能夠做許多變化。<br />
有興趣可以看看一款叫做「變調迴旋曲」系列，是一款很棒的遊戲，大家可以玩玩看。</p>
<p>最後是 Unity3D 了！<br />
說實在的，雖然剛推出不久，不過就在國外非常熱門。<br />
（雖然不知道我國為什麼不紅，不過這是一個很棒的軟體喔！）<br />
Unity3D雖然是遊戲引擎，不過他的編輯器非常好用。<br />
在加上他對跨平台支援（Windows/Mac/iOS/Android）的支援，以及淺顯易懂的程式語言（JavaScript）或者高度擴充性（Java/C#/C++等）讓筆者覺得這個軟體非常的讚。<br />
因此也是非常推薦，雖然只能做3D遊戲（2D要透過額外程式輔助）不過做出來的品質非常棒，國外也有人用於開發線上遊戲了！</p>
<p>概觀來看，會不會程式不是必要的，是否有心去做比較重要。<br />
而且，不會程式，還有很多好軟體等你來用，雖然可以做的類型和變化少了，但是終究還是能做出遊戲喔！</p>
<p>其實，遊戲程式相關的部份也很多。<br />
像是 Lua 這個程式語言就常常被用在模組（魔獸）之類的，像是大家打的信長，就是用Lua之類的腳本語言做出來的模組。</p>
<p>概略介紹就是這樣，別怕不會程式。<br />
自己不會還有別人會，學會團隊合作跟保持熱情才是重點～<!-- PHP 5.x --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.frost.tw/life/poston-2011-10-02/postid-1254/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>邪門Google運用 &#8211; JavaScript 留言板</title>
		<link>http://blog.frost.tw/code/poston-2011-05-29/postid-1199</link>
		<comments>http://blog.frost.tw/code/poston-2011-05-29/postid-1199#comments</comments>
		<pubDate>Sun, 29 May 2011 11:16:06 +0000</pubDate>
		<dc:creator>蒼時弦や</dc:creator>
				<category><![CDATA[程式語言]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[程式]]></category>

		<guid isPermaLink="false">http://blog.frost.tw/?p=1199</guid>
		<description><![CDATA[各位還記得之前分享的 Dropbox 應用 DropPages 嗎？ 之前網友說他一週就不能用，我就無視很久，不過今天檢查卻發現是可以免費使用的喔！ 不過，不能放PHP等程式上去一直是弦也頭痛的問題。 但今天弦也看到了一篇用 jQuery + YQL (Yahoo Query Language) + Google Spreadsheet 的應用教學，得到萌發啟發了？ 先看一下我們邪門的參考資料： http://tutorialzine.com/2010/08/dynamic-faq-jquery-yql-google-docs/ &#8211; YQL + Google Docs via jQuery 製作動態 FAQ （亂翻譯） http://p2pu.org/webcraft/node/27443/document/27520 &#8211; 就算是Google Spreadsheet 的 Form 我也有辦法讓他卡到陰（根本不是這麼一回事！） 光靠以上兩篇，我們就可以做出邪門的 純JavaScript 留言板摟！ &#8230; <a href="http://blog.frost.tw/code/poston-2011-05-29/postid-1199">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>各位還記得之前分享的 Dropbox 應用 DropPages 嗎？<br />
之前網友說他一週就不能用，我就無視很久，不過今天檢查卻發現是可以免費使用的喔！</p>
<p>不過，不能放PHP等程式上去一直是弦也頭痛的問題。<br />
但今天弦也看到了一篇用 jQuery + YQL (Yahoo Query Language) + Google Spreadsheet 的應用教學，得到<span style="color: #000000;"><del>萌發</del></span>啟發了？<br />
<span id="more-1199"></span>先看一下我們邪門的參考資料：<br />
<a href="http://tutorialzine.com/2010/08/dynamic-faq-jquery-yql-google-docs/" target="_blank">http://tutorialzine.com/2010/08/dynamic-faq-jquery-yql-google-docs/</a> &#8211; YQL + Google Docs via jQuery 製作動態 FAQ （亂翻譯）<br />
<a href="http://p2pu.org/webcraft/node/27443/document/27520" target="_blank">http://p2pu.org/webcraft/node/27443/document/27520</a> &#8211; 就算是Google Spreadsheet 的 Form 我也有辦法讓他卡到陰（根本不是這麼一回事！）</p>
<p>光靠以上兩篇，我們就可以做出邪門的 純JavaScript 留言板摟！</p>
<p>步驟一：</p>
<p>到你的 Google Docs 新增邪門的表單（和試算表一組的那個！？）<br />
然後設定一下欄位（本範例只有暱稱和留言兩個項目）</p>
<p><a href="http://blog.frost.tw/wp-content/uploads/2011/05/2011-05-29-18-50-55.png" rel="lightbox[1199]" title="2011-05-29 18 50 55"><img class="alignnone size-medium wp-image-1200" title="2011-05-29 18 50 55" src="http://blog.frost.tw/wp-content/uploads/2011/05/2011-05-29-18-50-55-300x110.png" alt="" width="300" height="110" /></a></p>
<p>步驟二：</p>
<p>取得表單的網址（Google 會給你一段 iframe 的 HTML 語法，用那段找出來～）</p>
<p><a href="http://blog.frost.tw/wp-content/uploads/2011/05/2011-05-29-18-51-07.png" rel="lightbox[1199]" title="2011-05-29 18 51 07"><img class="alignnone size-full wp-image-1201" title="2011-05-29 18 51 07" src="http://blog.frost.tw/wp-content/uploads/2011/05/2011-05-29-18-51-07.png" alt="" width="166" height="102" /></a></p>
<p><a href="http://blog.frost.tw/wp-content/uploads/2011/05/2011-05-29-18-51-33.png" rel="lightbox[1199]" title="2011-05-29 18 51 33"><img class="alignnone size-medium wp-image-1202" title="2011-05-29 18 51 33" src="http://blog.frost.tw/wp-content/uploads/2011/05/2011-05-29-18-51-33-300x87.png" alt="" width="300" height="87" /></a><br />
（網址是 src="網址" 的部份）</p>
<p>步驟三：</p>
<p>從表單找出送出的位置，還有各個欄位的 name 是多少。<br />
<a href="http://blog.frost.tw/wp-content/uploads/2011/05/2011-05-29-18-52-07.png" rel="lightbox[1199]" title="2011-05-29 18 52 07"><img class="alignnone size-medium wp-image-1203" title="2011-05-29 18 52 07" src="http://blog.frost.tw/wp-content/uploads/2011/05/2011-05-29-18-52-07-300x244.png" alt="" width="300" height="244" /></a></p>
<p><a href="http://blog.frost.tw/wp-content/uploads/2011/05/2011-05-29-18-52-47.png" rel="lightbox[1199]" title="2011-05-29 18 52 47"><img class="alignnone size-medium wp-image-1204" title="2011-05-29 18 52 47" src="http://blog.frost.tw/wp-content/uploads/2011/05/2011-05-29-18-52-47-300x95.png" alt="" width="300" height="95" /></a></p>
<p>如果有 Firebug 或者使用較新版的Chrome/Safari可以點選右鍵&gt;觀察元素，比較好找。<br />
（action="表單送出位置" 還有各欄位的 name 值）</p>
<p>步驟四：</p>
<p>轉換成HTML頁面（美工請自己負責喔～）</p>
<p>引用 jQuery 程式庫，這邊使用 1.4 是因為教學的版本，各位可以自行選用新版。</p>
<p><a href="http://blog.frost.tw/wp-content/uploads/2011/05/2011-05-29-18-54-17.png" rel="lightbox[1199]" title="2011-05-29 18 54 17"><img class="alignnone size-medium wp-image-1205" title="2011-05-29 18 54 17" src="http://blog.frost.tw/wp-content/uploads/2011/05/2011-05-29-18-54-17-300x9.png" alt="" width="300" height="9" /></a></p>
<p>建構前端介面（表單、留言區塊）<br />
<a href="http://blog.frost.tw/wp-content/uploads/2011/05/2011-05-29-18-54-47.png" rel="lightbox[1199]" title="2011-05-29 18 54 47"><img class="alignnone size-medium wp-image-1206" title="2011-05-29 18 54 47" src="http://blog.frost.tw/wp-content/uploads/2011/05/2011-05-29-18-54-47-300x63.png" alt="" width="300" height="63" /></a></p>
<p>撰寫 JavaScript 部份（使用YQL輔助）<br />
<a href="http://blog.frost.tw/wp-content/uploads/2011/05/2011-05-29-18-55-05.png" rel="lightbox[1199]" title="2011-05-29 18 55 05"><img class="alignnone size-medium wp-image-1207" title="2011-05-29 18 55 05" src="http://blog.frost.tw/wp-content/uploads/2011/05/2011-05-29-18-55-05-300x149.png" alt="" width="300" height="149" /></a></p>
<p>上面的 csvURL 是從發布表單的地方取得：<br />
<a href="http://blog.frost.tw/wp-content/uploads/2011/05/2011-05-29-18-58-32.png" rel="lightbox[1199]" title="2011-05-29 18 58 32"><img class="alignnone size-medium wp-image-1209" title="2011-05-29 18 58 32" src="http://blog.frost.tw/wp-content/uploads/2011/05/2011-05-29-18-58-32-300x159.png" alt="" width="300" height="159" /></a><br />
（選用 csv格式）</p>
<p>接著設定 YQL 的查詢網址。<br />
?q= 之後是查詢語法，這邊使用的是<br />
SELECT * FROM csv WHERE url = &#8216;csvURL(有經過 urlEncode)&#8217; AND column = &#8216;time, nickname, content&#8217;<br />
這樣就代表我用 csv 格式查詢，從我傳入的 URL 位置，並且依序設定欄位名稱為 time, nickname, content</p>
<p>最後用 jQuery 的 Ajax 功能取得 JSON 傳回，並且用 $.each 依序處理傳回值。<br />
（用FireFox可以觀察到物件在 msg.query.result.row 裡面，不過只有一筆資料會發生錯誤就是了……）</p>
<p>註：在 each 的處理函式讓他傳入 key 檢查是否 == 0 來把 Google Spreadsheet 預設的欄位跳過。</p>
<p>最後做偵測處理。<br />
1. 送出表單會跑到 Google 頁面，所以讓 form 指向設定的框架（隱藏）<br />
2. 用 jQuery 偵測 onsubmit 事件，送出後設定 submitted 為 true<br />
3. 此時隱藏的 iframe 會因為送出表單觸發，接著發現 submitted 為 true 於是重新整理頁面。<br />
4. 留言板流程運作完畢</p>
<p>這樣一來就可以留言了，中間有一些部份需要多加思考。<br />
註：使用 YQL 會無法即時，而 jQuery Plugin 的 jSpreadheet 版本過舊，各位可能要自己處理 CSV 格式化。</p>
<p>範例：<a href="http://dl.dropbox.com/u/4023935/Web%20Showcase/evil-Google-Guestbook.html" target="_blank">http://dl.dropbox.com/u/4023935/Web%20Showcase/evil-Google-Guestbook.html</a><!-- PHP 5.x --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.frost.tw/code/poston-2011-05-29/postid-1199/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>C++ 重新開始~</title>
		<link>http://blog.frost.tw/code/poston-2011-05-16/postid-1182</link>
		<comments>http://blog.frost.tw/code/poston-2011-05-16/postid-1182#comments</comments>
		<pubDate>Mon, 16 May 2011 10:45:14 +0000</pubDate>
		<dc:creator>蒼時弦や</dc:creator>
				<category><![CDATA[程式語言]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[校園]]></category>
		<category><![CDATA[程式]]></category>

		<guid isPermaLink="false">http://blog.frost.tw/?p=1182</guid>
		<description><![CDATA[今天開始，我們這群考上學校的大學生可以說是「很悶」 而我又沒有筆電，只好默默的看書拉！ 幸好老媽昨晚有順便幫我拿書，不然今天把書看完就不知道該做什麼了！ 今日閱讀：「C++程式設計藝術」 高一那時有簡單學過，不過並沒有去深入研究。 頂多只做到寫一個 Socket Server/Client 的程度而已。 （雖然後來有簡單嘗試用 PHP Send Command 給 Socket Server 去控制 Winamp 的播放/暫停不過也只是小玩一下～） 這本書一開始就建立起物件導向觀念。 也因為是教材書，所以寫的真的很清楚。 （當一般書來看也是非常棒的呢！） 這邊就簡單寫個小程式小試身手好了！ （不過沒有編譯環境，就看哪位網友願意幫我試試結果摟！） 下面程式基本上都依照書中要求撰寫出高可讀性的程式碼。 （不過也有一些是自己習慣帶入的……） /** * Simple ATM * * A simple ATM system */ #include&#60;iostream&#62; #include&#60;string&#62; using &#8230; <a href="http://blog.frost.tw/code/poston-2011-05-16/postid-1182">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>今天開始，我們這群考上學校的大學生可以說是「很悶」<br />
而我又沒有筆電，只好默默的看書拉！</p>
<p>幸好老媽昨晚有順便幫我拿書，不然今天把書看完就不知道該做什麼了！<br />
今日閱讀：「C++程式設計藝術」<br />
<span id="more-1182"></span><br />
高一那時有簡單學過，不過並沒有去深入研究。<br />
頂多只做到寫一個 Socket Server/Client 的程度而已。<br />
（雖然後來有簡單嘗試用 PHP Send Command 給 Socket Server 去控制 Winamp 的播放/暫停不過也只是小玩一下～）</p>
<p>這本書一開始就建立起物件導向觀念。<br />
也因為是教材書，所以寫的真的很清楚。<br />
（當一般書來看也是非常棒的呢！）</p>
<p>這邊就簡單寫個小程式小試身手好了！<br />
（不過沒有編譯環境，就看哪位網友願意幫我試試結果摟！）</p>
<p>下面程式基本上都依照書中要求撰寫出高可讀性的程式碼。<br />
（不過也有一些是自己習慣帶入的……）</p>
<pre class="brush: cpp">
/**
 * Simple ATM
 *
 * A simple ATM system
 */
#include&lt;iostream&gt;
#include&lt;string&gt;

using namespace std;

class SimpleATM
{

  public:
    void function SimpleATM(string initUsername) //Construct
    {
      setUsername(initUsername);
    }

    void function setUsername(string setUsername)
    {
      username = setUsername;
    }

    string function getUsername()
    {
      return username;
    }

    int function getBalance()
    {
        return balance;
    }

    void setBalance(int setBalance)
    {
      balance = setBalance;
    }

    boolean function saveMoney(int moneyPlus)
    {
      if(moneyPlus > 0){ //check is a valid value
        setBalance(getBalance() + moneyPlus);
        return true;
      }else{
        return false;
      }
    }

   boolean function cashOut(int moneyGet)
   {
      if(moneyGet > 0){ //check is a valid value
        setBalance(getBalance() - moneyGet);
        return true;
      }else{
        return false;
      }
   }

  void function displayBalance()
  {
    cout << "Hello, " << getUsername() << ".\nYour balance is " << getBalance() << endl;
  }
  private:
    int balance;
    string username;

}; //容易忘記的部份

void main()
{
  SimpleATM aotoki("Aotoki");
  aotoki.displayBalance();
  aotoki.saveMoney(100);
  aotoki.displayBalance();
  aotoki.cashOut(25);
  aotoki.displayBalance();
}
</pre>
<p>會寫這段是因為以前有網友問過，所以就拿來練習看看～<br />
（找個時間編譯看看能不能正常運作好了……）<!-- PHP 5.x --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.frost.tw/code/poston-2011-05-16/postid-1182/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress 購物車製作筆記(1)</title>
		<link>http://blog.frost.tw/web-project/poston-2011-03-27/postid-1144</link>
		<comments>http://blog.frost.tw/web-project/poston-2011-03-27/postid-1144#comments</comments>
		<pubDate>Sun, 27 Mar 2011 11:18:54 +0000</pubDate>
		<dc:creator>蒼時弦や</dc:creator>
				<category><![CDATA[網站專案]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[生活]]></category>
		<category><![CDATA[程式]]></category>
		<category><![CDATA[網站]]></category>

		<guid isPermaLink="false">http://blog.frost.tw/?p=1144</guid>
		<description><![CDATA[似乎已經很久沒有寫網誌了～ 最近和備審、面試對抗，難得抽出時間來寫。 （直到上週都是備審，之後又是個面試大戰呢！） 弦也運氣不錯，申請六所上四所。 （沒上那兩所也是差了一點點就上了，大約1~2級分左右。） 這次會做主要是因為我大學的伙食費阿（誤 主要還是寒假那個老爸的 Project 拉！ 不過使用WordPress如有神助呢！ 至少到現在，都還沒有自己寫過GUI控制（增加Meta Box算是簡單的加上吧……） 其餘的，大多是使用Custom Post Type就完成了！ 就這方面來看，使用WordPress這個決定真是太正確了！ 目前商品的設定項都差不多了，接下來就是比較進階的訂單和金流的處理摟！ （期待我完成的那天，因為可以開始領傳說中的維護費……） 休息一下就來繼續製作～]]></description>
			<content:encoded><![CDATA[<p>似乎已經很久沒有寫網誌了～<br />
最近和備審、面試對抗，難得抽出時間來寫。<br />
（直到上週都是備審，之後又是個面試大戰呢！）</p>
<p>弦也運氣不錯，申請六所上四所。<br />
（沒上那兩所也是差了一點點就上了，大約1~2級分左右。）<br />
<span id="more-1144"></span><br />
這次會做主要是因為我大學的伙食費阿（誤</p>
<p>主要還是寒假那個老爸的 Project 拉！<br />
不過使用WordPress如有神助呢！</p>
<p>至少到現在，都還沒有自己寫過GUI控制（增加Meta Box算是簡單的加上吧……）<br />
其餘的，大多是使用Custom Post Type就完成了！</p>
<p>就這方面來看，使用WordPress這個決定真是太正確了！</p>
<p>目前商品的設定項都差不多了，接下來就是比較進階的訂單和金流的處理摟！<br />
（期待我完成的那天，因為可以開始領傳說中的維護費……）</p>
<p>休息一下就來繼續製作～<!-- PHP 5.x --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.frost.tw/web-project/poston-2011-03-27/postid-1144/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>《弦也式插件開發術》序．Plugin 概論</title>
		<link>http://blog.frost.tw/code/poston-2011-02-22/postid-1120</link>
		<comments>http://blog.frost.tw/code/poston-2011-02-22/postid-1120#comments</comments>
		<pubDate>Tue, 22 Feb 2011 11:16:42 +0000</pubDate>
		<dc:creator>蒼時弦や</dc:creator>
				<category><![CDATA[程式語言]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[程式]]></category>
		<category><![CDATA[筆記]]></category>

		<guid isPermaLink="false">http://blog.frost.tw/?p=1120</guid>
		<description><![CDATA[因為我很懶惰，所以就把昨晚在討論版上發表的文章轉貼過來啦～ 這篇文章我想應該還有錯誤的地方。 （大概是我理解錯誤） 不過Discuz/WordPress的插件運行，大致上就是這種構造。 （註：注意事項那段真的是「有人很過份，把別人文章、錄好影片都轉貼」所以我才特地加上的……） 注意事項： 本文章為原創文章，假使未經原作者同意而任意轉載於本站以外的站點，原作者有權以法律途徑要求賠償。 假使欲轉載本文至本站以外之站點，需附上原文網址以及作者網站。 《弦也式插件開發術》序．Plugin 概論 @Author: 蒼時弦や @Website: http://frost.tw/ 一、Plugin 簡介 何謂 Plugin (插件) 呢？ 就字面上的意思，即是「插入」，即使這樣說明也難以理解是什麼意思。 以生活上的方式解釋，就像是樂高一般，將不同大小、形狀的方塊插入，組合出一個形體。 以線上遊戲來看，也許就是像「裝備」一樣，依照你的需求裝備上不同的道具。 簡而言之，插件提供了架站者個人化的選擇，也強化了架站機的功能。 二、何為 Module (模組) 在早期 Xoops, phpBB 時代，會有所謂Module或者Mod這類名詞。 他們與插件的差異，應該就是所謂的 Hook [註] 的使用。 模組就像是一台機器的零件一般，在你需要的時候放進去，組合成一台機器，或者改裝這個機器。 但插件則不同了，他像是晶片或者軟體一般，只需要安裝上去，就會自動調整你的機器。 以現在Server(主機)的CPU能力來看，即使使用Plugin的方式擴充，也不會碰上運算效率低下的問題。 （筆者推測早期模組的使用在於減少CPU使用，以及Hook技術的處理尚未成熟） 註：Hook &#8230; <a href="http://blog.frost.tw/code/poston-2011-02-22/postid-1120">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>因為我很懶惰，所以就把昨晚在討論版上發表的文章轉貼過來啦～<br />
這篇文章我想應該還有錯誤的地方。<br />
（大概是我理解錯誤）</p>
<p>不過Discuz/WordPress的插件運行，大致上就是這種構造。<br />
（註：注意事項那段真的是「有人很過份，把別人文章、錄好影片都轉貼」所以我才特地加上的……）<br />
<span id="more-1120"></span></p>
<p><strong>注意事項：</strong><br />
本文章為原創文章，假使未經原作者同意而任意轉載於本站以外的站點，原作者有權以法律途徑要求賠償。<br />
<span style="color: #ff0000;"><strong>假使欲轉載本文至本站以外之站點，需附上原文網址以及作者網站。</strong></span></p>
<p><strong>《弦也式插件開發術》序．Plugin 概論</strong></p>
<p>@Author: 蒼時弦や<br />
@Website: <a href="http://frost.tw/" target="_blank">http://frost.tw/</a></p>
<p><strong>一、Plugin 簡介</strong><br />
何謂 Plugin (插件) 呢？<br />
就字面上的意思，即是「插入」，即使這樣說明也難以理解是什麼意思。<br />
以生活上的方式解釋，就像是樂高一般，將不同大小、形狀的方塊插入，組合出一個形體。<br />
以線上遊戲來看，也許就是像「裝備」一樣，依照你的需求裝備上不同的道具。</p>
<p>簡而言之，插件提供了架站者個人化的選擇，也強化了架站機的功能。</p>
<p><strong>二、何為 Module (模組)</strong><br />
在早期 Xoops, phpBB 時代，會有所謂Module或者Mod這類名詞。<br />
他們與插件的差異，應該就是所謂的 Hook [註] 的使用。<br />
模組就像是一台機器的零件一般，在你需要的時候放進去，組合成一台機器，或者改裝這個機器。<br />
但插件則不同了，他像是晶片或者軟體一般，只需要安裝上去，就會自動調整你的機器。</p>
<p>以現在Server(主機)的CPU能力來看，即使使用Plugin的方式擴充，也不會碰上運算效率低下的問題。<br />
（筆者推測早期模組的使用在於減少CPU使用，以及Hook技術的處理尚未成熟）</p>
<p>註：Hook &#8211; 鉤子，是與Plugin密切關係的一項處理，他可以協助Plugin在特定的位置增加或修改動作、訊息。</p>
<p><strong>三、Hook的概念</strong><br />
筆者之後將要介紹的WordPress, Discuz等架站機，都是使用 Hook 作為擴充的架站機。<br />
那麼，就必須瞭解 Hook 在 Plugin 上的意義了！</p>
<p>鉤子像是什麼東西呢？<br />
簡單的形容他，大概就像是一個標記，讓程式可以識別。<br />
不過，這樣也許還是非常抽象，但是筆者也想不到什麼好方法可以解釋Hook的意義。</p>
<p>而 Hook 是如何與 Plugin 作為關聯呢？<br />
這是一個非常簡單的概念，就如同前文所述的「標記」這個動作。<br />
不論是WordPress還是Discuz他們皆有共通的特色。<br />
那就是在特定的「點」有一段程式碼會運行某個 Hook 並且去喚醒 Plugin 內的程式碼。</p>
<p>也許 Hook 可以當作是鬧鐘，在某個時間把你叫醒一般。<br />
以 WordPress 的 Hook 為例子來看。<br />
在WordPress程式大多運行完畢後，會呼叫 init 這個鉤子（每個鉤子都有自己的名稱，這個是名為「初始化」的鉤子）<br />
此時，只要你的Plugin設定某段程式碼是 init 這個鉤子所呼叫的片段，那麼在 init 運行時，就會連同你的鉤子一同執行。</p>
<p><strong>四、WordPress的Hook (主動式)</strong><br />
就筆者認為，在WordPress去追加一個動作的方式來看，在WordPress上比較為「主動」<br />
何為主動呢？<br />
也就是需要開發者自行追加，才會有效果。</p>
<p>這邊我們以一小段程式碼為例子：</p>
<pre class="brush: php">&lt;?php
function my_hook()
{
//Here will do something...
}
add_action('init', 'my_hook');
?&gt;</pre>
<p>上述的程式碼將會在 init 這個 hook 點運行時，一併運行 my_hook 這個函式。<br />
這也就是 WordPress 的Hook運行方式。<br />
（沒有使用 add_action 或 add_filter 去告訴系統，有片段要再某個Hook運行，系統就不會去運行。）</p>
<p><strong>五、Discuz的Hook (被動式)</strong><br />
為什麼筆者稱Discuz的Hook為被動式呢？<br />
因為當開發者寫好他的程式碼片段後，只要 Hook 點運行，就會被呼叫。<br />
完全不需要自己主動去告訴Hook要運行的動作。</p>
<p>[註] 因為筆者長期沒有開發 Discuz 插件，因此以官方文件的代碼來解釋。</p>
<pre class="brush: php">//全局脚本嵌入点类
class plugin_identifier_CURSCRIPT[_DO] extends plugin_identifier {

function HookId_1() {
......
return ...;
}

function HookId_2() {
......
return ...;
}

......

}</pre>
<p>以上方程式碼的片段來看，插件都一律以 plugin_插件識別名 來做命名（物件）<br />
而對某個 Hook 新增動作時，就會以 plugin_插件識別名_動作文件 來做命名（物件）<br />
而 HookId 就是每個 Hook 的識別名稱了！<br />
如 viewthread 為閱讀文章相關的 Hook 動作。</p>
<p><strong>六、開發WordPress &amp; Discuz 插件的要點</strong><br />
使用 Hook 將會是這兩類架站機的重要觀念。<br />
並且要分別習慣兩種架站機其產生訊息的方式以及差異。<br />
如 WordPress 並無版模系統，並且有 Action Hook 以及 Filter Hook 兩種。<br />
Action Hook 單純做運算處理，屬於 Controller/Model 層面（控制/模型層）<br />
Filter Hook 則是負責輸出處理，屬於 Views 層面（視圖層）</p>
<p>而在Discuz上，一般訊息的顯示都以呼叫函式產生。<br />
大部分的返回訊息也是以 return 就能夠輸出。<br />
（某種意義上，在Discuz大部分的Hook都是Filter Hook）<br />
當想輸出頁面時，也需要使用特定函式才可輸出（還需建立版模）</p>
<p>不過，共通的要點就是熟悉這些 Hook 的位置以及使用時機。<br />
（在WordPress上有優先權的設置，而Discuz則無。）</p>
<p><strong>七、小結</strong><br />
雖然網路上的Plugin變化非常多，也有許多五花八門的運用。<br />
但探究其原理，實際上只有非常少的內容。<br />
整個 Plugin 技術，都是圍繞在 Hook 這個部份上。<br />
其餘的都是單純的 PHP 開發，只不過規模比較小而已。</p>
<p>當熟悉 Hook 之後，往後的 Plugin 開發就算是通行無阻了！<!-- PHP 5.x --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.frost.tw/code/poston-2011-02-22/postid-1120/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>WordPress 的「裁切」功能</title>
		<link>http://blog.frost.tw/code/poston-2011-02-14/postid-1107</link>
		<comments>http://blog.frost.tw/code/poston-2011-02-14/postid-1107#comments</comments>
		<pubDate>Mon, 14 Feb 2011 11:09:56 +0000</pubDate>
		<dc:creator>蒼時弦や</dc:creator>
				<category><![CDATA[程式語言]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[生活]]></category>
		<category><![CDATA[程式]]></category>

		<guid isPermaLink="false">http://blog.frost.tw/?p=1107</guid>
		<description><![CDATA[最近因為案子的關係，需要做一個「幻燈片」功能在 WordPress 首頁上。 不過，裁切圖片、縮圖的問題倒是很困擾我的。 再加上我還未嘗試過「讀取特色圖片以外」的圖檔，以及「自行上傳圖檔」的處理。 不過，當我看到 WordPress 的 Custom Header 功能後，我馬上知道我該怎麼做了！ WordPress 內建一款名為 imgAreaSelect 的切圖 jQuery Plguin 不過，似乎只有在使用 Custom Header 時比較容易見到他。 （據說在媒體庫上傳時也能使用，不過大家通常都是隨文章上傳吧……） 那麼，我想另外呼叫又該如何做呢？ 以 WordPress 的作法，是三部曲。 上傳、裁切、儲存三個部份。 首先我們來看看裁切中的畫面。 實際上用起來沒有 Flash 的靈敏，不過已經算很方便了！ 當裁切完成後，製作成 Slideshow 時，效果又如何呢？ （某弦案子的製成品，會如下圖所示……） 抓取的區域會被切下（圖片解析度不夠大時，會被拉大，裁切時請注意喔！） 那麼，分別來解釋這個「三部曲」吧！ （大部分原始碼都來自 Custom Header &#8230; <a href="http://blog.frost.tw/code/poston-2011-02-14/postid-1107">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>最近因為案子的關係，需要做一個「幻燈片」功能在 WordPress 首頁上。<br />
不過，裁切圖片、縮圖的問題倒是很困擾我的。<br />
再加上我還未嘗試過「讀取特色圖片以外」的圖檔，以及「自行上傳圖檔」的處理。</p>
<p>不過，當我看到 WordPress 的 Custom Header 功能後，我馬上知道我該怎麼做了！<br />
<span id="more-1107"></span><br />
WordPress 內建一款名為 imgAreaSelect 的切圖 jQuery Plguin<br />
不過，似乎只有在使用 Custom Header 時比較容易見到他。<br />
（據說在媒體庫上傳時也能使用，不過大家通常都是隨文章上傳吧……）</p>
<p>那麼，我想另外呼叫又該如何做呢？<br />
以 WordPress 的作法，是三部曲。</p>
<p>上傳、裁切、儲存三個部份。</p>
<p>首先我們來看看裁切中的畫面。<br />
<a href="http://blog.frost.tw/wp-content/uploads/2011/02/2011-02-14-18-43-26.png" rel="lightbox[1107]" title="幻燈片 - 裁切中"><img class="alignnone size-medium wp-image-1108" title="幻燈片 - 裁切中" src="http://blog.frost.tw/wp-content/uploads/2011/02/2011-02-14-18-43-26-179x300.png" alt="" width="179" height="300" /></a></p>
<p>實際上用起來沒有 Flash 的靈敏，不過已經算很方便了！</p>
<p>當裁切完成後，製作成 Slideshow 時，效果又如何呢？<br />
（某弦案子的製成品，會如下圖所示……）<br />
<a href="http://blog.frost.tw/wp-content/uploads/2011/02/2011-02-14-18-46-26.png" rel="lightbox[1107]" title="幻燈片 - 展示"><img class="alignnone size-medium wp-image-1109" title="幻燈片 - 展示" src="http://blog.frost.tw/wp-content/uploads/2011/02/2011-02-14-18-46-26-300x173.png" alt="" width="300" height="173" /></a></p>
<p>抓取的區域會被切下（圖片解析度不夠大時，會被拉大，裁切時請注意喔！）</p>
<p>那麼，分別來解釋這個「三部曲」吧！<br />
（大部分原始碼都來自 Custom Header 的原始碼、弦也Slideshow的原始碼）</p>
<p><strong>第一步，上傳。</strong><br />
（簡單建立一個上傳的From即可）</p>
<pre class="brush:html">&lt;h3&gt;新增幻燈片&lt;/h3&gt;
 &lt;form enctype="multipart/form-data" id="upload-form" method="post" action="&lt;?php echo esc_attr( add_query_arg( 'step', 2 ) ) ?&gt;"&gt;
 &lt;label for="upload"&gt;&lt;?php _e( 'Choose an image from your computer:' ); ?&gt;&lt;/label&gt;&lt;br /&gt;
 &lt;input type="file" id="upload" name="import" /&gt;&lt;br /&gt;
 &lt;label for="title"&gt;標題&lt;/label&gt;
 &lt;input type="text" name="title" /&gt;&lt;br /&gt;
 &lt;label for="link"&gt;連結&lt;/label&gt;
 &lt;input type="text" name="link" /&gt;&lt;br /&gt;
 &lt;label for="des"&gt;說明&lt;/label&gt;
 &lt;textarea name="des" cols="20" rows="5"&gt;&lt;?php echo $slides['des']; ?&gt;&lt;/textarea&gt;&lt;br /&gt;
 &lt;?php wp_nonce_field( 'moho-slide', '_wpnonce-moho-slide' ) ?&gt;
 &lt;input type="submit" value="&lt;?php esc_attr_e( 'Upload' ); ?&gt;" /&gt;
 &lt;/form&gt;</pre>
<p>esc_attr( add_query_arg( &#8216;step&#8217;, 2 ) ) 會產生一個 http://網址/wp-admin/目前頁面.php?page=插件註冊名&amp;step=2 的查詢串。<br />
要判斷目前為第幾步，使用 if(intval($_GET['step']) == 2) 這類判斷式即可。</p>
<p><strong>第二步，裁切。</strong><br />
（要先用引入相關JS/Style才能使用，弦也是寫在Themes附上的模組，所以直接在 functions.php 加入下列語法）</p>
<pre class="brush:php">wp_enqueue_style('imgareaselect');
wp_enqueue_script('imgareaselect');</pre>
<p>接收上傳檔案的地方要先做第一階段處理（儲存檔案、計算放大縮小倍率、插入到媒體庫）</p>
<pre class="brush:php">check_admin_referer('moho-slide', '_wpnonce-moho-slide');
 $overrides = array('test_form' =&gt; false);

 if(!empty($_FILES['import']['tmp_name'])){
 $file = wp_handle_upload($_FILES['import'], $overrides);

 if ( isset($file['error']) )
 wp_die( $file['error'],  __( 'Image Upload Error' ) );

 $url = $file['url'];
 $type = $file['type'];
 $file = $file['file'];
 $filename = basename($file);
 }

 if(isset($_POST['ss_id']) &amp;&amp; isset($_POST['attachment_id'])){
 if(!empty($_POST['title']) &amp;&amp; !empty($_POST['des'])){
 $slides[$_POST['ss_id']]['title'] = htmlspecialchars($_POST['title']);
 $slides[$_POST['ss_id']]['link'] = htmlspecialchars($_POST['link']);
 $slides[$_POST['ss_id']]['des'] = htmlspecialchars($_POST['des']);
 update_option('slideshow', $slides);
 if(empty($_FILES['import']['tmp_name'])){
 call_step_1($slides);
 return;
 }
 }
 }else{
 if(!empty($_POST['title']) &amp;&amp; !empty($_POST['des']) &amp;&amp; !empty($_FILES['import']['tmp_name'])){
 $slide = array(
 'title' =&gt; htmlspecialchars($_POST['title']),
 'link' =&gt; htmlspecialchars($_POST['link']),
 'des' =&gt; htmlspecialchars($_POST['des']),
 'attachment_id' =&gt; $id,
 'imgurl' =&gt; $url
 );
 array_push($slides, $slide);
 update_option('slideshow', $slides);
 $_POST['ss_id'] = count($slides)-1;
 }else{
 call_step_1($slides);
 return;
 }

 }

 $object = array(
 'post_title' =&gt; $filename,
 'post_content' =&gt; $url,
 'post_mime_type' =&gt; $type,
 'guid' =&gt; $url);

 //Save Data
 $id = wp_insert_attachment($object, $file);

 list($width, $height, $type, $attr) = getimagesize( $file );

 if ( $width == 600 &amp;&amp; $height == 300 ) {
 // Add the meta-data
 wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );

 set_theme_mod('header_image', esc_url($url));
 do_action('wp_create_file_in_uploads', $file, $id); // For replication
 return $this-&gt;finished();
 } elseif ( $width &gt; 600 ) {
 $oitar = $width / 600;
 $image = wp_crop_image($file, 0, 0, $width, $height, 600, $height / $oitar, false, str_replace(basename($file), 'midsize-'.basename($file), $file));
 if ( is_wp_error( $image ) )
 wp_die( __( 'Image could not be processed.  Please go back and try again.' ), __( 'Image Processing Error' ) );

 $image = apply_filters('wp_create_file_in_uploads', $image, $id); // For replication

 $url = str_replace(basename($url), basename($image), $url);
 $width = $width / $oitar;
 $height = $height / $oitar;
 } else {
 $oitar = 1;
 }</pre>
<p>完成後產生一個只有 Submit 的表單，其餘都是隱藏值（把切割資訊傳給 WordPress 處理）<br />
（而還需要 jQuery 幫忙處理表單值和啟動裁切功能）</p>
<pre class="brush:html">&lt;form method="post" action="&lt;?php echo esc_attr(add_query_arg('step', 3)); ?&gt;"&gt;
 &lt;p&gt;&lt;?php _e('Choose the part of the image you want to use as your header.'); ?&gt;&lt;/p&gt;
 &lt;p&gt;&lt;strong&gt;&lt;?php _e( 'You need Javascript to choose a part of the image.'); ?&gt;&lt;/strong&gt;&lt;/p&gt;

 &lt;div id="crop_image" style="position: relative"&gt;
 &lt;img src="&lt;?php echo esc_url( $url ); ?&gt;" id="upload" width="&lt;?php echo $width; ?&gt;" height="&lt;?php echo $height; ?&gt;" /&gt;
 &lt;/div&gt;

 &lt;p&gt;
 &lt;input type="hidden" name="x1" id="x1" value="0"/&gt;
 &lt;input type="hidden" name="y1" id="y1" value="0"/&gt;
 &lt;input type="hidden" name="width" id="width" value="&lt;?php echo esc_attr( $width ); ?&gt;"/&gt;
 &lt;input type="hidden" name="height" id="height" value="&lt;?php echo esc_attr( $height ); ?&gt;"/&gt;
 &lt;input type="hidden" name="attachment_id" id="attachment_id" value="&lt;?php echo esc_attr( $id ); ?&gt;" /&gt;
 &lt;input type="hidden" name="oitar" id="oitar" value="&lt;?php echo esc_attr( $oitar ); ?&gt;" /&gt;
 &lt;input type="hidden" name="ss_id" id="ss_id" value="&lt;?php echo $_POST['ss_id']; ?&gt;" /&gt;
 &lt;?php wp_nonce_field( 'moho-slide-crop' ) ?&gt;
 &lt;input type="submit" value="&lt;?php esc_attr_e( 'Crop and Publish' ); ?&gt;" /&gt;
 &lt;/p&gt;
 &lt;/form&gt;
 &lt;script type="text/javascript"&gt;
 /* &lt;![CDATA[ */
 function onEndCrop( coords ) {
 jQuery( '#x1' ).val(coords.x);
 jQuery( '#y1' ).val(coords.y);
 jQuery( '#width' ).val(coords.w);
 jQuery( '#height' ).val(coords.h);
 }

 jQuery(document).ready(function() {
 var xinit = &lt;?php echo 600; ?&gt;;
 var yinit = &lt;?php echo 300; ?&gt;;
 var ratio = xinit / yinit;
 var ximg = jQuery('img#upload').width();
 var yimg = jQuery('img#upload').height();

 if ( yimg &lt; yinit || ximg &lt; xinit ) {
 if ( ximg / yimg &gt; ratio ) {
 yinit = yimg;
 xinit = yinit * ratio;
 } else {
 xinit = ximg;
 yinit = xinit / ratio;
 }
 }

 jQuery('img#upload').imgAreaSelect({
 handles: true,
 keys: true,
 aspectRatio: xinit + ':' + yinit,
 show: true,
 x1: 0,
 y1: 0,
 x2: xinit,
 y2: yinit,
 maxHeight: &lt;?php echo 600; ?&gt;,
 maxWidth: &lt;?php echo 300; ?&gt;,
 onInit: function () {
 jQuery('#width').val(xinit);
 jQuery('#height').val(yinit);
 },
 onSelectChange: function(img, c) {
 jQuery('#x1').val(c.x1);
 jQuery('#y1').val(c.y1);
 jQuery('#width').val(c.width);
 jQuery('#height').val(c.height);
 }
 });
 });
 /* ]]&gt; */
 &lt;/script&gt;</pre>
<p>完成後，就讓他送出吧！</p>
<p><strong>第三步，儲存。</strong><br />
這部份就是單純的 PHP 呼叫，去更改摟！<br />
（依照應用面去儲存，弦也用在Slideshow所以是存到我儲存Slideshow資訊的變數內）</p>
<pre class="brush:php">$slides = get_option('slideshow');
 $slides = empty($slides) ? array() : $slides;

 if(intval($_GET['step']) != 2){
 if(intval($_GET['step']) == 3)
 {
 check_admin_referer('moho-slide-crop');
 if ( $_POST['oitar'] &gt; 1 ) {
 $_POST['x1'] = $_POST['x1'] * $_POST['oitar'];
 $_POST['y1'] = $_POST['y1'] * $_POST['oitar'];
 $_POST['width'] = $_POST['width'] * $_POST['oitar'];
 $_POST['height'] = $_POST['height'] * $_POST['oitar'];
 }

 $original = get_attached_file( $_POST['attachment_id'] );

 $cropped = wp_crop_image($_POST['attachment_id'], $_POST['x1'], $_POST['y1'], $_POST['width'], $_POST['height'], 600, 300);
 if ( is_wp_error( $cropped ) )
 wp_die( __( 'Image could not be processed.  Please go back and try again.' ), __( 'Image Processing Error' ) );

 $cropped = apply_filters('wp_create_file_in_uploads', $cropped, $_POST['attachment_id']); // For replication

 $parent = get_post($_POST['attachment_id']);
 $parent_url = $parent-&gt;guid;
 $url = str_replace(basename($parent_url), basename($cropped), $parent_url);

 // Construct the object array
 $object = array(
 'ID' =&gt; $_POST['attachment_id'],
 'post_title' =&gt; basename($cropped),
 'post_content' =&gt; $url,
 'post_mime_type' =&gt; 'image/jpeg',
 'guid' =&gt; $url
 );

 // Update the attachment
 wp_insert_attachment($object, $cropped);
 wp_update_attachment_metadata( $_POST['attachment_id'], wp_generate_attachment_metadata( $_POST['attachment_id'], $cropped ) );

 if(isset($_POST['ss_id'])){
 $slide = &amp;$slides[$_POST['ss_id']];
 $slide['imgurl'] = $url;
 }else{
 $slide = array_pop($slides);
 $slide['imgurl'] = $url;
 array_push($slides, $slide);
 }
 update_option('slideshow', $slides);

 // cleanup
 $medium = str_replace(basename($original), 'midsize-'.basename($original), $original);
 @unlink( apply_filters( 'wp_delete_file', $medium ) );
 @unlink( apply_filters( 'wp_delete_file', $original ) );
 }
 call_step_1($slides);</pre>
<p><strong>補充說明：</strong><br />
在 WordPress 的 Custom Header 功能中，其設計為「頁面物件」<br />
整個產生都是由物件輔助，主要理由是因為 Step 3 結束後返回呼叫 Step 1 來避免多餘的換頁。</p>
<p>註：call_step_1() 是弦也產生預設頁面（第一步）的函式，這樣才會減少一次換頁。<!-- PHP 5.x --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.frost.tw/code/poston-2011-02-14/postid-1107/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>寒假結束前夕的趕工</title>
		<link>http://blog.frost.tw/web-project/poston-2011-02-08/postid-1080</link>
		<comments>http://blog.frost.tw/web-project/poston-2011-02-08/postid-1080#comments</comments>
		<pubDate>Tue, 08 Feb 2011 11:17:09 +0000</pubDate>
		<dc:creator>蒼時弦や</dc:creator>
				<category><![CDATA[網站專案]]></category>
		<category><![CDATA[專案]]></category>
		<category><![CDATA[生活]]></category>
		<category><![CDATA[程式]]></category>
		<category><![CDATA[設計]]></category>
		<category><![CDATA[雜記]]></category>

		<guid isPermaLink="false">http://blog.frost.tw/?p=1080</guid>
		<description><![CDATA[寒假時間不多了！ 不知道我是否能夠如期完成網站呢～ 就目前情況來看，我可以先把程式放一邊。 先來準備做版面設計了（趴 今天的特色圖片就是正在製作的版面。 不過，老爸也沒告訴我這 Project 的站名呢～ 我就暫時以我自己判定的「資訊」來命名吧！ 也許有人會問為什麼是「入口頁」 我也不知道，不過老爸他們的想法認為這個東西有他的吸引力。 嘛，反正我不管這的。 今晚看完漫畫、動畫後，還有不少時間。 希望可以切版完成。 明天把會員系統完成後，再來把主體（頁面產生）的功能做出來。 接著是連結組的設定。 之後我想應該就沒什麼了吧（大概 看起來不多東西，後續還得再處理 Multi-Site 的部份呢（滾動 都處理好之後，我想就能上場了！ 不過 Control Panel 的設計還是得要再加強。 （如果以我測試的版本，應該很多潛在用戶無法適應吧……） 呼，希望我如期完成！ （不過Codeigniter內建的jQuery功能是不是有點少阿？）]]></description>
			<content:encoded><![CDATA[<p>寒假時間不多了！<br />
不知道我是否能夠如期完成網站呢～</p>
<p>就目前情況來看，我可以先把程式放一邊。<br />
先來準備做版面設計了（趴<br />
<span id="more-1080"></span><br />
今天的特色圖片就是正在製作的版面。<br />
不過，老爸也沒告訴我這 Project 的站名呢～</p>
<p>我就暫時以我自己判定的「資訊」來命名吧！<br />
也許有人會問為什麼是「入口頁」<br />
我也不知道，不過老爸他們的想法認為這個東西有他的吸引力。<br />
嘛，反正我不管這的。</p>
<p>今晚看完漫畫、動畫後，還有不少時間。<br />
希望可以切版完成。</p>
<p>明天把會員系統完成後，再來把主體（頁面產生）的功能做出來。<br />
接著是連結組的設定。</p>
<p>之後我想應該就沒什麼了吧（大概</p>
<p>看起來不多東西，後續還得再處理 Multi-Site 的部份呢（滾動<br />
都處理好之後，我想就能上場了！</p>
<p>不過 Control Panel 的設計還是得要再加強。<br />
（如果以我測試的版本，應該很多潛在用戶無法適應吧……）</p>
<p>呼，希望我如期完成！<br />
（不過Codeigniter內建的jQuery功能是不是有點少阿？）<!-- PHP 5.x --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.frost.tw/web-project/poston-2011-02-08/postid-1080/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[筆記] PHP 的單例設計模式</title>
		<link>http://blog.frost.tw/code/poston-2011-01-21/postid-959</link>
		<comments>http://blog.frost.tw/code/poston-2011-01-21/postid-959#comments</comments>
		<pubDate>Fri, 21 Jan 2011 13:30:56 +0000</pubDate>
		<dc:creator>蒼時弦や</dc:creator>
				<category><![CDATA[程式語言]]></category>
		<category><![CDATA[Codeigniter]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[學習]]></category>
		<category><![CDATA[生活]]></category>
		<category><![CDATA[程式]]></category>
		<category><![CDATA[筆記]]></category>

		<guid isPermaLink="false">http://blog.frost.tw/?p=959</guid>
		<description><![CDATA[前天在討論版上問了個問題，雖然得到了解答。 自己測試也得到了一個滿意的結果，不過我還是不解「不會重複消耗記憶體嗎？」的這個疑惑。 從我使用 Codeigniter 這個 Framework 一段時間後，我開始有了這個疑問。 而在得到新名詞「單例模式」時，我才頓悟。 （得到這名詞的方式有點小白，人家大大有點不耐煩了……不過我是真的第一次知道……） 弦也認為繁體中文章，阿育大大在色胚子部落格上的翻譯最為清楚好懂。 單例設計模式的用途 假使弦也沒有不幸的理解錯誤，那麼大概就是「避免重複產生實例」 依照弦也所蒐集到的資料，也就是如「資料庫物件」在每次使用時都會使用 new 產生一次，但非常消耗資源。 那麼最好的方法就是「限制產生」而且確保「只產生一次」來避免這個問題。 （弦也一直不解的其實就是Framework使用這麼多物件，記憶體是否會多次消耗。以此看來，這種方式就是對其做了處理。） 如何實做單例模式 就網路上的範例來看，大致至上都是如下的作法。 &#60;?php /** * @package 單例設計模式 * @author 蒼時弦也 */ class Core { private static $instance; //設置為靜態成員、私有 private function __construct() //將建構式設置為私有，避免外部調用 { &#8230; <a href="http://blog.frost.tw/code/poston-2011-01-21/postid-959">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>前天在討論版上問了個問題，雖然得到了解答。<br />
自己測試也得到了一個滿意的結果，不過我還是不解「不會重複消耗記憶體嗎？」的這個疑惑。</p>
<p>從我使用 Codeigniter 這個 Framework 一段時間後，我開始有了這個疑問。<br />
而在得到新名詞「單例模式」時，我才頓悟。<br />
（得到這名詞的方式有點小白，人家大大有點不耐煩了……不過我是真的第一次知道……）<br />
<span id="more-959"></span><br />
弦也認為繁體中文章，<a href="http://blog.colorbase.tw/about" target="_blank">阿育</a>大大在<a href="http://blog.colorbase.tw/programming/625" target="_blank">色胚子</a>部落格上的翻譯最為清楚好懂。</p>
<p><strong>單例設計模式的用途</strong></p>
<p>假使弦也沒有不幸的理解錯誤，那麼大概就是「避免重複產生實例」<br />
依照弦也所蒐集到的資料，也就是如「資料庫物件」在每次使用時都會使用 new 產生一次，但非常消耗資源。<br />
那麼最好的方法就是「限制產生」而且確保「只產生一次」來避免這個問題。<br />
（弦也一直不解的其實就是Framework使用這麼多物件，記憶體是否會多次消耗。以此看來，這種方式就是對其做了處理。）</p>
<p><strong>如何實做單例模式</strong></p>
<p>就網路上的範例來看，大致至上都是如下的作法。</p>
<pre class="brush: php">&lt;?php
/**
 * @package 單例設計模式
 * @author 蒼時弦也
 */

class Core
{

  private static $instance; //設置為靜態成員、私有 

  private function __construct() //將建構式設置為私有，避免外部調用
  {
    //建構這個物件 Ex. 建立資料庫連接
  }

  public static function getInstance() //取得實例，物件會在這邊被建立
  {
    if(!self::$instance) //檢查時例是否存在（檢查方法蠻多種的，也有用 != NULL 檢查）
    {
      self::$instance = new Core(); //不存在時產生實例
    }
    return self::$instance; //傳回實例
  }

  //其他的處理在這
}

?&gt;
</pre>
<p>重點依照弦也理解，有下面幾項。</p>
<ul>
<li>建構子私有（避免外部調用，所以不會發生被產生第二次的情況）</li>
<li>有getInstance()之類的靜態方法（永遠用這個方法取得實例，因此實例被產生時永遠不會被產生第二次）</li>
<li>將 new Core() 改為 Core::getInstance() 調用（畢竟建構子私有無法再用 new 產生）</li>
</ul>
<p><strong>實做實驗</strong></p>
<p>弦也在學程式上真的就是「不打不相識」<br />
所以直接用 memory_get_usage() 這個函式來取得記憶體用量。<br />
並且比較兩個方法的記憶體消耗。</p>
<p>結果如下：</p>
<blockquote><p>Start Memory<br />
Memory used: 208</p>
<p>I&#8217;m traditional method!<br />
Memory used: 552</p>
<p>I&#8217;m traditional method!<br />
Memory used: 748</p>
<p>I&#8217;m traditional method!<br />
Memory used: 812</p>
<p>Free Memory<br />
Memory used: 812</p>
<p>Single Instance Method Start!</p>
<p>I&#8217;m single instance method!<br />
Memory used: 1128</p>
<p>Memory used: 1128</p>
<p>Memory used: 1128</p></blockquote>
<p>空行可不是失敗，而是弦也把輸出放在建構子裡面。</p>
<p>原始碼：</p>
<pre class="brush: php">&lt;?php
/**
 * @package 實例測試
 * @author 蒼時弦也
 */

class Traditional
{
 function __construct()
 {
 echo "I'm traditional method!";
 }

}

class SingleInstance
{
 private static $instance;

 private function __construct()
 {
 echo "I'm single instance method!";
 }

 public static function getInstance()
 {
 if(!self::$instance)
 {
 self::$instance = new SingleInstance();
 }
 return self::$instance;
 }

}

$start_used = memory_get_usage();

//Step 0 # Statr
echo 'Start Memory';
echo '&lt;br /&gt;Memory used: '.(memory_get_usage() - $start_used).'&lt;br /&gt;&lt;br /&gt;';
//Step 1 # Traditional Run 1
$obj = new Traditional();
echo '&lt;br /&gt;Memory used: '.(memory_get_usage() - $start_used).'&lt;br /&gt;&lt;br /&gt;';
//Step 2 # Traditional Run 2 (Replace)
$obj = new Traditional();
echo '&lt;br /&gt;Memory used: '.(memory_get_usage() - $start_used).'&lt;br /&gt;&lt;br /&gt;';
//Step 3 # Traditional Run 3 (New Varible)
$obj2 = new Traditional();
echo '&lt;br /&gt;Memory used: '.(memory_get_usage() - $start_used).'&lt;br /&gt;&lt;br /&gt;';
//Step 4 # Free Memory
echo 'Free Memory';
echo '&lt;br /&gt;Memory used: '.(memory_get_usage() - $start_used).'&lt;br /&gt;&lt;br /&gt;';

//Start Single Instance Method
echo 'Single Instance Method Start!&lt;br /&gt;&lt;br /&gt;';

//Step 5 # Single Instance Run 1
$obj = SingleInstance::getInstance();
echo '&lt;br /&gt;Memory used: '.(memory_get_usage() - $start_used).'&lt;br /&gt;&lt;br /&gt;';
//Step 6 # Single Instance Run 2 (Replace)
$obj = SingleInstance::getInstance();
echo '&lt;br /&gt;Memory used: '.(memory_get_usage() - $start_used).'&lt;br /&gt;&lt;br /&gt;';
//Step 7 # Single Instance Run 3 (New Varible)
$obj2 = SingleInstance::getInstance();
echo '&lt;br /&gt;Memory used: '.(memory_get_usage() - $start_used).'&lt;br /&gt;&lt;br /&gt;';

?&gt;</pre>
<p>從原始碼可以看到，每次運行都輸出一次記憶體使用。<br />
直到開始使用單例模式後，記憶體就維持不變。</p>
<p>這在減少記憶體使用上，可以說一個大改進吧！<br />
（多虧了這個機會，弦也可是學到了很棒的知識呢！）</p>
<p>註：其實今天原本想偷懶不寫網誌的……<!-- PHP 5.x --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.frost.tw/code/poston-2011-01-21/postid-959/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>所謂的學習悲劇大概就是如此……</title>
		<link>http://blog.frost.tw/life/poston-2011-01-20/postid-955</link>
		<comments>http://blog.frost.tw/life/poston-2011-01-20/postid-955#comments</comments>
		<pubDate>Thu, 20 Jan 2011 11:13:59 +0000</pubDate>
		<dc:creator>蒼時弦や</dc:creator>
				<category><![CDATA[生活雜記]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[學習]]></category>
		<category><![CDATA[想法]]></category>
		<category><![CDATA[校園]]></category>
		<category><![CDATA[生活]]></category>
		<category><![CDATA[程式]]></category>
		<category><![CDATA[經驗]]></category>
		<category><![CDATA[雜記]]></category>

		<guid isPermaLink="false">http://blog.frost.tw/?p=955</guid>
		<description><![CDATA[其實在學習東西的問題上，我應該是探討很多次了！ 不過，每次碰到類似的情況，難免就是想抱願一番。 說實在的。 「現在太多人『動口不動手』即使動手也『不動腦』」 整個悲劇，一個很嚴重的學習悲劇！ 雖然我是不知道為什麼會讓大家發展成這樣。 也許是Yahoo的糟糕知識+或者是網友的力量造成的。 不過，在一項領域內作為專精者和不專精者的區分就很輕鬆了！ 有人幾個月就通，有人跟便秘一樣一直想不出來。 差異也不過就是那個動作、那個決心而已吧！ 再加上，孔子也說「思而不學則怠，學而不思則罔。」 此時，我真的對於那種「學而不思的人感到憂心。」 思而不學，我想大概說夢話很久了…… 而也因為沒在實做，所以久了也看不到他們有啥進展。 （不過好處是可以把他放一邊，等他說完他的理想後打發掉……） 不過，學而不思就麻煩了！ 稍微好些的人，就會去學習。 對，和之前討論不學習的人比起來，他們好多了！ 但是，他們很多其實都會，但是就是「迷惘」 說起來，這也是正常情況。 不過，到底為什麼會產生「悲劇」呢？ 我猜，大概就是「不知變通」 簡單來說，他們學到新東西後，就會覺得「不要亂動」 我覺得，台灣的教育制度讓大家得了兩種病。 「前面只有一條路的有勇無謀。」 「把頭伸出去就會受傷的縮頭烏龜。」 其實路很多，需要靠自己去開拓。 但是很多人都選擇升學，無盡升學。 其實很多成功者他們並沒有完全的把重心放在課業上。 不過，大家常會聽到「把書讀好就會成功。」 那是多麼虛偽的言語阿！ 「把書讀好會成功的，只有喜歡讀書的人。」 「不喜歡讀書的人不一定會失敗，但他得先找到自己的路。」 為什麼到了高三，還有一堆人不知道該讀什麼？ 「機會是給準備好的人！」 因為他們可能不喜歡讀書，又被迫讀書。 說實在的，要我讀書我也覺得很煩。 但是讀起「資訊、設計」這類書籍，我又是恨不得多看些。 「喜歡，還有不喜歡的差異。」 就好像你逼一隻雞飛起來，不是醫生的料就做不成優秀的醫生。 &#8230; <a href="http://blog.frost.tw/life/poston-2011-01-20/postid-955">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>其實在學習東西的問題上，我應該是探討很多次了！<br />
不過，每次碰到類似的情況，難免就是想抱願一番。</p>
<p>說實在的。<br />
「現在太多人『動口不動手』即使動手也『不動腦』」<br />
整個悲劇，一個很嚴重的學習悲劇！<br />
<span id="more-955"></span><br />
雖然我是不知道為什麼會讓大家發展成這樣。<br />
也許是Yahoo的糟糕知識+或者是網友的力量造成的。</p>
<p>不過，在一項領域內作為專精者和不專精者的區分就很輕鬆了！<br />
有人幾個月就通，有人跟便秘一樣一直想不出來。<br />
差異也不過就是那個動作、那個決心而已吧！</p>
<p>再加上，孔子也說「思而不學則怠，學而不思則罔。」<br />
此時，我真的對於那種「學而不思的人感到憂心。」<br />
思而不學，我想大概說夢話很久了……</p>
<p>而也因為沒在實做，所以久了也看不到他們有啥進展。<br />
（不過好處是可以把他放一邊，等他說完他的理想後打發掉……）</p>
<p>不過，學而不思就麻煩了！<br />
稍微好些的人，就會去學習。<br />
對，和之前討論不學習的人比起來，他們好多了！</p>
<p>但是，他們很多其實都會，但是就是「迷惘」<br />
說起來，這也是正常情況。<br />
不過，到底為什麼會產生「悲劇」呢？</p>
<p>我猜，大概就是「不知變通」<br />
簡單來說，他們學到新東西後，就會覺得「不要亂動」<br />
我覺得，台灣的教育制度讓大家得了兩種病。<br />
「前面只有一條路的有勇無謀。」<br />
「把頭伸出去就會受傷的縮頭烏龜。」</p>
<p>其實路很多，需要靠自己去開拓。<br />
但是很多人都選擇升學，無盡升學。<br />
其實很多成功者他們並沒有完全的把重心放在課業上。<br />
不過，大家常會聽到「把書讀好就會成功。」</p>
<p>那是多麼虛偽的言語阿！<br />
「把書讀好會成功的，只有喜歡讀書的人。」<br />
「不喜歡讀書的人不一定會失敗，但他得先找到自己的路。」</p>
<p>為什麼到了高三，還有一堆人不知道該讀什麼？<br />
「機會是給準備好的人！」</p>
<p>因為他們可能不喜歡讀書，又被迫讀書。<br />
說實在的，要我讀書我也覺得很煩。<br />
但是讀起「資訊、設計」這類書籍，我又是恨不得多看些。<br />
「喜歡，還有不喜歡的差異。」</p>
<p>就好像你逼一隻雞飛起來，不是醫生的料就做不成優秀的醫生。<br />
所以我覺得那鯉魚想躍龍門，真的很悲哀……</p>
<p>台灣有俗諺「行行出狀元。」<br />
真的，每種職業都會有其優秀者存在。<br />
但是這些似乎只試用以前那種「打拼」的時代。<br />
在這個「現代」人們都盲目的從學流。</p>
<p>最後，也不過就是渾渾噩噩的度日而已吧！</p>
<p>一大堆工程師改行什麼的，大家也不是沒聽過。<br />
「為什麼改行？」<br />
「因為，工程師是被逼去當的！」</p>
<p>在這個論點上，我就覺得美國人做的不錯。<br />
今天看新聞，一個八歲小孩因為喜歡 RAP 而努力。<br />
在網路上也算是蠻紅的，面對批評的態度也是很正面、正確。</p>
<p>但是，如果一個台灣的八歲小還很喜歡 RAP 而且天賦普普時。<br />
台灣的父母會怎麼做？<br />
「抓來罵一頓，叫他好好讀書！」<br />
假使這孩子在網路上面對了批評呢？<br />
「很快就覺得失落，抑或是反擊回去吧！」<br />
為什麼會覺得失落？<br />
因為在他努力的過程中，太多家人都這樣壓抑他了！<br />
（連網友都不支持他，那個動力很快就被壓下去了！）<br />
為什麼會反擊？<br />
台灣的媒體、連續劇，不就撥這些嗎？<br />
沒網路的有電視，沒電視的有網路。</p>
<p>如果父母沒有細心教導，這孩子能正向回應批評嗎？<br />
台灣大部分父母都是認為：「孩子書讀好，以後就會好！」</p>
<p>我覺得，這是對自己孩子的一種不信任。<br />
也許是對自己基因自卑的表現（我是這樣推測）</p>
<p>我的家庭情況也有點特殊，再加上我成長的方式也異常。<br />
即使如此，讓我老爸完全相信我的能力。<br />
也是花上個五六年。</p>
<p>這也很可能和中國的民族性，保守有關係吧！<br />
（即使是我也難逃保守思想的一劫……）</p>
<p>我們的學習資訊「封閉」在一個層面上。<br />
「讀好書，就能過好日子。」</p>
<p>我認為，這是該改觀的時候了！</p>
<p>我們應該試著去尋找自己的道路。<br />
「思考。」<br />
（某人硬拉回主題，雖然找自己的道路確實要思考……）</p>
<p>又一種說法，喜歡一個東西是什麼感覺？<br />
「沉溺於其中，盡情的『鑽研』」<br />
所以才會有「廢寢忘食」這句成語阿！</p>
<p>學習雖不能閉門造車，但也是需要鑽研的，對吧？<br />
網路供應新資訊，而自身的思考就是成長的關鍵。</p>
<p>說了一堆廢話，還未提到寫這篇文章的原因。<br />
昨晚，一位新網友進入我的MSN列表。<br />
是因為他有 PHP 問題，所以才找我的。</p>
<p>我幫他檢查了一下之後，發現問題真的挺多的！<br />
但，最主要的問題並非他會不會。<br />
而是他的思考，太少。<br />
程式這種東西在學習過程上需要思考更多（除了學習外，還要習慣。）</p>
<p>他遇到錯誤，就只是不斷地查資料、發問。<br />
的確，這是個很棒的、很優秀的方法。</p>
<p>但，他忘記思考為什麼會有問題。<br />
「學思並重。」<br />
他做到學，但學不夠。<br />
但，他思考不夠多。</p>
<p>在我 Google 資料時，我通常會著重幾個點。<br />
新東西，這是一開始學的。<br />
問題，這是我學會後碰上的問題。<br />
原來的東西，如果問題不解，可能我對新東析還是不熟。</p>
<p>就如同昨天測試 PHP Function 遞值的問題一般。<br />
我學了 call_user_func_array 這個函式的運用。<br />
我做了思考，但是運用上無解。<br />
於是我回去找尋我學習時的盲點。<br />
發現，我的遞值是缺了步驟。</p>
<p>於是，問題解決了！</p>
<p>對我來說，學習悲劇，就是「即使學了，也不能去好好思考。」</p>
<p>也許是這樣我才討厭回答別人問題吧！<br />
「因為太多太多的人，得到答案後，沒有繼續思考。」<br />
這也是我認為「經驗」很重要的原因。</p>
<p>最近我幫老師寫程式，老師一直說我除錯的速度很快。<br />
實際上不是，那是一種習慣。<br />
「因為每次都錯，所以就會習慣的檢查。」<br />
「因為錯誤很明顯是他，所以會特別去關注！」</p>
<p>在學科上的學習也是一樣。<br />
「老是出錯的問題，不去關注，那麼永遠都會錯。」<br />
「問題的點在哪，就要特別的去探討。」<br />
我想，這是我即使不怎麼在課業上用心，也不至於被當的原因吧！</p>
<p>學習的方法。<br />
「還有很多人，沒有仔細去思考自己的方法。」<br />
「思考，真的很重要。畢竟，學習大家常常做。」</p>
<p>（嚴重偏題，無視！）<!-- PHP 5.x --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.frost.tw/life/poston-2011-01-20/postid-955/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

