tag:blogger.com,1999:blog-17489134761405204622024-03-12T17:14:56.633-07:00青蛙跳跳青蛙工程師http://www.blogger.com/profile/00671399137498989772noreply@blogger.comBlogger59125tag:blogger.com,1999:blog-1748913476140520462.post-9243175554147659582021-12-06T21:59:00.005-08:002021-12-07T00:33:16.654-08:00在Windows將CRT憑證轉換為PFX格式<p>要在Windows上將CRT格式的憑證轉成PFX格式,可以先將CRT檔案安裝到個人憑證,然後把匯入的憑證再匯出為PFX格式就可以了。</p><h1 style="text-align: left;">安裝CRT憑證</h1><h2 style="text-align: left;">CRT檔案上按下滑鼠右鍵再點選【安裝憑證】</h2><p> </p><div style="text-align: center;"><a href="https://1.bp.blogspot.com/-79qQs36WHO4/Ya7weunobgI/AAAAAAAADqc/RuEDW1U_CZgw1rcXoJAmeZ3iW41g8xZlgCNcBGAsYHQ/s383/install_crt.png"><img border="0" data-original-height="119" data-original-width="383" src="https://1.bp.blogspot.com/-79qQs36WHO4/Ya7weunobgI/AAAAAAAADqc/RuEDW1U_CZgw1rcXoJAmeZ3iW41g8xZlgCNcBGAsYHQ/s16000/install_crt.png" /></a></div><p></p><h2 style="text-align: left;">選【目前使用者】再按【下一步】</h2><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-b2YnKi1unSA/Ya7wd85pcLI/AAAAAAAADqs/0pp4Z6ev-EAdG0pn_wY-uzTIo29CLDSVwCPcBGAYYCw/s614/import_crt_1.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="578" data-original-width="614" src="https://1.bp.blogspot.com/-b2YnKi1unSA/Ya7wd85pcLI/AAAAAAAADqs/0pp4Z6ev-EAdG0pn_wY-uzTIo29CLDSVwCPcBGAYYCw/s16000/import_crt_1.png" /></a></div><br /><p></p><h2 style="text-align: left;"> 選擇【憑證存放區】為【個人】再按【下一步】</h2><p><a href="https://1.bp.blogspot.com/-hOO3gE1d924/Ya7weDlUzsI/AAAAAAAADqU/8w7YKWKHPPkNyOYwoPhc2zcYIxh1ffXGACNcBGAsYHQ/s614/import_crt_2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="578" data-original-width="614" src="https://1.bp.blogspot.com/-hOO3gE1d924/Ya7weDlUzsI/AAAAAAAADqU/8w7YKWKHPPkNyOYwoPhc2zcYIxh1ffXGACNcBGAsYHQ/s16000/import_crt_2.png" /></a> <br /></p><h2 style="text-align: left;">最後按下【完成】完成憑證安裝 </h2><p></p><p></p><p></p><p><a href="https://1.bp.blogspot.com/-gImgLnZJZrI/Ya7weGz_t1I/AAAAAAAADqY/bZp_LPzTXOgsIarZlCZC7doK7nEC7WEhwCNcBGAsYHQ/s614/import_crt_3.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="578" data-original-width="614" src="https://1.bp.blogspot.com/-gImgLnZJZrI/Ya7weGz_t1I/AAAAAAAADqY/bZp_LPzTXOgsIarZlCZC7doK7nEC7WEhwCNcBGAsYHQ/s16000/import_crt_3.png" /> </a></p><h1 style="text-align: left;">匯出PFX</h1><h2 style="text-align: left;">打開【管理使用者憑證】後,選擇個人憑證,在剛安裝的憑證上按下滑鼠右鍵,再選【所有工作】、【匯出】 </h2><p><a href="https://1.bp.blogspot.com/-snHN-0EL2Ss/Ya7wcT7HsUI/AAAAAAAADp8/WgCd1OXbotwH9hyghocXzZg9bZalMYWnACNcBGAsYHQ/s614/export_pfx_1.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="578" data-original-width="614" src="https://1.bp.blogspot.com/-snHN-0EL2Ss/Ya7wcT7HsUI/AAAAAAAADp8/WgCd1OXbotwH9hyghocXzZg9bZalMYWnACNcBGAsYHQ/s16000/export_pfx_1.png" /></a> <br /></p><h2 style="text-align: left;"> 歡迎使用憑證匯出精靈的畫面按下【下一步】</h2><p> <a href="https://1.bp.blogspot.com/-7p0-ZHiMKPI/Ya7wcRXi4nI/AAAAAAAADp4/z37dj9y6ljcly9GMSP7Hbr9-CcAEwPFIgCNcBGAsYHQ/s614/export_pfx_2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="578" data-original-width="614" src="https://1.bp.blogspot.com/-7p0-ZHiMKPI/Ya7wcRXi4nI/AAAAAAAADp4/z37dj9y6ljcly9GMSP7Hbr9-CcAEwPFIgCNcBGAsYHQ/s16000/export_pfx_2.png" /></a></p><h2 style="text-align: left;"> 選擇【是,匯出私密金鑰】後按【下一步】</h2><p><a href="https://1.bp.blogspot.com/-Hopp63G_UzQ/Ya7wcUFLOWI/AAAAAAAADqg/AkRD7TCJcr8lNEVKd68COkBDeZvmsNAQQCPcBGAYYCw/s614/export_pfx_3.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="578" data-original-width="614" src="https://1.bp.blogspot.com/-Hopp63G_UzQ/Ya7wcUFLOWI/AAAAAAAADqg/AkRD7TCJcr8lNEVKd68COkBDeZvmsNAQQCPcBGAYYCw/s16000/export_pfx_3.png" /></a> <br /></p><h2 style="text-align: left;">勾選【如果可能的話,包含憑證路徑中的所有憑證】及【啟用憑證隱私權】後按【下一步】</h2><p><a href="https://1.bp.blogspot.com/-Mp2jRT7NZwo/Ya7wdXoml1I/AAAAAAAADqE/RzvBJwdFepAEUM3yJZopYk14KxTuNJ7yACNcBGAsYHQ/s614/export_pfx_4.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="578" data-original-width="614" src="https://1.bp.blogspot.com/-Mp2jRT7NZwo/Ya7wdXoml1I/AAAAAAAADqE/RzvBJwdFepAEUM3yJZopYk14KxTuNJ7yACNcBGAsYHQ/s16000/export_pfx_4.png" /></a> <br /></p><p></p><p></p><p></p><h2 style="text-align: left;">輸入匯出憑證用的密碼並確認密碼後按【下一步】<br /></h2><p><a href="https://1.bp.blogspot.com/-Qmjy70Qt2pU/Ya7wdVq98kI/AAAAAAAADqI/kUtcNkYSZK0n0xGbLGQmh52xegIdLbR1QCNcBGAsYHQ/s614/export_pfx_5.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="578" data-original-width="614" src="https://1.bp.blogspot.com/-Qmjy70Qt2pU/Ya7wdVq98kI/AAAAAAAADqI/kUtcNkYSZK0n0xGbLGQmh52xegIdLbR1QCNcBGAsYHQ/s16000/export_pfx_5.png" /></a></p><h2 style="text-align: left;">輸入或瀏覽最後匯出的檔案路徑後按下【下一步】完成匯出</h2><p><a href="https://1.bp.blogspot.com/-FDnf_Gr-f5Y/Ya7wdrVF4yI/AAAAAAAADqM/wZmJAh4ciDk4SSV1pOW15WMxG9MOGYQbQCNcBGAsYHQ/s614/export_pfx_6.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="578" data-original-width="614" src="https://1.bp.blogspot.com/-FDnf_Gr-f5Y/Ya7wdrVF4yI/AAAAAAAADqM/wZmJAh4ciDk4SSV1pOW15WMxG9MOGYQbQCNcBGAsYHQ/s16000/export_pfx_6.png" /></a></p><p><br /></p><p></p><p></p><p></p><p></p><p><br /><br /><br /><br /></p><br /><br />青蛙工程師http://www.blogger.com/profile/00671399137498989772noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-86507531860295657352018-12-24T19:59:00.000-08:002018-12-24T19:59:12.979-08:00在Windows 10用Paint3D(小畫家3D)做浮水印在Windows 10不用另裝軟體就可以做簡單的浮水印。拿跟Windows 10一起安裝的Paint3D(小畫家3D)就足夠了。
<br />
大致上分兩個步驟:
<br />
<ol class="org-ol">
<li>製作要當作浮水印的圖,如文字或商標等,背景要做成透明的。
</li>
<li>把浮水印的圖放到圖片上,調整成半透明。
</li>
</ol>
接下來我們一步一步來
<br />
<ol class="org-ol">
<li>在開始選單點開「小畫家3D」。
</li>
<li>點選「新增」,我們先來做一張簡單的浮水印圖片。
<br /><a href="https://4.bp.blogspot.com/-ZJu6OMPtqgY/XCGoqCBf3bI/AAAAAAAADBU/WV-JR1i66osP18ejmNUlStXPnCRVEuUTgCLcBGAs/s1600/watermark-1.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1001" data-original-width="1282" height="310" src="https://4.bp.blogspot.com/-ZJu6OMPtqgY/XCGoqCBf3bI/AAAAAAAADBU/WV-JR1i66osP18ejmNUlStXPnCRVEuUTgCLcBGAs/s400/watermark-1.png" width="400" /></a></li>
<li>要先確定浮水印圖片的背景要是透明,按下上方的「畫布」按鈕。把右邊的「透明畫布」選項改成開啟。<br /><a href="https://4.bp.blogspot.com/-DMv16Ou0MOc/XCGosEfKtsI/AAAAAAAADBY/77Bu_bQZMB8WcwVFNRofrP-O4CqdwO-CwCLcBGAs/s1600/watermark-2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1001" data-original-width="1282" height="311" src="https://4.bp.blogspot.com/-DMv16Ou0MOc/XCGosEfKtsI/AAAAAAAADBY/77Bu_bQZMB8WcwVFNRofrP-O4CqdwO-CwCLcBGAs/s400/watermark-2.png" width="400" /></a> <img alt="watermark-2.PNG" src="./watermark-2.PNG" />
</li>
<li>開始畫你理想中的浮水印。我這邊自己選了「2D 圖形」下的圓形畫了一個實心圓,再加入「文字」LOL。在小畫家3D中,上方功能按鈕被選擇後,所有相關功能設定都在視窗的右側。
</li>
<li>把浮水印圖檔存起來,選左上角的「功能表」然後選「儲存」,輸入浮水印的檔案名稱。
</li>
<li>現在把希望套上浮水印的圖片打開,選左上角的「功能表」然後選「開啟」下的「瀏覽檔案」,選擇要打開的圖片檔案。我挑了一張我家樓下貓的照片,因為我一直想把它蓋上浮水印占為己有。
<img alt="menu.PNG" src="./menu.PNG" /><br /><a href="https://2.bp.blogspot.com/-6yi6_PNP-2Q/XCGpz4hWLgI/AAAAAAAADB8/mw3p9yazQ4ooXazw28gSP_h7R5WvKLBfgCLcBGAs/s1600/menu.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1001" data-original-width="1282" height="311" src="https://2.bp.blogspot.com/-6yi6_PNP-2Q/XCGpz4hWLgI/AAAAAAAADB8/mw3p9yazQ4ooXazw28gSP_h7R5WvKLBfgCLcBGAs/s400/menu.png" width="400" /></a><br />
</li>
<li>接下來終於要把浮水印放上來了,點選上方的「圖戳」按鈕,然後點右側檔案夾圖片的「自訂圖戳」頁籤。
<img alt="sticker.PNG" src="./sticker.PNG" /><br /><a href="https://4.bp.blogspot.com/-vJt7IlZmgEk/XCGoxmM8MvI/AAAAAAAADBk/opJy3W0jxIgb-OzgwODvY729wbKDnW5vACLcBGAs/s1600/sticker.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1001" data-original-width="1282" height="311" src="https://4.bp.blogspot.com/-vJt7IlZmgEk/XCGoxmM8MvI/AAAAAAAADBk/opJy3W0jxIgb-OzgwODvY729wbKDnW5vACLcBGAs/s400/sticker.png" width="400" /></a><br />
</li>
<li>選「新增圖戳」,然後在對話框中選剛剛做好的浮水印圖片。
</li>
<li>現在可以看到浮水印蓋在圖片上了,也可以自由移動它的位置。不過在確定它的位置前,我們先把他調成半透明。在右邊有「圖戳不透明度」滑桿,將他越往左移就越透明。
<img alt="watermark-3.PNG" src="./watermark-3.PNG" /><br /><a href="https://3.bp.blogspot.com/-Gx1913IvjCs/XCGouFXmQMI/AAAAAAAADBc/JMRKA4vUucg_Y3H64jIxGPumV8rj1xEEgCLcBGAs/s1600/watermark-3.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1001" data-original-width="1282" height="311" src="https://3.bp.blogspot.com/-Gx1913IvjCs/XCGouFXmQMI/AAAAAAAADBc/JMRKA4vUucg_Y3H64jIxGPumV8rj1xEEgCLcBGAs/s400/watermark-3.png" width="400" /></a><br />
</li>
<li>確定好浮水印透明度跟位置後,按下浮水印右邊的勾勾符號就完成了。
<img alt="watermark-4.PNG" src="./watermark-4.PNG" /><br /><a href="https://2.bp.blogspot.com/-J9V1tQkVVbY/XCGowjgtTaI/AAAAAAAADBg/pBT-V8eNKSMCeJMyahNSG8g0dy2aJ8uWwCLcBGAs/s1600/watermark-4.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1001" data-original-width="1282" height="311" src="https://2.bp.blogspot.com/-J9V1tQkVVbY/XCGowjgtTaI/AAAAAAAADBg/pBT-V8eNKSMCeJMyahNSG8g0dy2aJ8uWwCLcBGAs/s400/watermark-4.png" width="400" /></a><br />
</li>
</ol>
青蛙工程師http://www.blogger.com/profile/00671399137498989772noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-67344691381998956942018-12-23T06:59:00.000-08:002018-12-23T07:02:50.109-08:00Windows Form 無法存取已處置的物件?<a href="http://www.frogjumpjump.com/2018/12/windows-form-cannot-access-disposed.html" target="_blank">Go to English Verison</a><br />
<br />
這到底發生了什麼事情?
<br />
<blockquote>
System.ObjectDisposedException: 無法存取已處置的物件
</blockquote>
很正常的,微軟的中文版錯誤訊息不只難懂還可能讓人搞錯方向。他對應的英文訊息是:
<br />
<blockquote>
Cannot access a disposed object.
</blockquote>
這邊說的「已處置」就是"disposed",某個物件被處置掉了所以不能夠再被使用。
<br />
會看到這個錯誤訊息八成是因為你要<a href="https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.form.show?view=netframework-4.7">Show()</a>一個已經被使用者關閉的Windows Form。使用者很有可能直接點了視窗右上角的關閉按鈕,造成<a href="https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.form.close?view=netframework-4.7">Close()</a>被呼叫,接著<a href="https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.form.dispose?view=netframework-4.7">Dispose()</a>就會被執行。最後這個被「處置」的Form就不能夠被用了,因為處置掉了嘛。
<br />
解決這問題不難,再new一個Form就好了,如果不確定要不要再建置一個新的Form,可以拿 <a href="https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.isdisposed?view=netframework-4.7#System_Windows_Forms_Control_IsDisposed">IsDisposed</a> 判斷。
<br />
<div class="org-src-container">
<pre class="src src-csharp">if (form1?.IsDisposed == true)
{
form1 = new Form1();
}
</pre>
</div>
如果你真的不想讓Form關閉然後被處置掉,另一個作法是把Form藏起來。你可以在Closing事件阻止Form的關閉然後隱藏。
<br />
<div class="org-src-container">
<pre class="src src-csharp">private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true; // 取消關閉作業
Hide(); // 隱藏視窗
}
</pre>
</div>
青蛙工程師http://www.blogger.com/profile/00671399137498989772noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-27458744087932551752018-12-22T03:08:00.000-08:002018-12-23T07:03:30.896-08:00Windows Form Cannot Access a Disposed Object?<a href="http://www.frogjumpjump.com/2018/12/windows-form.html" target="_blank">閱讀中文版</a><br />
<br />
What does this mean?
<br />
<blockquote>
System.ObjectDisposedException: Cannot access a disposed object. Object name: 'Form1'.
</blockquote>
You are getting this exception probably because you want to <a href="https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.form.show?view=netframework-4.7" target="_blank">Show()</a> a windows form that was closed by user. The user likely closed the form by clicking the close button on the title bar. <a href="https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.form.close?view=netframework-4.7" target="_blank"> Close()</a> is called when the form is closing and <a href="https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.form.dispose?view=netframework-4.7" target="_blank">Dispose()</a> is subsquently called. Now you have a disposed form that really not useful any more.
<br />
The fix is quite simple, just new the Form again. If you are not sure if the form has to be created again, check for <a href="https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.isdisposed?view=netframework-4.7#System_Windows_Forms_Control_IsDisposed" target="_blank">IsDisposed</a>.
<br />
<div class="org-src-container">
<pre class="src src-csharp">if (form1?.IsDisposed == true)
{
form1 = new Form1();
}
</pre>
</div>
If you really want to hide the form instead of closing it and hence disposed, This is what you can do on the <a href="https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.form.closing?view=netframework-4.7" target="_blank">Closing event</a> of the form.
<br />
<div class="org-src-container">
<pre class="src src-csharp">private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true; // Cancel the closing sequence
Hide(); // Hide the form
}
</pre>
</div>
青蛙工程師http://www.blogger.com/profile/00671399137498989772noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-28649910460336763482018-07-15T01:35:00.003-07:002018-07-15T01:35:26.168-07:00Scikit Learn Fetching MNIST original TimeoutLearning some Machine Learning using Scikit Learn. It was not a good start, keep getting timeout when fetching the MNIST original dataset. The code was like this<br />
<br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">from</span> <span style="color: #0e84b5; font-weight: bold;">sklearn.datasets</span> <span style="color: #008800; font-weight: bold;">import</span> fetch_mldata
mnist <span style="color: #333333;">=</span> fetch_mldata(<span style="background-color: #fff0f0;">'MNIST original'</span>)
</pre>
</div>
<br />
Turns out Scikit Learn would fetch the dataset from mldata.org. I don't know if I was just unlucky or it is generally unstable. Ended up download the data from somewhere else first, then move the mnist-original.mat to<br />
<br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">~/scikit_learn_data/mldata/mnist-original.mat
</pre>
</div>
<br />
For windows user, the ~ is your home directory. That's where Scikit Learn store the downloaded dataset which works as a cache too. Now it works.<br />
<br />
The dataset was downloaded from.<br />
<br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="background-color: #ffaaaa; color: red;">https://github.com/amplab/datascience-sp14/raw/master/lab7/mldata/mnist-original.mat</span>
</pre>
</div>
青蛙工程師http://www.blogger.com/profile/00671399137498989772noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-24554473137823422872017-04-03T06:47:00.003-07:002017-04-03T06:47:59.157-07:00C槽塞爆了怎麼辦?!如果D槽還有空間就把那些照片、音樂、影片、文件移到D槽吧.如果D槽已經滿了或根本沒有D槽,那只好清一下不要的檔案(大概要用掉一整天的時間)或去買個外接硬碟(花錢解決-而且不貴)。<br /><br />不過慢著!不要笨笨的在D槽開一個目錄然後把資料通通塞過去。在Windows 10你的大部分檔案都是放在C槽的「使用者」(Users)目錄下,如果把資料通通移到D槽下次打開「相片」、「我的文件」目錄就什麼都沒了,這怎麼行!(是行啦,不過這樣就寫不下去了)<br /><br />只要跟Windows 10說聲從此以後我漂亮的自拍跟其他沒那麼漂亮的檔案通通都進到D槽,這樣之後依然可以打開「相片」、「我的文件」看到所有的檔案,而且這些檔案都存在D槽了。C槽終於可以空出來囉!接下來就可以繼續拼命灌程式跟拼命放自己的美圖(至少一陣子啦,直到硬碟爆掉為止)。<br /><br />只要三個步驟:<br />
<ol>
<li>開啟設定</li>
<li>選「儲存空間」</li>
<li>改儲存位置</li>
</ol>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-8N6-SExamXk/WOJRzdt6C9I/AAAAAAAACHE/nIMUZPK9YL8LwyXpcD4QxJs9lcWoz2lZQCLcB/s1600/storage.png" imageanchor="1"><img border="0" height="260" src="https://1.bp.blogspot.com/-8N6-SExamXk/WOJRzdt6C9I/AAAAAAAACHE/nIMUZPK9YL8LwyXpcD4QxJs9lcWoz2lZQCLcB/s400/storage.png" width="400" /></a></div>
<br />青蛙工程師http://www.blogger.com/profile/00671399137498989772noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-20779770050839480512015-12-27T07:31:00.001-08:002015-12-27T07:31:16.333-08:00The Flask Mega-Tutorial, Part II 導讀<style type="text/css">
td.linenos { background-color: #f0f0f0; padding-right: 10px; }
span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
pre { line-height: 125%; }
body .hll { background-color: #ffffcc }
body { background: #f8f8f8; }
body .c { color: #408080; font-style: italic } /* Comment */
body .err { border: 1px solid #FF0000 } /* Error */
body .k { color: #008000; font-weight: bold } /* Keyword */
body .o { color: #666666 } /* Operator */
body .cm { color: #408080; font-style: italic } /* Comment.Multiline */
body .cp { color: #BC7A00 } /* Comment.Preproc */
body .c1 { color: #408080; font-style: italic } /* Comment.Single */
body .cs { color: #408080; font-style: italic } /* Comment.Special */
body .gd { color: #A00000 } /* Generic.Deleted */
body .ge { font-style: italic } /* Generic.Emph */
body .gr { color: #FF0000 } /* Generic.Error */
body .gh { color: #000080; font-weight: bold } /* Generic.Heading */
body .gi { color: #00A000 } /* Generic.Inserted */
body .go { color: #888888 } /* Generic.Output */
body .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
body .gs { font-weight: bold } /* Generic.Strong */
body .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
body .gt { color: #0044DD } /* Generic.Traceback */
body .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
body .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
body .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
body .kp { color: #008000 } /* Keyword.Pseudo */
body .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
body .kt { color: #B00040 } /* Keyword.Type */
body .m { color: #666666 } /* Literal.Number */
body .s { color: #BA2121 } /* Literal.String */
body .na { color: #7D9029 } /* Name.Attribute */
body .nb { color: #008000 } /* Name.Builtin */
body .nc { color: #0000FF; font-weight: bold } /* Name.Class */
body .no { color: #880000 } /* Name.Constant */
body .nd { color: #AA22FF } /* Name.Decorator */
body .ni { color: #999999; font-weight: bold } /* Name.Entity */
body .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
body .nf { color: #0000FF } /* Name.Function */
body .nl { color: #A0A000 } /* Name.Label */
body .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
body .nt { color: #008000; font-weight: bold } /* Name.Tag */
body .nv { color: #19177C } /* Name.Variable */
body .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
body .w { color: #bbbbbb } /* Text.Whitespace */
body .mb { color: #666666 } /* Literal.Number.Bin */
body .mf { color: #666666 } /* Literal.Number.Float */
body .mh { color: #666666 } /* Literal.Number.Hex */
body .mi { color: #666666 } /* Literal.Number.Integer */
body .mo { color: #666666 } /* Literal.Number.Oct */
body .sb { color: #BA2121 } /* Literal.String.Backtick */
body .sc { color: #BA2121 } /* Literal.String.Char */
body .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
body .s2 { color: #BA2121 } /* Literal.String.Double */
body .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
body .sh { color: #BA2121 } /* Literal.String.Heredoc */
body .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
body .sx { color: #008000 } /* Literal.String.Other */
body .sr { color: #BB6688 } /* Literal.String.Regex */
body .s1 { color: #BA2121 } /* Literal.String.Single */
body .ss { color: #19177C } /* Literal.String.Symbol */
body .bp { color: #008000 } /* Name.Builtin.Pseudo */
body .vc { color: #19177C } /* Name.Variable.Class */
body .vg { color: #19177C } /* Name.Variable.Global */
body .vi { color: #19177C } /* Name.Variable.Instance */
body .il { color: #666666 } /* Literal.Number.Integer.Long */
</style>
之前為了讓台灣的朋友能夠較快上手,寫了 <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world">The Flask Mega-Tutorial, Part I</a> 的<a href="http://www.frogjumpjump.com/2015/10/the-flask-mega-tutorial-part-i-windows.html">解說加上 Windows 環境設定</a>。似乎對一些人還蠻有用,所以這裡繼續寫了 <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-ii-templates">Part II</a> 。這並不是要直接翻譯 <a href="http://blog.miguelgrinberg.com/index">Miguel Grinberg</a> 寫的 The Flask Mega-Tutorial ,主要是為了導讀。請務必閱讀原文。好啦,你們只想看中文,不過真的,<a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-ii-templates">讀讀看!</a>他寫的簡單易懂。<br />
我們來看看 <a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-ii-templates">The Flask Mega-Tutoral Part II: Templates</a> 說了什麼。Template 是套版的意思,那套版是什麼呢?我們慢慢看下去。<br />
這個教學系列最後會完成一個微博網站。作者命名他為 microblog ,也就是微博的意思。<br />
開始之前請確定已經有 Part I 練習的完成品。執行 flask/Scripts/python run.py 後,可以從瀏覽器打開 http://localhost:500 看到到 Hello, World! 的字樣。<br />
<br />
<h2>
要解決的問題 </h2>
我們讓這小程式熱鬧、好看一點。所以畫面上加的大標題,然後跟使用者打個招呼。但是目前為止還沒有登入的機制,所以使用者就先直接寫死 Minguel (原文作者的名),當然因為只是臨時寫死的東西,所以這使用者要叫什麼都可以。因為要加大標題就要動到畫面的排版,所以只是回傳沒有格式的文字不夠用了,我們把 app/views.py 內容改成 HTML 。<br />
<table class="highlighttable"><tbody>
<tr><td class="linenos"><div class="linenodiv">
<pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16</pre>
</div>
</td><td class="code"><div class="highlight">
<pre><span class="kn">from</span> <span class="nn">app</span> <span class="kn">import</span> <span class="n">app</span>
<span class="nd">@app.route</span><span class="p">(</span><span class="s">'/'</span><span class="p">)</span>
<span class="nd">@app.route</span><span class="p">(</span><span class="s">'/index'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">index</span><span class="p">():</span>
<span class="n">user</span> <span class="o">=</span> <span class="p">{</span> <span class="s">'nickname'</span><span class="p">:</span> <span class="s">'Miguel'</span> <span class="p">}</span> <span class="c"># fake user</span>
<span class="k">return</span> <span class="s">'''</span>
<span class="s"><html></span>
<span class="s"> <head></span>
<span class="s"> <title>Home Page</title></span>
<span class="s"> </head></span>
<span class="s"> <body></span>
<span class="s"> <h1>Hello, '''</span> <span class="o">+</span> <span class="n">user</span><span class="p">[</span><span class="s">'nickname'</span><span class="p">]</span> <span class="o">+</span> <span class="s">'''</h1></span>
<span class="s"> </body></span>
<span class="s"></html></span>
<span class="s">'''</span>
</pre>
</div>
</td></tr>
</tbody></table>
程式改好後,可以再跑一次 run.py ,瀏覽器中應該要可以看到大大的 Hello, Miguel ,頁籤的標題也顯示了 Home Page 。<br />
程式中的 user 變數是以大括號建立的 dictionary 物件,因為沒有登入的機制,給的資料只是隨便的假資料,也就是所謂的假物件( mock object )。回傳內容用了三個單引號包著可以直接寫出多行的內容建立含有換行資訊的字串。<br />
如果你還沒發現的話,直接把網頁內容寫到程式中回傳是個很糟的做法。<br />
當畫面開始豐富一點時,程式很快的會變得非常複雜。如果每個畫面的程式都是各自回傳寫好的網頁內容,想要修改整個網站排版時就得一個一個程式修改。這種做法在網站越來越大時完全會行不通。<br />
<br />
<h2>
用套版來處理</h2>
如果我們把程式的處理邏輯跟網頁呈現方式分開來的話,就會乾淨很多。你還可以去找個網頁設計師幫你寫超棒的網頁畫面,你來負責寫背後的 Python 程式就好。 (依照過往的經驗,網頁設計師寫出來的網頁畫面最好還是重做,不過目前為止應該可以感受到把邏輯跟畫面分開的好處吧!)套版就是可以把這邏輯跟畫面分開的工具。<br />
那就來寫第一個套版吧,寫在 app/templates/index.html :<br />
<table class="highlighttable"><tbody>
<tr><td class="linenos"><div class="linenodiv">
<pre>1
2
3
4
5
6
7
8</pre>
</div>
</td><td class="code"><div class="highlight">
<pre><span class="nt"><html></span>
<span class="nt"><head></span>
<span class="nt"><title></span>{{ title }} - microblog<span class="nt"></title></span>
<span class="nt"></head></span>
<span class="nt"><body></span>
<span class="nt"><h1></span>Hello, {{ user.nickname }}!<span class="nt"></h1></span>
<span class="nt"></body></span>
<span class="nt"></html></span>
</pre>
</div>
</td></tr>
</tbody></table>
這看起來會很像一般的 HTML 網頁,不過有幾個地方用 {{ ... }} 加了保留區給動態的內容用。<br />
接下來看如何在 app/views.py 中用這個套版,記得要在第一行加 from flask import render_template :<br />
<table class="highlighttable"><tbody>
<tr><td class="linenos"><div class="linenodiv">
<pre>1
2
3
4
5
6
7
8</pre>
</div>
</td><td class="code"><div class="highlight">
<pre><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">render_template</span>
<span class="kn">from</span> <span class="nn">app</span> <span class="kn">import</span> <span class="n">app</span>
<span class="nd">@app.route</span><span class="p">(</span><span class="s">'/'</span><span class="p">)</span>
<span class="nd">@app.route</span><span class="p">(</span><span class="s">'/index'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">index</span><span class="p">():</span>
<span class="n">user</span> <span class="o">=</span> <span class="p">{</span> <span class="s">'nickname'</span><span class="p">:</span> <span class="s">'Miguel'</span> <span class="p">}</span> <span class="c"># fake user</span>
<span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">'index.html'</span><span class="p">,</span> <span class="n">title</span><span class="o">=</span><span class="s">'Home'</span><span class="p">,</span> <span class="n">user</span><span class="o">=</span><span class="n">user</span><span class="p">)</span>
</pre>
</div>
</td></tr>
</tbody></table>
再執行一次程式,可以在瀏覽器看到跟改成套版之前一樣的畫面,用瀏覽器檢視原始碼功能看看是不是跟我們的套版一樣。<br />
render_template 可以把指定的套版檔案套入傳入的參數。背後使用 Jinja2 套版引擎。 Jinja2 以同名參數的內容將套版中的 {{ ... }} 取代。<br />
<br />
<h2>
套版中的控制語句</h2>
Jinja2 也可以把控制語句用在套版中的 {% ... %} 區塊,我們把 if 加到套版中看看, app/templates/index.html<br />
<table class="highlighttable"><tbody>
<tr><td class="linenos"><div class="linenodiv">
<pre> 1
2
3
4
5
6
7
8
9
10
11
12</pre>
</div>
</td><td class="code"><div class="highlight">
<pre><span class="nt"><html></span>
<span class="nt"><head></span>
{% if title %}
<span class="nt"><title></span>{{ title }} - microblog<span class="nt"></title></span>
{% else %}
<span class="nt"><title></span>Welcome to microblog<span class="nt"></title></span>
{% endif %}
<span class="nt"></head></span>
<span class="nt"><body></span>
<span class="nt"><h1></span>Hello, {{ user.nickname }}!<span class="nt"></h1></span>
<span class="nt"></body></span>
<span class="nt"></html></span>
</pre>
</div>
</td></tr>
</tbody></table>
這個套版現在變的聰明一點了,他可以在沒有提供標題時自己寫出一個預設的標題Welcome to microblog。可以在 render_template 中不傳入 title 參數看看會有什麼樣的結果。<br />
<br />
<h2>
套版中的迴圈</h2>
登入的會員很有可能想看他在追蹤的人的貼文。我們來看看怎麼做。<br />
我們還沒有登入的機制,方便起見,我們先在 views.py 做些假會員資料。<br />
<table class="highlighttable"><tbody>
<tr><td class="linenos"><div class="linenodiv">
<pre> 1
2
3
4
5
6
7
8
9
10
11
12
13</pre>
</div>
</td><td class="code"><div class="highlight">
<pre><span class="k">def</span> <span class="nf">index</span><span class="p">():</span>
<span class="n">user</span> <span class="o">=</span> <span class="p">{</span> <span class="s">'nickname'</span><span class="p">:</span> <span class="s">'Miguel'</span> <span class="p">}</span> <span class="c"># fake user</span>
<span class="n">posts</span> <span class="o">=</span> <span class="p">[</span> <span class="c"># 假的貼文陣列</span>
<span class="p">{</span>
<span class="s">'author'</span><span class="p">:</span> <span class="p">{</span><span class="s">'nickname'</span><span class="p">:</span> <span class="s">'John'</span><span class="p">},</span>
<span class="s">'body'</span><span class="p">:</span> <span class="s">'Beautiful day in Portland!'</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="s">'author'</span><span class="p">:</span> <span class="p">{</span><span class="s">'nickname'</span><span class="p">:</span> <span class="s">'Susan'</span><span class="p">},</span>
<span class="s">'body'</span><span class="p">:</span> <span class="s">'The Avengers movie was so cool!'</span>
<span class="p">}</span>
<span class="p">]</span>
<span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">'index.html'</span><span class="p">,</span> <span class="n">title</span><span class="o">=</span><span class="s">'Home'</span><span class="p">,</span> <span class="n">user</span><span class="o">=</span><span class="n">user</span><span class="p">,</span> <span class="n">posts</span><span class="o">=</span><span class="n">posts</span><span class="p">)</span>
</pre>
</div>
</td></tr>
</tbody></table>
我們用一個 list 來存放所有的貼文。每個貼文中含 author 跟 body 欄位(如果英文真的那麼差的話,那兩欄分別代表作者跟貼文內容,nickname 是作者的暱稱)。之後用真的資料庫來存放這些貼文時我們會持續用相同的欄位名稱。這樣就不用回頭改套版中的欄位名稱了。<br />
一個 list 中可以放不定數量的貼文,套版要忠實的把每一筆輸出在結果畫面中。如果要限制顯示的貼文數量,那應該要讓 views.py 中的程式決定 list 中要有幾筆貼文。決定顯示幾筆不是套版的工作。<br />
我們在 app/templates/index.html 加一個 for 迴圈輸出貼文:<br />
<table class="highlighttable"><tbody>
<tr><td class="linenos"><div class="linenodiv">
<pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15</pre>
</div>
</td><td class="code"><div class="highlight">
<pre><span class="nt"><html></span>
<span class="nt"><head></span>
{% if title %}
<span class="nt"><title></span>{{ title }} - microblog<span class="nt"></title></span>
{% else %}
<span class="nt"><title></span>Welcome to microblog<span class="nt"></title></span>
{% endif %}
<span class="nt"></head></span>
<span class="nt"><body></span>
<span class="nt"><h1></span>Hello, {{ user.nickname }}!<span class="nt"></h1></span>
{% for post in posts %}
<span class="nt"><div><p></span>{{ post.author.nickname }} says: <span class="nt"><b></span>{{ post.body }}<span class="nt"></b></p></div></span>
{% endfor %}
<span class="nt"></body></span>
<span class="nt"></html></span>
</pre>
</div>
</td></tr>
</tbody></table>
這樣就可以了,再到瀏覽器看看新的畫面。<br />
<br />
<h2>
套版繼承</h2>
接下來最後的討論項目。<br />
這個 microblog 網站的網頁的最上方要有一塊導覽列。裡面會包含編輯個人資訊、登入、登出等連結。我們可以直接把導覽列寫到 index.html 中,不過網站越大時網頁也跟著變多,如果每次要改導覽頁時都要從 index.html 複製過去會很麻煩。萬一複製後又要改導覽列,那就得花很多時間改了。<br />
還有 Jinja2 的套版繼承功能,他可以讓我們把所有套版相同的部分都拉出來放到一個共用的套版中,然後再讓所有的套版繼承這個共用的套版。<br />
我們就來新增這個共用的套版,放在 app/templates/base.html ,把導覽列跟一些之前寫好的套版內容寫在裡面:<br />
<table class="highlighttable"><tbody>
<tr><td class="linenos"><div class="linenodiv">
<pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14</pre>
</div>
</td><td class="code"><div class="highlight">
<pre><span class="nt"><html></span>
<span class="nt"><head></span>
{% if title %}
<span class="nt"><title></span>{{ title }} - microblog<span class="nt"></title></span>
{% else %}
<span class="nt"><title></span>Welcome to microblog<span class="nt"></title></span>
{% endif %}
<span class="nt"></head></span>
<span class="nt"><body></span>
<span class="nt"><div></span>Microblog: <span class="nt"><a</span> <span class="na">href=</span><span class="s">"/index"</span><span class="nt">></span>Home<span class="nt"></a></div></span>
<span class="nt"><hr></span>
{% block content %}{% endblock %}
<span class="nt"></body></span>
<span class="nt"></html></span>
</pre>
</div>
</td></tr>
</tbody></table>
這個套版裡用到的 block 控制語句被指定了一個名稱,讓繼承他的套版插入專屬的內容。接下來我們把 index.html 改成繼承 base.html 。<br />
<table class="highlighttable"><tbody>
<tr><td class="linenos"><div class="linenodiv">
<pre>1
2
3
4
5
6
7</pre>
</div>
</td><td class="code"><div class="highlight">
<pre>{% extends "base.html" %}
{% block content %}
<span class="nt"><h1></span>Hi, {{ user.nickname }}!<span class="nt"></h1></span>
{% for post in posts %}
<span class="nt"><div><p></span>{{ post.author.nickname }} says: <span class="nt"><b></span>{{ post.body }}<span class="nt"></b></p></div></span>
{% endfor %}
{% endblock %}
</pre>
</div>
</td></tr>
</tbody></table>
因為 base.html 已經定義了整體畫面架構,我們可以只留內容的部分。 extends 告訴 Jinja2 他繼承了 base.html ,產生 index.html 得畫面時要先引入 base.html 。因為兩個套版都有叫做 content 的 block ,所以 Jinja2 知道要把同名的內容塞到共用套版的哪個位置。之後新寫的套版都會先繼承 base.html。<br />
套版就講到這了,不要忘了<a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-ii-templates">看原文</a>喔。青蛙工程師http://www.blogger.com/profile/00671399137498989772noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-21515405237684642592015-10-10T02:14:00.000-07:002015-10-11T02:07:48.979-07:00The Flask Mega-Tutorial, Part I Windows 環境設定這邊整理了<a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world" target="_blank"> The Flask Mega-Tutorial, Part I: Hello World!</a> 在 Windows 上執行的指令。這整理的用意是原文中會各別提到在 Linux 跟 OS X 中的指令,對於不熟那些系統的人來說讀起來會有點困擾。<br />
<br />
這篇並非對原文的直接翻譯,想要練習的人請務必閱讀原文。<br />
<br />
在開始之前,請先<a href="https://www.python.org/downloads/" target="_blank">安裝 Python</a> ,這篇是專門為 Python 版本 3.4 以上說明。如果 3.4 以下的版本請另外安裝 pip 跟 virtualenv (就是請自己想辦法的意思)。<br />
<br />
安裝 Python 時請記得將 Python 安裝的位置加到環境變數的路徑中,如安裝 3.5 時,要記得把 Add Python 3.5 to PATH 勾起來。<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-ijI-BslTd-A/VhnsOZV4OLI/AAAAAAAAB_w/nRn2gSfFu4g/s1600/python35install.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://2.bp.blogspot.com/-ijI-BslTd-A/VhnsOZV4OLI/AAAAAAAAB_w/nRn2gSfFu4g/s1600/python35install.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">安裝Python時勾選Add Python to PATH</td></tr>
</tbody></table>
<br />
那就開始,打開「命令提示字元」,他在「附屬應用程式下面」。台灣微軟可以把命令提示字元改成比較有意義的名稱嗎?譬如指令行或終端機。他實在沒有在提示任何東西... 或字元。<br />
<br />
首先要先有一個程式開發專屬的目錄夾,這目錄的目的在方便跟其他平常的檔案分開來(如那些無聊的 word 檔或小孩的照片),不然沒有其他任何意義。個人習慣叫做 projects ,不過要叫什麼名字都可以。可以從檔案總管新增這個目錄,或拿以下指令新增:<br />
<blockquote class="tr_bq">
md projects
</blockquote>
不要忘記用以下指令移到你的專屬目錄下:<br />
<blockquote class="tr_bq">
cd projects</blockquote>
新增專案目錄<br />
<blockquote class="tr_bq">
md microblog</blockquote>
執行中目錄移到專案目錄下<br />
<blockquote class="tr_bq">
cd microblog </blockquote>
開始建置 Flask 環境。為什麼要建立 Flask 環境?因為建立出獨立的環境才不會影響系統中其它 Python 程式。如果還是不懂為什麼這麼做,沒關係,改天再去搞懂。真的,改天請真的去搞懂。<br />
<blockquote class="tr_bq">
python -m venv flask</blockquote>
接下來要在安裝一堆將來會用到的程式庫,現在還不懂沒關係:<br />
<blockquote class="tr_bq">
<pre>flask\Scripts\pip install flask
flask\Scripts\pip install flask-login
flask\Scripts\pip install flask-openid
flask\Scripts\pip install flask-mail
flask\Scripts\pip install flask-sqlalchemy
flask\Scripts\pip install sqlalchemy-migrate
flask\Scripts\pip install flask-whooshalchemy
flask\Scripts\pip install flask-wtf
flask\Scripts\pip install flask-babel
flask\Scripts\pip install guess_language
flask\Scripts\pip install flipflop
flask\Scripts\pip install coverage
</pre>
</blockquote>
整體架構環境快好了,再建立幾個目錄:<br />
<blockquote class="tr_bq">
md app<br />
md app\static<br />
md app\templates<br />
md tmp</blockquote>
app 目錄會放實際網站程式。<br />
<br />
YES! 可以開始寫程式了,如果現在還沒有你最愛的文字編輯器,或心中想說文字編輯器是小三的話,可以<a href="https://notepad-plus-plus.org/download/v6.8.3.html" target="_blank">安裝 notepad++</a> 來寫。注意程式中的縮排一定要用 tab ,如 views.py 中的 return "Hello, World!" 就要用 tab 縮排。<br />
<br />
在這一次的練習總共有三個程式檔。<br />
<h3>
第一個程式檔</h3>
在剛剛建立的 app 目錄下編輯一個新的檔案: __init__.py ,所以這檔案路徑會是<br />
<blockquote class="tr_bq">
app\__init__.py</blockquote>
程式內容不算空白行的話就下面這三行而以:<br />
<blockquote class="tr_bq">
from flask import Flask<br />
<br />
app = Flask(__name__)<br />
from app import views</blockquote>
在 Python 中 __init__.py 檔案,只要是同一個目錄(同package)的任一程式檔(模組)被呼叫到,就會先執行 __init__.py 中的程式,不過只會執行一次。如果同 package 中有兩個程式檔分別被呼叫到,只有第一個檔被呼叫時會執行 __init__.py 。<br />
<h3>
第二個程式檔</h3>
一樣在 app 目錄下新增檔案 views.py ,檔案路徑是<br />
<blockquote class="tr_bq">
app\views.py</blockquote>
程式內容如下,注意縮排要用 tab :<br />
<blockquote class="tr_bq">
from app import app<br />
<br />
@app.route('/')<br />
@app.route('/index')<br />
def index():<br />
return "Hello, World!"</blockquote>
<h3>
第三個程式檔</h3>
這個檔案就直接在 microblog 目錄下了,叫做 run.py<br />
<blockquote class="tr_bq">
#!flask/bin/python<br />
from app import app<br />
app.run(debug=True)</blockquote>
<h3>
完成</h3>
第一個 Flask 網站程式寫好了。恩,就這樣而已。只要在把他跑起來就好了。說到要跑... 就是 run 了。run.py 其實不算網站程式的一部分,他只是叫我們的網站程式( app )啟動。請按照以下指令執行,刻意使用 flask\Scripts 中的 python 這樣才能把程式在剛剛建立起來的獨立環境中跑。<br />
<blockquote class="tr_bq">
<pre class="prettyprint"><code><span class="pln">flask\Scripts\python run</span><span class="pun">.</span><span class="pln">py</span></code></pre>
</blockquote>
<pre class="prettyprint"><code><span class="pln">最後享受程式的成果,把你最喜歡的網路瀏覽器打開,網址輸入</span></code>:</pre>
<blockquote class="tr_bq">
<pre class="prettyprint"><code><span class="pln">http</span><span class="pun">:</span><span class="com">//localhost:5000</span></code></pre>
</blockquote>
<pre class="prettyprint"><code><span class="com">或以下網址也會有一模一樣的結果:</span></code></pre>
<blockquote class="tr_bq">
<pre class="prettyprint"><code><span class="com"><code><span class="pln">http</span><span class="pun">:</span><span class="com">//localhost:5000/index</span></code></span></code></pre>
</blockquote>
青蛙工程師http://www.blogger.com/profile/00671399137498989772noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-52887181706222589292013-08-12T10:53:00.001-07:002022-11-03T22:27:18.896-07:00超簡單Facebook資料備份Facebook 不會永遠存在,因為沒有人想跟自己爸媽當朋友。所以在他從網際網路消失前,趕快把你這幾年講了一堆不是很多人在意,跟放了一堆也不是很漂亮的照片備份到自己的電腦上。<br />
<br />
就算不認同 Facebook 會消失的人,相信還有很多備份的理由。譬如說所有朋友都不再是朋友的時候,可以看看自己以前有多少朋友。<br />
<br />
依照下面的步驟就可以超簡單備份自己甜蜜的網路記憶:<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div><p>
</p><p><b><span style="font-size: medium;">2022年更新操作畫面</span></b></p><ol style="text-align: left;"><li><b><span style="font-size: small;">點擊右上角大頭照來打開選單 ,然後選【<span style="color: red;">設定和隱私</span>】打開了下一個選單。</span></b><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjslV9EeKb2JonjqcWczQzB9QOiUol3kK2ayVWK1q7YMJPnGH7OdbFXMb5xXVg6hXl56zBF6_i7vB3nT3YHMY40DD067TIDbiTe_M12nqizUbMmmYf-4ibJ1IJjj4fEn3DTNgS9rha_Tuysbw0SicGFnFCuQXAhzMnG2vMeHWxTHUD5kv-kPVfTD7fv" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="632" data-original-width="473" height="640" src="https://blogger.googleusercontent.com/img/a/AVvXsEjslV9EeKb2JonjqcWczQzB9QOiUol3kK2ayVWK1q7YMJPnGH7OdbFXMb5xXVg6hXl56zBF6_i7vB3nT3YHMY40DD067TIDbiTe_M12nqizUbMmmYf-4ibJ1IJjj4fEn3DTNgS9rha_Tuysbw0SicGFnFCuQXAhzMnG2vMeHWxTHUD5kv-kPVfTD7fv=w480-h640" width="480" /></a> <br /><br /></li><li><b>按下【<span style="color: red;">設定</span>】打開設定畫面</b><a href="https://blogger.googleusercontent.com/img/a/AVvXsEitElyrvZfwALjpQc9gTcbjmxO6_ElfPSDopuJuJEQTHSWejry8jkgKPquuyCSV5DgHguyKsWLowt46TUgxk4jJq8EF_NLIAM3mdFZE6SROUcWay4PPSuQ10jx4lBRmrohxTxXITw_Lx6hd3mvoSa8kibo6F2JrXoZI_2599ythU4gKjbgqyVDBwQOb" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="554" data-original-width="473" height="640" src="https://blogger.googleusercontent.com/img/a/AVvXsEitElyrvZfwALjpQc9gTcbjmxO6_ElfPSDopuJuJEQTHSWejry8jkgKPquuyCSV5DgHguyKsWLowt46TUgxk4jJq8EF_NLIAM3mdFZE6SROUcWay4PPSuQ10jx4lBRmrohxTxXITw_Lx6hd3mvoSa8kibo6F2JrXoZI_2599ythU4gKjbgqyVDBwQOb=w547-h640" width="547" /><br /></a> </li><li><b>在左側的選單選【<span style="color: red;">你的 Facebook 資訊</span>】,然後選右邊的【<span style="color: red;">下載資訊</span>】打開下載畫面。</b><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiuoK1GsYh2cXoEO1c-l2D6ircqcPUXdArDNivUcakGvRIJn3h0xRj1GeXvPUbDpjK8Sf1KLZkTtkuqptq65T6sE3FFU2dYkQjx1sMJQaT2yL6A9RYX7bEleqiLmCGlxBynmeGjGD_o_5o519ma9a9-4xtX9hyAt-BH64Wmwxfazok9d_bJywyIZPLx" style="margin-left: 1em; margin-right: 1em;"><br /><img alt="" data-original-height="831" data-original-width="1041" height="510" src="https://blogger.googleusercontent.com/img/a/AVvXsEiuoK1GsYh2cXoEO1c-l2D6ircqcPUXdArDNivUcakGvRIJn3h0xRj1GeXvPUbDpjK8Sf1KLZkTtkuqptq65T6sE3FFU2dYkQjx1sMJQaT2yL6A9RYX7bEleqiLmCGlxBynmeGjGD_o_5o519ma9a9-4xtX9hyAt-BH64Wmwxfazok9d_bJywyIZPLx=w640-h510" width="640" /></a> </li><li><b>下載畫面有不少選項,不過最少要選擇【<span style="color: red;">日期範圍</span>】。</b><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgePvsQN4FuSxZlpxAB3i12ZtAL0Be4laeflqQI3G_Nux0JGgN-0KZcaNI4d2EL_0zbpoS8QflNJrdI39DYPF9ZvT4KbJgeT9K7009SwkmuITwbWVYU9ZC2HF_SQTH3BuNMhwSUF03z0V5gQrToLDyP9-o_9SejcJP7GOrG4SZAlY9A5fq_iAVkpVLn" style="margin-left: 1em; margin-right: 1em;"><br /><img alt="" data-original-height="935" data-original-width="939" height="637" src="https://blogger.googleusercontent.com/img/a/AVvXsEgePvsQN4FuSxZlpxAB3i12ZtAL0Be4laeflqQI3G_Nux0JGgN-0KZcaNI4d2EL_0zbpoS8QflNJrdI39DYPF9ZvT4KbJgeT9K7009SwkmuITwbWVYU9ZC2HF_SQTH3BuNMhwSUF03z0V5gQrToLDyP9-o_9SejcJP7GOrG4SZAlY9A5fq_iAVkpVLn=w640-h637" width="640" /></a> </li><li><b>決定好選項後到畫面最下面按下【<span style="color: red;">要求下載</span>】。</b><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi6Vwfpn9zn9HQMzUpGjA1R0X0TFwkcEk2iwhEDeZhqNPpJlbapSGHzPe3I6IPPDUV_PHyOVxZMC7BMmUznka601x5babqiyojOMHgxQbtojpsgeSWRTuQVcwvHhCSWAQe6KYHbEznPUpOiVpHm9jo05QpeDbzCC_jsw2PY2q-sEE0RRleIBF-3_kky" style="margin-left: 1em; margin-right: 1em;"><br /><img alt="" data-original-height="1030" data-original-width="939" height="640" src="https://blogger.googleusercontent.com/img/a/AVvXsEi6Vwfpn9zn9HQMzUpGjA1R0X0TFwkcEk2iwhEDeZhqNPpJlbapSGHzPe3I6IPPDUV_PHyOVxZMC7BMmUznka601x5babqiyojOMHgxQbtojpsgeSWRTuQVcwvHhCSWAQe6KYHbEznPUpOiVpHm9jo05QpeDbzCC_jsw2PY2q-sEE0RRleIBF-3_kky=w584-h640" width="584" /></a> <br /><br /></li><li><b>要求下載後要等等,如果有很豐富的貼文那可能會等蠻久的。Facebook準備好檔案後會用<span style="color: red;">Email通知</span>,主旨可能是【<span style="color: red;">你的 Facebook 資訊檔案已備妥</span>】。這實在原來下載畫面點【<span style="color: red;">可供下載的檔案</span>】就可以看到準備好的檔案下載了。</b><br /><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjQ0c7ZrI1ZjFn7bJBVWuTH6rB_of15Rlg1s36OqR_Ho32Tg-y6VpU6HuMcatbkySb3gWa0xMIIaPKSy5f73w82Gu4iz-cTUMFEruykRJnadW8wIsUkYtEXPYtspxnM0KwewK_Xhen-JvcX5BJadQq8cTy9js2kHWfoP2VacC-Uz2LY_yP4l8UELlkh" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="410" data-original-width="1153" height="228" src="https://blogger.googleusercontent.com/img/a/AVvXsEjQ0c7ZrI1ZjFn7bJBVWuTH6rB_of15Rlg1s36OqR_Ho32Tg-y6VpU6HuMcatbkySb3gWa0xMIIaPKSy5f73w82Gu4iz-cTUMFEruykRJnadW8wIsUkYtEXPYtspxnM0KwewK_Xhen-JvcX5BJadQq8cTy9js2kHWfoP2VacC-Uz2LY_yP4l8UELlkh=w640-h228" width="640" /></a></li></ol><p><br /> </p><p> </p><p> </p><p></p><p><span style="font-size: large;"><b>2013年版本</b></span><br />
</p><h4>
1. 點擊右上角<span style="color: red;"><b><span style="font-weight: normal;"><b>齒輪</b></span></b></span>圖片設定按鈕。 </h4>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-8BjMZ2u8PjU/UgkbV3NYCCI/AAAAAAAABkY/WgHG6ZTNS4c/s1600/fb1.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="169" src="http://4.bp.blogspot.com/-8BjMZ2u8PjU/UgkbV3NYCCI/AAAAAAAABkY/WgHG6ZTNS4c/s400/fb1.png" width="400" /></a></div>
<div style="text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<ol></ol>
<h4>
2. 點擊「<span style="color: red;">帳號設定</span>」。</h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/--8Hn8LtuwGg/Ugkb8WMc5gI/AAAAAAAABkg/2wnFty-HsVE/s1600/fb2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/--8Hn8LtuwGg/Ugkb8WMc5gI/AAAAAAAABkg/2wnFty-HsVE/s1600/fb2.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<h4>
3. 帳號設定畫面「語言」項目的下面有一個連結,「<span style="color: red;">下載一份</span>」你的 Facebook 資料副本。</h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-zB_HduwZBHY/UgkcOiTlCiI/AAAAAAAABko/CTsAsb2nkLs/s1600/fb3.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-zB_HduwZBHY/UgkcOiTlCiI/AAAAAAAABko/CTsAsb2nkLs/s1600/fb3.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<h4>
4. 快要開始了,按下「<span style="color: red;">開始我的存檔</span>」。</h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-rvuk_qeBWUI/UgkZ2bc-AJI/AAAAAAAABjg/XhQGKt40XXA/s1600/fb4.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-rvuk_qeBWUI/UgkZ2bc-AJI/AAAAAAAABjg/XhQGKt40XXA/s1600/fb4.png" /></a></div>
<br />
<h4>
5. 還要按一次「<span style="color: red;">開始我的存檔</span>」,因為資料太多要一些時間,先讓你知道。</h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Z6jAhzhTX5o/UgkZ2UGgaLI/AAAAAAAABjs/36mf-3jQGEM/s1600/fb5.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-Z6jAhzhTX5o/UgkZ2UGgaLI/AAAAAAAABjs/36mf-3jQGEM/s1600/fb5.png" /></a></div>
<br />
<h4>
6. 在備份了,請耐心等通知。</h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/--I3tJpwN3M0/UgkZ2jyS_OI/AAAAAAAABjo/aJutn8-5LKM/s1600/fb6.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/--I3tJpwN3M0/UgkZ2jyS_OI/AAAAAAAABjo/aJutn8-5LKM/s1600/fb6.png" /></a></div>
<br />
<br />
<h4>
7. 收信!收到了嗎?這封「<span style="color: red;">你的 Facebook 下載已準備好了</span>」。</h4>
<h4>
8. 點擊信件中<span style="color: red;">最下面的連結</span>。</h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-QIIHsQWzgxM/UgkZ3bJF0mI/AAAAAAAABj4/Q0sWBTjzStI/s1600/fb7.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-QIIHsQWzgxM/UgkZ3bJF0mI/AAAAAAAABj4/Q0sWBTjzStI/s1600/fb7.png" /></a></div>
<br />
<h4>
9. 按下「<span style="color: red;">下載存檔</span>」。</h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Wnxq-W8kguo/UgkZ3yLkyOI/AAAAAAAABkE/7Npp0FG_wyc/s1600/fb8.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-Wnxq-W8kguo/UgkZ3yLkyOI/AAAAAAAABkE/7Npp0FG_wyc/s1600/fb8.png" /></a></div>
<br />
<h4>
10.最後再輸入<span style="color: red;">密碼</span>後按送出就好了。</h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-kFztc9V_Zg8/UgkZ32LN3-I/AAAAAAAABj8/okx-g4n_moE/s1600/fb9.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-kFztc9V_Zg8/UgkZ32LN3-I/AAAAAAAABj8/okx-g4n_moE/s1600/fb9.png" /></a></div>
<h4>
下載的檔案是個壓縮檔,解開後,打開<span style="color: red;"> <b>index.html</b></span> 就可以慢慢欣賞在網路上帥氣的自己。 </h4>
青蛙工程師http://www.blogger.com/profile/00671399137498989772noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-64035048252173815512012-10-30T20:12:00.001-07:002012-10-30T20:12:10.466-07:00解決用EXCEL讀CSV資料時的中文亂碼<p>如果單單設定 utf-8,還是中文亂碼</p> <p> 就將CSV檔寫成UTF-8帶簽名(with BOM,byte-order marker)的格式,<br>也就是在寫出檔案 (BufferedWriter out ) 最開頭寫入\uFEFF字元</p> <p>第一行先加上: out.write("\uFEFF"); //解決excel中文亂碼</p> DeepBlueAmberhttp://www.blogger.com/profile/02448662575815613881noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-84001112220219157092012-07-29T07:46:00.000-07:002012-07-29T07:46:19.200-07:00關於ASP.NET MVC的TempDataMSDN上對於ASP.NET MVC中的<a href="http://msdn.microsoft.com/en-us/library/system.web.mvc.tempdatadictionary.aspx" target="_blank">TempData</a>解釋是:<br />
<blockquote class="tr_bq">
Represents a set of data that persists only from one request to the next.</blockquote>
也就是一個暫存的資料,但只維持到下一個Request進來後就會被消滅。可是怎麼會知道下一個Request會何時進來?如果沒有更多的解釋,還真的令人很納悶TempData到底有什麼目的。<br />
<br />
後來才發現他可以跟RedirectToAction配合。假設一個網站程式有兩個需要使用者填入不少資料的步驟,而且第二個步驟成功完成後才會將這些資料儲存到資料庫。這兩個步驟分為兩個Action,分別叫StepOne跟StepTwo。StepOne會Post資料到StepTwo,而StepTwo本身Post給自己後才將所有資料儲存。假設在StepTwo的Post發現了錯誤要把使用者導回StepOne更正錯誤,但希望在畫面上能保留使用者已輸入的資料。這時用RedirectToAction很有可能沒辦法把所有資料保留,<br />
<br />
因為Redirect一定會是用Get的方法,而他傳輸資料量是有限的。<br />
<br />
這就是TempData可以用到的地方,跟RedirectToAction配合。可以確定下一個Request會再回覆給瀏覽器後馬上再進來,而原本使用者輸入資料就全部保留在TempData中就可以在全部寫回到步驟1的網頁中。<br /><br />其實在Session中可以自己做出TempData的功能,但已有內建這樣的功能,的確可以少寫不少程式,而且程式也更清楚。青蛙工程師http://www.blogger.com/profile/00671399137498989772noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-28301453336645092892012-05-11T00:15:00.001-07:002012-05-11T00:15:00.626-07:00f:setpropertyactionlistener not working<p>版本:primefaces 3.0, JSF 2.0</p> <p>source code</p> <div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 600px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"> <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1"> 1:</span> <p:commandButton value=<span style="color: #006080">"明細"</span> oncomplete=<span style="color: #006080">"openJavaScript_Dialog();"</span> ></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2"> 2:</span> <f:setPropertyActionListener value=<span style="color: #006080">"#{ item.master }"</span> target=<span style="color: #006080">"#{ controller.dto}"</span> /></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3"> 3:</span> </p:commandButton></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4"> 4:</span> </pre><!--CRLF--></div></div><br /><p>錯誤原因:一直沒有辦法讀取 controller 的 setDto 方法,只會在開啟另一個xhtml,讀取到 空的 getDto,出現 null exception<br /><p>解法:在 p:commandButton 加 <a href="mailto:update=”@this">update=”@this</a>” 的屬性</p><br /><div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 600px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"><br /><div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1"> 1:</span> <p:commandButton value=<span style="color: #006080">"明細"</span> oncomplete=<span style="color: #006080">"openJavaScript_Dialog();"</span> update=<span style="color: #006080">"@this"</span> ></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2"> 2:</span> <f:setPropertyActionListener value=<span style="color: #006080">"#{ item.master }"</span> target=<span style="color: #006080">"#{ controller.dto}"</span> /></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3"> 3:</span> </p:commandButton></pre><!--CRLF--></div></div> DeepBlueAmberhttp://www.blogger.com/profile/02448662575815613881noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-6677988136975157932012-05-08T01:04:00.001-07:002012-05-08T01:04:27.693-07:00在eclipse中,出現 primefaces 的提示<p><font size="3">在 eclpise ,按工具列上的 [ Project ] –> [ Properties ] </font></p> <p><a href="http://lh5.ggpht.com/-0bf5Iq9vvM8/T6jTYng6rxI/AAAAAAAAAKw/Tv97-waE3Uk/s1600-h/p1%25255B3%25255D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="p1" border="0" alt="p1" src="http://lh6.ggpht.com/-1J7KVZcdCcE/T6jTZGnRqFI/AAAAAAAAAK4/z6EYL9ooIYI/p1_thumb%25255B1%25255D.png?imgmax=800" width="504" height="462"></a> </p> <p><font size="3">點 [ Project Facets ] –> 將 [ JavaServer Faces ] 打勾, 注意版本要選 2.0</font></p> <p><font size="3">再按屬性設定 [ Further configuration available ] </font></p> <p><a href="http://lh6.ggpht.com/-b49ssoBRYDM/T6jTasEvmSI/AAAAAAAAALA/lvb_B4joAAY/s1600-h/p2%25255B3%25255D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="p2" border="0" alt="p2" src="http://lh6.ggpht.com/-9p2qOq8KIOQ/T6jTbZY8JUI/AAAAAAAAALI/kVl4AmTYPV8/p2_thumb%25255B1%25255D.png?imgmax=800" width="504" height="435"></a> </p> <p><font size="3">邊我用的是預設的,也可以用自已定的 [ User Libary ] ,按 [ OK ],再按 [ APPLY ] </font></p> <p><a href="http://lh4.ggpht.com/-CBNebxUy9MM/T6jTcVrSyUI/AAAAAAAAALM/RX-fJ5idsCA/s1600-h/p3%25255B3%25255D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="p3" border="0" alt="p3" src="http://lh5.ggpht.com/-35596Ths4pM/T6jTdLEUzPI/AAAAAAAAALU/QS5jnYY0BcI/p3_thumb%25255B1%25255D.png?imgmax=800" width="504" height="521"></a> </p> <p><font size="3">然後,點專案 「web」的那一包,按滑鼠右鍵,點最下面的[ Properties ] </font></p> <p><a href="http://lh3.ggpht.com/-OZqXOng-IlM/T6jTd1X7xjI/AAAAAAAAALc/bBQGmh-di0c/s1600-h/p4%25255B3%25255D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="p4" border="0" alt="p4" src="http://lh4.ggpht.com/-sTwtDRcdzKI/T6jTemm10jI/AAAAAAAAALk/NYh4IiAlxK4/p4_thumb%25255B1%25255D.png?imgmax=800" width="504" height="354"></a> </p> <p><font size="3">同樣的,點 [ Project Facets ] –> 將 [ JavaServer Faces ] 打勾, 版本 2.0</font></p> <p><a href="http://lh3.ggpht.com/-ZN9acnY80wI/T6jTflbYt_I/AAAAAAAAALw/5s9Z4E0-84E/s1600-h/p5%25255B3%25255D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="p5" border="0" alt="p5" src="http://lh5.ggpht.com/-dpdD9EnauV0/T6jTgkZuo8I/AAAAAAAAAL4/T0CsZ-AuIk0/p5_thumb%25255B1%25255D.png?imgmax=800" width="504" height="275"></a> </p> <p></p> <p><font size="3">記得,要等一下,eclipse才會出現 autocomplete的提示,jsf的顯示設定,也是相同的設定方法</font></p> <p><a href="http://lh4.ggpht.com/-LA2n9Dy2zBI/T6jThbKKrbI/AAAAAAAAAL8/lk5sAKrvBFI/s1600-h/p6%25255B3%25255D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="p6" border="0" alt="p6" src="http://lh3.ggpht.com/-c_XrKstujas/T6jTiSLFvlI/AAAAAAAAAME/5iJs12sGTEk/p6_thumb%25255B1%25255D.png?imgmax=800" width="504" height="250"></a></p> DeepBlueAmberhttp://www.blogger.com/profile/02448662575815613881noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-17969339780264133082012-05-04T01:50:00.001-07:002012-05-04T01:50:46.968-07:00如何刪除 Excel 中 autoshape 的圖框<p>可能發生在copy資料,貼在excel後,會出現一堆隱形的圖框</p> <p>刪除的方法,以excel為例:( word也是類似的方法 )</p> <p>strp-1:Ctrl + G,會出現下面的功能,點「特殊」</p> <p><a href="http://lh5.ggpht.com/-M0Iqb1sv6OY/T6OYSZQY3zI/AAAAAAAAAJ8/-rgWQ3YltlQ/s1600-h/ctrl_G%25255B4%25255D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ctrl_G" border="0" alt="ctrl_G" src="http://lh3.ggpht.com/-N6j6Jqeboug/T6OYTF6PMmI/AAAAAAAAAKE/v2vdr62YNcc/ctrl_G_thumb%25255B2%25255D.png?imgmax=800" width="504" height="429"></a> </p> <p>strp-2:選「物件」</p> <p><a href="http://lh4.ggpht.com/-C1PH0_r63dc/T6OYTzQBZII/AAAAAAAAAKM/dzkQTb72TWc/s1600-h/ctrl_G2%25255B3%25255D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ctrl_G2" border="0" alt="ctrl_G2" src="http://lh6.ggpht.com/-3su1_OlqwRs/T6OYWAxKFjI/AAAAAAAAAKU/HiagSCri_sk/ctrl_G2_thumb%25255B1%25255D.png?imgmax=800" width="504" height="581"></a> </p> <p></p> <p>這樣,所有的圖框就會被圈選出來,直接按「delete」鍵,就可以全刪了</p> <p><a href="http://lh5.ggpht.com/-hZ8bFBAxI-M/T6OYYSxwSAI/AAAAAAAAAKc/plsoDF4_Dsg/s1600-h/ctrl_G3%25255B3%25255D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ctrl_G3" border="0" alt="ctrl_G3" src="http://lh4.ggpht.com/-yZF9nAyLH3w/T6OYZAZAxkI/AAAAAAAAAKk/3pVRzr98LaM/ctrl_G3_thumb%25255B1%25255D.png?imgmax=800" width="504" height="460"></a></p> DeepBlueAmberhttp://www.blogger.com/profile/02448662575815613881noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-1821923597040288892012-04-18T19:30:00.001-07:002012-04-18T19:59:31.052-07:00清除快取 cache幾乎,所有的專案到了給「客戶測試」的階段,就會發生:<br />
endUserA 跟 endUserB 和PG間畫面不一致的情況<br />
endUserA:你們那個畫面的字不是說要改嗎? 我怎麼還沒看到有改…..<br />
PG:我兩天前就改好了 (心中的OS:上輩子就改好了啦 XD)<br />
通常的原因:都是客戶那邊 瀏覽器 快取(cache) 造成的<br />
如果是命苦的駐點工程師,就方便多了,直接在客戶的電腦上,點點按按就好了<br />
如果是命好一滴滴,不用駐點的工程師,這個時候,就要透過電話,跟客戶解釋了 <br />
但是,一定是:PG 講破嘴,user 還是搞不清楚 要在那裡按按鈕,搞不好,笨一點的PM就會叫你電腦包一包,去客戶那邊清 cache ……… XD <br />
所以,別再 為難 endUserA、endUserB,找一堆,明明就在他眼前,他卻看不到的按鈕,試試 <span style="color: red; font-size: small;">“快速鍵”</span>吧 ~ (腦直的工程師,總是直覺的叫不懂電腦的地球人,照工程師習慣的做法做) <br />
<span style="color: maroon; font-size: medium;">清 cache 的 快速鍵</span> <br />
<b>IE</b>:Ctrl + F5 強迫將網頁重新整理<br /> (此功能在 IE8 無效,但在 IE7 與 IE9 RC 都沒問題)<br /> IE8:Ctrl + Shift + Delete <br />
<b>FireFox:</b> Shift + F5 <br />
<b>Chrome:</b> Ctrl + Shift + Delete <br />
<b>Safari</b>:Control + Alt + E,然後按一下 [清除]<br />
<br />
<b>附註:清除「各種」網頁瀏覽器快取 的 操作步驟</b><br />
<b>IE7、 <b>IE9</b></b> <br />
1. 從功能表列,按一下 [工具] <br />2. 按一下 [網際網路選項] <br />3. 按一下 [一般] 標籤 <br />4. 在 [瀏覽歷程記錄] 區段中,按一下 [刪除檔案] 按鈕 <br />
<b><a href="http://www.foolegg.com/how-to-clear-the-cache-cookie-and-history-of-internet-explorer-8/">IE8</a>:</b>在「安全性(S)」內選擇「刪除瀏覽歷程記錄(D)…」 <br />
<b>FireFox</b><br />
1. 從功能表列,按一下 [工具] <br />2. 按一下 [選項] <br />3. 按一下 [個人隱私] 的 icon (圖示)<br />4. 按一下 [清除最近的歷史記錄 或 清除特定網站設定的 Cookie] 的連結 <br />
另外 ,按一下 [進階] 的 icon (圖示),勾選「停用自動快取管理」 <br />
<b>Chrome</b> <br />
1. 按一下瀏覽器工具列中的 [扳手] 圖示<br />2. 選取 [工具]<br />3. 選取 [清除瀏覽資料]<br />4. 在出現的對話方塊中,針對要移除的資訊類型選取核取方塊<br />5. 選取 [不限時間] 以刪除所有資料。<br />6. 按一下 [清除瀏覽資料] <br />
其它:<a href="http://www.java.com/zh_TW/download/help/webcache.xml">opera</a>、<a href="http://safari.helpmax.net/tw/%E9%9A%B1%E7%A7%81%E5%92%8C%E5%AE%89%E5%85%A8/%E9%87%8D%E8%A8%AD-safari/">Safari</a>DeepBlueAmberhttp://www.blogger.com/profile/02448662575815613881noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-65863040101925229532012-04-15T20:57:00.001-07:002012-04-15T20:57:36.443-07:00java.lang.IllegalArgumentException - Can not set xxxClass field to $Proxy<p>解法:</p> <p><font color="#800000" size="2">You need to autowire against the interface type</font></p> <p>請檢查該class,所引用的 class ( spring bean ),必需 要引用 interface 的class,而非 implement 的 class。</p> <p>參考來源:<a href="http://stackoverflow.com/questions/6976183/proxy25-error-with-spring-service">http://stackoverflow.com/questions/6976183/proxy25-error-with-spring-service</a></p> DeepBlueAmberhttp://www.blogger.com/profile/02448662575815613881noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-91703545152910819132012-04-15T20:28:00.001-07:002012-04-15T20:28:49.275-07:00Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces<p> </p> <p>解法:</p> <p>檢查是否有 cglib jar;如果有的話,就是 這支 class,要有 interface</p> DeepBlueAmberhttp://www.blogger.com/profile/02448662575815613881noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-52973282413872312952012-04-07T08:53:00.001-07:002012-04-07T08:53:27.257-07:00Amazon Kindle的報關<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-nPzfkC3fnT4/T4Bg88ixP2I/AAAAAAAABgU/N_tpma6luKc/s1600/kindle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="73" src="http://4.bp.blogspot.com/-nPzfkC3fnT4/T4Bg88ixP2I/AAAAAAAABgU/N_tpma6luKc/s400/kindle.png" width="400" /></a></div>
終於決定要從Amazon買第四代Kindle基本款,沒有螢幕觸控的那個版本,只是拿來看書的東西不太需要觸控螢幕或3G隨時上網。美國以外的地方只能買國際版的,也就是沒有廣告的版本,比有廣告的多30美元,所以從79美元變成109美元。運費到台灣只要6.34美元。<br />
第一次在Amazon購物,很快就上手,在網路上刷卡後直接告知會需要約六個工作天才會送到。在Amazon網站上可以查看看你的商品已經送到哪了。當Kindle已經到香港時,收到一封DHL寄的電子郵件要我提供個案委任書跟自用切結書。委任書很簡單只要給個人資料傳真回去就行了。而自用切結書中寫的用途是:申請電信管制射頻器材進口許可。原來自己從國外買一台有Wi-Fi功能的電子設備回來也要申請。除了個人資料外還要填產品相關無線資訊令人非常頭大。最後找到的結果在下面,給沒耐心急著找這資料的人先看,<br />
<dl>
<dt>器材名稱:</dt>
<dd>Kindle Wi-Fi 6" E Ink Display - for International shipment</dd>
<dt>廠牌:</dt>
<dd>Amazon</dd>
<dt>型號:</dt>
<dd>D01100</dd>
<dt>工作頻率:</dt>
<dd>802.11 b/g/n 2400 MHz ~ 2483.5MHz</dd>
<dt>輸出功率:</dt>
<dd>802.11b: 14.70dBm, 802.11g: 14.80dBm, 802.11n: 10.80 dBm(BW 20MHz)</dd>
</dl>
填好的自用切結書如下:<br />
<div class="separator" style="clear: both; text-align: center;">
<img alt="Kindle自用切結書" border="0" height="640" src="http://4.bp.blogspot.com/-0jEpT7GNcx4/T4BdaqPREQI/AAAAAAAABgM/qroFn-GqLTg/s640/kindle-self-use-claim.png" title="" width="465" /></div>
<br />
以上的資料是在還沒拿到Kindle時到網路上查到的,其中<a href="http://changyy.pixnet.net/blog/post/27010901-ncc-%E8%87%AA%E7%94%A8%E5%88%87%E7%B5%90%E6%9B%B8" target="_blank">此篇文章</a>給了很多有用的資訊,不過文中提到的是第三代Kindle,跟我買的機型不同,查資料的過程跟他的大同小異。<br />
<h3>
步驟一、器材名稱</h3>
首先是到此商品的<a href="http://www.amazon.com/gp/product/B0051QVF7A/ref=ox_ya_os_product" target="_blank">網頁</a>,上面就有商品的全名:
<b>Kindle Wi-Fi 6" E Ink Display - for International shipment</b>。
<br />
<h3>
步驟二、使用說明書</h3>
一樣在商品網頁可以找到說明書的連結<a href="http://kindle.s3.amazonaws.com/KindleUser%27sGuide.pdf" target="_blank">Kindle User's Guide</a>。<br />
<h3>
步驟三、搜尋型號</h3>
在說明書中可以搜尋Model Number,從這可以找到型號就是<b>D01100</b>。<br />
<h3>
步驟四、搜尋FCC ID</h3>
然後一樣在說明書裡搜尋FCC ID可以找出他們對FCC(美國聯邦通信委員會)提出無線設備申請的代碼。有了這代碼就可以去FCC的網站上找出Kindle實際上操作時所產生訊號的資訊。說明書中提到的FCC ID是<b>ZEG-0725</b>。<br />
<h3>
步驟五、FCC申報文件</h3>
用Google直接搜尋<a href="https://www.google.com/search?hl=en&safe=off&q=FCC+ID+ZEG-0725&oq=FCC+ID+ZEG-0725" target="_blank">FCC ID ZEG-0725</a>,查到FCC官方網站中的<a href="https://apps.fcc.gov/oetcf/eas/reports/ViewExhibitReport.cfm?mode=Exhibits&RequestTimeout=500&calledFromFrame=N&application_id=745947&fcc_id=%27ZEG-0725%27" target="_blank">相關申請文件</a>。下載<a href="https://apps.fcc.gov/eas/GetApplicationAttachment.html?id=1482678" target="_blank">RF Exposure Info的PDF</a>,內容就可以找到Kindle無線電波的測試結果,順便一提這個測試結果是由台灣的<a href="http://www.sporton.com.tw/" target="_blank">耕興股份有限公司</a>提供的。<br />
<br />
購買後第五天早上傳真這兩張單子跟身分證給DHL,下午就拿到Kindle了。拆箱後翻到背面果然D01100的型後就印在上面。青蛙工程師http://www.blogger.com/profile/00671399137498989772noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-16992563105534549212012-03-28T03:12:00.001-07:002012-03-28T03:12:32.159-07:00WORD 編號 (編碼) 跳號<p><font size="3">寫文件,最怕碰到要整合所有人的word文件,編號全部跑掉的問題</font></p> <p><font size="3">如下圖所示:</font></p> <p><font size="3">表1、員工資料表 </font></p> <p><font size="3">表1、表格二</font></p> <p><font size="3">表1、表格三</font></p> <p><a href="http://lh3.ggpht.com/-nMVF0-10xa8/T3LkAhJ6RwI/AAAAAAAAAJY/1_yTcnsjOE4/s1600-h/table1%25255B4%25255D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="table1" border="0" alt="table1" src="http://lh3.ggpht.com/-svkvVZTQXcM/T3LkBsy253I/AAAAAAAAAJg/CBl1WtkBaU0/table1_thumb%25255B2%25255D.png?imgmax=800" width="524" height="344"></a> </p> <p>你要手動一個一個改成:</p> <p><font size="3">表1、員工資料表 </font></p> <p><font size="3">表<font color="#ff0000">2</font>、表格二</font></p> <p><font size="3">表<font color="#ff0000">3</font>、表格三</font></p> <p><font size="3">真的滿拷北的,</font></p> <p><font size="3">試試,先將文件全選 (快速鍵:ctrl + a),</font></p> <p><font size="3">然後,在編號的地方(灰色的區塊) 「按右鍵」</font></p> <p><font size="3">點選「更新功能變數」,就ok了,有爽吧,做完記得不要說,摸一下魚喔</font></p> <p><a href="http://lh6.ggpht.com/-lruLAz4dGvc/T3LkCzxsB4I/AAAAAAAAAJk/UyOdSg1YJ6M/s1600-h/table2%25255B3%25255D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="table2" border="0" alt="table2" src="http://lh3.ggpht.com/-DvAlvW-xErM/T3LkDkSCKuI/AAAAAAAAAJs/L1mx82l4hvo/table2_thumb%25255B1%25255D.png?imgmax=800" width="524" height="422"></a> </p> <p><font size="3"></font> </p> <p><font size="3"></font> </p> <p><font size="3"></font></p> DeepBlueAmberhttp://www.blogger.com/profile/02448662575815613881noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-12225560621488405622012-01-30T00:58:00.001-08:002012-01-30T00:58:28.628-08:00如何改變 IBM RSA (Rational Software)的語言介面<h3>How to change the default language for Rational Software Development Platform desktop products</h3> <p>原本是裝 Rational Software Architect 7.0 的 英文介面,被要求要統一用中文介面 呈現 UML圖形,ibm的官網上有提供改變語言介面的方法:</p> <p><a href="http://www-01.ibm.com/support/docview.wss?uid=swg21195484">http://www-01.ibm.com/support/docview.wss?uid=swg21195484</a></p> <p><a href="http://lh3.ggpht.com/-9P6JfHY6I6c/TyZbmhfCPHI/AAAAAAAAAHc/7M2tEkGsAB8/s1600-h/image7.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-Y2kKupdsTto/TyZbnU4ttvI/AAAAAAAAAHg/rVwKzO5JI20/image_thumb5.png?imgmax=800" width="504" height="420"></a> </p> <p>方法一:用指令行開啟,RSA安裝目錄<IBM_INSTALL_DIR/SPD70>,打:</p> <p> eclipse.exe –nl zh_TW</p> <p>方法二:開啟RSA安裝目錄<IBM_INSTALL_DIR/SPD70> 的 eclipse.ini 檔案,加</p> <p> -Duser.language=zh_TW</p> <p><strong><font color="#800000" size="3"></font></strong> </p> <p><strong><font color="#800000" size="3">但是,只有開啟RSA的畫面說明變中文,工具列仍是英文。</font></strong></p> <p>解法:按右鍵,以「系統管理員的身分」 開啟「IBM Install Manager」</p> <p> (win7以上,或非系統管理員身分時)</p> <p><a href="http://lh5.ggpht.com/-ZzO-ClmKztY/TyZbn-f3KsI/AAAAAAAAAHo/Xh-WR7lWwaI/s1600-h/image11.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-bpT2SxmUgH8/TyZboftUPjI/AAAAAAAAAHs/lCJF-XSxPHA/image_thumb7.png?imgmax=800" width="504" height="158"></a> </p> <p> 選擇「<strong><font color="#800000" size="3">修改</font></strong>」<a href="http://lh4.ggpht.com/-HnKXRh8X3rw/TyZbosMDUkI/AAAAAAAAAH4/Y0LNH1dyOLc/s1600-h/image19.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-y0qti8KhOOM/TyZbplORz6I/AAAAAAAAAIE/EQIyIqSTSWI/image_thumb11.png?imgmax=800" width="504" height="354"></a> </p> <p></p> <p>選擇「<strong><font color="#800000" size="3">下一步</font></strong>」<a href="http://lh5.ggpht.com/-L0JqxG7e5sU/TyZbqRjpE0I/AAAAAAAAAII/5xtotXLsf-Y/s1600-h/image23.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-bfIsAzNlXqc/TyZbq4mpiaI/AAAAAAAAAIU/En1HvuO5ns8/image_thumb13.png?imgmax=800" width="504" height="354"></a> </p> <p></p> <p></p> <p>「<strong><font color="#800000" size="3">勾選你要的語言,完成更新,就可以把工具列改成指定的語言了</font></strong>」<a href="http://lh3.ggpht.com/-OEFV7GApnRg/TyZbrknCvSI/AAAAAAAAAIY/D3S1EIKdYbc/s1600-h/image15.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-MPpWWfEIlBo/TyZbs9BSmMI/AAAAAAAAAIg/Obs_YFiVrP4/image_thumb9.png?imgmax=800" width="504" height="133"></a></p> DeepBlueAmberhttp://www.blogger.com/profile/02448662575815613881noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-3186486110435281062011-12-10T19:00:00.001-08:002011-12-10T19:00:55.031-08:00查詢 informix sequence的值<p>通常,會在資料庫 table 的 Primary Key 欄位,用資料庫預設的流水號, <p>指令為: <p>CREATE SEQUENCE table_seq; <p>在塞值時,就會用 table_seq.nextval ,取得該流水號 <p>INSERT INTO table ( index, name, value ) <p>VALUES( table_seq.nextval , ‘fooName’, ‘fooValue' ) <p>但當有需求是,要把新增的這一筆資料,再query出來,秀在畫面時 <p>可以用新增的資料當作查詢條件,把該筆資料查出來 <p>但,不能保證,只會查該筆資料,有可能會有重覆類似的資料查出來 <p>這時,最保險的做法是:如果我能知道,資料庫產生的sequence的值,去做查詢 <p>做法( 以informix為例 ): <p>//從 systables 查出 流水序號的 <p>String nextValSql = </p> <p>"SELECT table_seq.nextval FROM systables WHERE tabid=1" ; </p> <p>int sequence_number = getJdbcTemplate().queryForInt(nextValSql);</p> <p>記得:流水號的型別是 int</p> DeepBlueAmberhttp://www.blogger.com/profile/02448662575815613881noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-45787886235063319882011-12-05T23:42:00.001-08:002011-12-06T00:50:50.901-08:00解決 java.net.UnknownHostException<Uncaught Throwable in processSockets<br />
weblogic.utils.NestedError: This address was valid earlier, but now we get: .<br />
weblogic.utils.NestedError: This address was valid earlier, but now we get: <br />
at weblogic.rjvm.JVMID.address(JVMID.java:560)<br />
at weblogic.rjvm.RJVMManager.record(RJVMManager.java:153)<br />
at weblogic.rjvm.RJVMManager.findOrCreateInternal(RJVMManager.java:289)<br />
at weblogic.rjvm.RJVMManager.findOrCreateRemote(RJVMManager.java:139)<br />
at weblogic.rjvm.ConnectionManagerServer.handleIdentifyResponse(ConnectionManagerServer.java:621)<br />
Truncated. see log file for complete stacktrace <br />
Caused By: java.net.UnknownHostException: RISCLT-4<br />
at java.net.InetAddress.getAllByName0(InetAddress.java:1157)<br />
at java.net.InetAddress.getAllByName(InetAddress.java:1083)<br />
at java.net.InetAddress.getAllByName(InetAddress.java:1019)<br />
at java.net.InetAddress.getByName(InetAddress.java:969)<br />
at weblogic.rjvm.JVMID.address(JVMID.java:553)<br />
Truncated. see log file for complete stacktrace<br />
> <br />
解決方法:在 C:\Windows\System32\drivers\etc\hosts<br />
將 #127.0.0.1 ---> 的 「#」 拿掉。<br />
再新增 RISCLT-4 這個新的domain name 和 ip,如:<br />
192.160.2.1 RISCLT-4<br />
<br />
<br />DeepBlueAmberhttp://www.blogger.com/profile/02448662575815613881noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-57379999025046224082011-11-28T00:17:00.001-08:002011-11-28T00:20:27.293-08:00自訂標籤可以把JSP會共用到的邏輯判斷、特殊畫面呈現,拉出來做一個 tag<br />
比方說,在資料新、刪、修,成功後,要加一個顯示訊息<br />
<!-- 畫面新增成功的訊息 --><br />
<c:if test="${not empty<span style="color: red;"> </span><span style="color: navy;">createMessage</span> }"><br />
<div id="<span style="color: maroon;">createFoo</span>" class="highlight-css" style="padding:0 0.7em;"><br />
<p><br />
<span class="icon-css" <br />
style="float:left; margin-right:5px;"></span><br />
<fmt:message key="<span style="color: #0000a0;">${ <span style="color: navy;">createMessage</span> }</span>"/><br />
</p><br />
</div><br />
</c:if> <br />
<script type="text/javascript"><br />
//畫面延遲2秒後,fadeOut<br />
$(function() {<br />
$("#${<span style="color: maroon;">createFoo</span>}").delay(2000).fadeOut(2000);<br />
});<br />
</script> <br />
<br />
<!-- 畫面修改成功的訊息 --><br />
<c:if test="${not empty <span style="color: navy;">modifyMessage</span> }"><br />
<div id="<span style="color: maroon;">modifyFoo</span>" class="highlight-css" style="padding:0 0.7em;"><br />
<p><br />
<span class="icon-css" <br />
style="float:left; margin-right:5px;"></span><br />
<fmt:message key="${ <span style="color: navy;">modifyMessage</span> }"/><br />
</p><br />
</div><br />
</c:if> <br />
<script type="text/javascript"><br />
$(function() {<br />
$("#${<span style="color: maroon;">modifyFoo</span>}").delay(2000).fadeOut(2000);<br />
});<br />
</script> <br />
<br />
<!-- 畫面刪除成功的訊息 --><br />
<c:if test="${not empty <span style="color: navy;">modifyMessage</span> }"><br />
<div id="<span style="color: maroon;">removeFoo</span>" class="highlight-css" style="padding:0 0.7em;"><br />
<p><br />
<span class="icon-css" style="float:left; margin-right:5px;"></span><br />
<fmt:message key="${ <span style="color: navy;">modifyMessage</span> }"/><br />
</p><br />
</div><br />
</c:if> <br />
<script type="text/javascript"><br />
$(function() {<br />
$("#${<span style="color: maroon;">removeFoo</span>}").delay(2000).fadeOut(2000);<br />
});<br />
</script><br />
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 600px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;">
</div>
有沒有覺的快瘋了,一直在 do loop =口 =<br />
那就把這一段拉出來,做tag。<br />
<br />
第一步:在 WEB-INF\tags 下面,建立一個,延伸檔名為:tag的檔案<br />
若用eclipse的話,可以選擇新建一個 JSP Tag<br />
<a href="http://lh4.ggpht.com/-_tQcLIr19Bg/TtNDidKnPTI/AAAAAAAAAHM/tLy98ix4MUQ/s1600-h/image%25255B3%25255D.png"><img alt="image" border="0" height="290" src="http://lh5.ggpht.com/-ma7jsjhxuRc/TtNDjIzJmYI/AAAAAAAAAHU/Nmj-QF0uypw/image_thumb%25255B1%25255D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="image" width="304" /></a><br />
<br />
第二步用法:<br />
可以將各種格式 ( <span style="color: red;">*</span>日期 )、或CSS樣板、或JS特效,通通放進來<br />
在JSP就只需要單純的引用自訂的標籤<br />
以上面的範列來說,就可以改成這樣:<br />
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 600px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;">
<div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;">
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum1" style="color: #606060;"> 1:</span> <%@ taglib prefix=<span style="color: #006080;">"c"</span> uri=<span style="color: #006080;">"http://java.sun.com/jsp/jstl/core"</span> %></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum2" style="color: #606060;"> 2:</span> <%@ taglib prefix=<span style="color: #006080;">"fmt"</span> uri=<span style="color: #006080;">"http://java.sun.com/jsp/jstl/fmt"</span> %></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum3" style="color: #606060;"> 3:</span> <%@ attribute name=<span style="color: #006080;">"messageId"</span> required=<span style="color: #006080;">"true"</span> %> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum4" style="color: #606060;"> 4:</span> <%@ attribute name=<span style="color: #006080;">"key"</span> required=<span style="color: #006080;">"false"</span> %></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum5" style="color: #606060;"> 5:</span> <!-- 自訂傳進來的參數,required=<span style="color: #006080;">"true"</span>為必要值 --></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum6" style="color: #606060;"> 6:</span> <fmt:setBundle basename=<span style="color: #006080;">"message.bundle.path"</span>/></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum7" style="color: #606060;"> 7:</span> <c:<span style="color: blue;">if</span> test=<span style="color: #006080;">"${not empty key}"</span>></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum8" style="color: #606060;"> 8:</span> <div id=<span style="color: #006080;">"${ messageId }"</span> </pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum9" style="color: #606060;"> 9:</span> <span style="color: blue;">class</span>=<span style="color: #006080;">"highlight-css"</span> </pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum10" style="color: #606060;"> 10:</span> style=<span style="color: #006080;">"padding:0 0.7em;"</span>></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum11" style="color: #606060;"> 11:</span> <p></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum12" style="color: #606060;"> 12:</span> <span <span style="color: blue;">class</span>=<span style="color: #006080;">"icon-css"</span> </pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum13" style="color: #606060;"> 13:</span> style=<span style="color: #006080;">"float:left; margin-right:5px;"</span>></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum14" style="color: #606060;"> 14:</span> </span></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum15" style="color: #606060;"> 15:</span> <fmt:message key=<span style="color: #006080;">"${key}"</span>/></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum16" style="color: #606060;"> 16:</span> </p></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum17" style="color: #606060;"> 17:</span> </div></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum18" style="color: #606060;"> 18:</span> <script type=<span style="color: #006080;">"text/javascript"</span>></pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum19" style="color: #606060;"> 19:</span> <!--<span style="color: green;">//共用的script 效果</span></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum20" style="color: #606060;"> 20:</span> $(function() {</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum21" style="color: #606060;"> 21:</span> $(<span style="color: #006080;">"#${messageId}"</span>).delay(2000).fadeOut(2000);</pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum22" style="color: #606060;"> 22:</span> });</pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum23" style="color: #606060;"> 23:</span> --></pre>
<pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum24" style="color: #606060;"> 24:</span> </script> </pre>
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum25" style="color: #606060;"> 25:</span> </c:<span style="color: blue;">if</span>></pre>
</div>
</div>
<br />
JSP使用:<br />
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum1" style="color: #606060;"> </span><%@ taglib prefix=<span style="color: #006080;">"frog"</span> tagdir=<span style="color: #006080;">"/WEB-INF/tags"</span> %></pre>
<br />
<span id="lnum3" style="background-color: white; color: #606060; font-family: 'Courier New', courier, monospace; font-size: 11px; line-height: 16px; text-align: left; white-space: pre;"> </span><span class="Apple-style-span" style="background-color: white; font-family: 'Courier New', courier, monospace; font-size: 11px; line-height: 16px; white-space: pre;"><ris:statusMessage messageId=</span><span style="background-color: white; color: #006080; font-family: 'Courier New', courier, monospace; font-size: 11px; line-height: 16px; text-align: left; white-space: pre;">"processMessage"</span><span class="Apple-style-span" style="background-color: white; font-family: 'Courier New', courier, monospace; font-size: 11px; line-height: 16px; text-align: left; white-space: pre;"> key=</span><span style="background-color: white; color: #006080; font-family: 'Courier New', courier, monospace; font-size: 11px; line-height: 16px; text-align: left; white-space: pre;">"${message}"</span><span class="Apple-style-span" style="background-color: white; font-family: 'Courier New', courier, monospace; font-size: 11px; line-height: 16px; text-align: left; white-space: pre;"> /></span><br />
<br />
這樣,有沒有覺得跳出地獄迴圈了~DeepBlueAmberhttp://www.blogger.com/profile/02448662575815613881noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-82633249998883802312011-11-26T21:33:00.001-08:002011-11-26T21:58:11.849-08:00VIM中每行一相反順序排列在VIM看log檔時,有時會希望從最舊的開始看,有時則想從最新的;或是,不知什麼鬼狀況看到的文字檔每行就是剛好是我想看順序的相反。通常都是後者的強況比較多,鬼狀況。<br />
<br />
當然VIM最喜歡的就是鬼狀況。以下的指令可以直接將每行順序反轉。<br />
<pre>:g/^/m0
</pre>
<br />
以上是正規表示式(Regular expression)。<br />
<ul>
<li>開頭的g代表要對每個有比對的行執行動作。</li>
<li>^代表要比對到的內容是每一行的開頭,因為每一行一定有開頭所以都會比對到。</li>
<li>m是移動。0則代表移到第0行,即檔案的最開始。</li>
</ul>
<br />
所以指令執行的時候會是<br />
<ol>
<li>選第一行,將第一行移到檔案最頂端。</li>
<li>選第二行,將第二行移到檔案最頂端。</li>
<li>選第三行,將第三行移到檔案最頂端。</li>
<li>...</li>
</ol>
依此類推。<br />
<br />青蛙工程師http://www.blogger.com/profile/00671399137498989772noreply@blogger.comtag:blogger.com,1999:blog-1748913476140520462.post-11726509165369040102011-11-24T18:10:00.001-08:002011-11-28T00:19:30.002-08:00Encoding or code set not supported<br />
-79783 Encoding or code set not supported <br />
The encoding or code set entered in the DB_LOCALE or CLIENT_LOCALE<br />
variable is not valid. Check the "Informix JDBC Driver Programmer's Guide"<br />
for valid code sets. <br />
<br />
當存單一英文字母時,是沒有問題的;<br />
但是存一個中文字時,就會出現這個SQL Exception<br />
<br />
而,這個table的欄位,我是這樣開的:colName NVARCHAR(1),<br />
因為需求是,只會存單一個字元<br />
<br />
資料庫是 informix ,jsp的編碼是utf-8,資料庫連線設定是:<br />
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 600px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;">
<div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;">
<pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"><span id="lnum1" style="color: #606060;"> 1:</span> jdbc:informix-sqli://localhost:9088/ibm:informixserver=ol_informix1170;NEWCODESET=utf8,8859-1,819</pre>
</div>
</div>
<br />
解法很奇怪:<br />
<br />
把 資料庫欄位的長度加到四,colName NVARCHAR(4),<br />
沒有改任何設定,資料就可以正常搜尋出來了<br />
或許是 utf-8 編碼用到四個 byte !?DeepBlueAmberhttp://www.blogger.com/profile/02448662575815613881noreply@blogger.com