2015年9月28日 星期一

MVC 使用心得

從知道 CodeIgniter 之後,使用 MVC 架構來開發網頁也好一段時間了。到現在,若沒有 MVC framework,就不曉得怎麼動手了。

剛開始時,會想要遵循 Model/View/Controller 的拆解原則來安排程式。可是在移轉一些舊有的 ASP 或 PHP 程式之後,發現最基本的架構,只用到 Controller + View,然後把一些共用的程式碼抽出來,放到 Lib 下。而資料庫存取,大都用 DB query builder 來完成。因此,那個 Model 就變得很奇怪的角色,不曉得該如何歸類,或該放些什麼進去。

到了開始使用 Laravel 5.0 時,發現它把 Model 的目錄給拿掉了。有明確目錄位置的是 Controller 和 View,其餘的自己看著辦。看來大勢所趨,網頁程式,大抵是就是,Route + Contoller 扮演 dispatcher 的功能,View 輸出結果。其餘的,就是 Bussiness Logic 了,大概就是建一堆 Class,擺在適當的目錄下。

2015年9月12日 星期六

通識教育,是營養學分?

通識教育,是營養學分?
其實,在社會上工作之後,會發現,一個人所學範圍越廣,知識越廣,瞭解的層面越寬廣,發展可能性就會越好。
另一方面,依據大部人的經驗,很多人在畢業之後就業,和他在校所學,百分之七八十都沒關係。
所以,通識課程,在廣面來講,對於個人來講是有幫助的。

引述 臺灣大學,江才健老師的 <科學在文化中的定位和挑戰>
連結 -- http://get.aca.ntu.edu.tw/getcdb/handle/getcdb/253687

2015年9月7日 星期一

在 Grails 下,使用 Apache FileUpload

我不曉得在台灣有多少人在用 Grails,其中是否有人也碰到類似的問題。還是稍微記一下,供可能碰到同樣問題的人參考。

在 Grails 下,自行建立的 Servelet 中,使用 Apache FileUpload 處理上傳檔案,程式碼大致如下

DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List /* FileItem */ items = upload.parseRequest(request);

不論怎麼試,所傳回的 items 一直都是空的。

好不容易,才找到問題所在,因為 Grails 會在預先處理 request 的資料。因此要修正 config.groovy,將 disable 處理 multi part requests 的設定設為 true
// whether to disable processing of multi part requests
// grails.web.disable.multipart=false
grails.web.disable.multipart=true

原因,依據 Apache's FAQ page for FileUpload 中的說明,"A Request can only be parsed once."

Question: Why is parseRequest() returning no items?
Answer: "This most commonly happens when the request has already been parsed, or processed in some other way. Since the input stream has aleady been consumed by that earlier process, it is no longer available for parsing by Commons FileUpload."


2015年8月26日 星期三

使用 PHP 內建的 HTTP server

參考連結
https://docs.phalconphp.com/en/latest/reference/built-in.html
https://gist.github.com/tamagokun/3801087
http://www.sitepoint.com/taking-advantage-of-phps-built-in-server/

在 PHP 5.4.0 之後,就內建 HTTP server,可以很方便的測試網頁。甚至代替網芳,用來傳檔案也很方便。

只要下這樣的指令,就可以了。
php -S localhost:8000 -t /web_root

只是不支援 Apache 的 .htaccess 和 mod_rewrite,對於省略 index.php 的網址,必須用其他方式達成。

交易時,我會找很多理由,不守紀律

交易時 我會找很多理由 不守紀律

2015年8月4日 星期二

在 Wine 下安裝 Sublime Text 3

(Install Sublime text 3 under Wine)

雖然,有 Linux 版的 Sublime Text 3,中文輸入也已設定成功,但是,text drag and drop 的功能在 Linux 下是無效的,我的決擇是捨中文輸入,選擇文字拖曳的功能。因此,又在想著如何透過 Wine 來執行 Sublime Text 3。

照著先前的作法,裝了 vcrun2010,仍然是意外死亡。最後,抱著試一試的想法,使用 winetricks,將上面可以裝的東西,都裝裝看,看是否運氣好,能夠讓 Sublime Text 3 跑起來。運氣還不錯,終於成功執行。總計裝了 dotnet20, dotnet20sp1, dotnet30sp1, glut,vcrun2010 倒沒有裝。不曉得是那個有用。將目錄整個砍掉,重來一次就知道了。

== Related Information ==

OS: Gentoo Linux, kernel: 3.18.12
Wine: 1.7.47, Winetricks: 20150706
Sublime Text 3 - build 3083
Required package:  dotnet20sp1 or dotnet20sp2
Native DLL:  dwrite.dll

一樣,為個別的軟體建個專用目錄,建立虛擬目錄。
$ WINEARCH=win32 WINEPREFIX=~/wine-sublime3 winecfg
選擇Windows 版本: Windows 7

設定虛擬目錄的環境變數
$ export WINEPREFIX=~/wine-sublime3

安裝 Sublime Text

可以執行
$ wine explorer
點選安裝檔,進行安裝。或是把安裝檔 copy 至 ~\wine-sublime3\drive_c\ 下,然後執行
$ wine c:\\Sublime\ Text\ Build\ 3083\ Setup.exe
或
$ wine Z:\\home\\ajax\\Downloads\\Sublime\\Sublime\ Text\ Build\ 3126\ Setup.exe

執行看看,
$ wine "C:\\Program Files\\Sublime Text 3\\subl.exe"
嗯,出現嚴重錯誤!

先裝 .NET 2.0 Framework SP1 或 SP2
$ winetricks dotnet20sp1

再試一次,可以成功執行,但畫面是亂的,這已有經驗了。透過 winecfg 的函式庫功能,將 dwrite.dll 設成原生 (native) 即可。dwrite.dll 是一個系統的 DLL 檔,該檔的描述為 Microsoft DirectX Typography Services。
大功告成,可以舒服的用了。
另外,package control 也不能用,那就用手動安裝吧,反正也做慣黑手了。

InputHelper

Linux 版本的 Sublime Text 會有中文輸入的問題,在 Wine 下執行,也同樣無法直接輸入中文,只好暫時用 copy and paste 的方式。很幸運的,經過一些嘗試,可以用 InputHelpler 輸入中文了。依網路上找到的資料,下載 InputHelper,然後複製到 ~/wine-sublime3/drive_c/users/ajax/Application Data/Sublime Text 3/Packages/ 的目錄下,再修改下列的部分
1. Default (Linux).sublime-keymap 改名為 Default (Windows).sublime-keymap 
2. 修改 inputhelper.py 的下面兩個地方
    (1) if sublime.platform() == 'windows': 
    (2) args = ["cmd", "/c", location]
3. 修改 linux_text_input_gui.py 的第一行為 #!/usr/bin/env python2,因為 pygtk 目前只有 Python 2 的版本,而我的 OS 預設是 Python 3。

注意,依照上述方式執行,Sublime 是在 WINE 的環境中執行,但 InputHelper 則是在 Linux 的環境中執行。

衍生問題,ctrl_space 在 sublime 中,已有定義。編輯時不小心按到,會切換中英文輸入模式,但無法輸入中文,更進一步,有一些快速鍵也會失效。因此,在執行 Sublime 之前,必須 unset XMODIFIERS 環境變數,使中文輸入在 Sublime 中不會有作用。

#!/bin/bash
unset XMODIFIERS
export WINEPREFIX="/home/ajax/wine-sublime3"
wine "C:\\Program Files\\Sublime Text 3\\subl.exe"


設定 sidebar 的字型大小

透過 [Browse Packages] 功能,找出其下的 [User] 目錄,建立 Default.sublime-theme,加上下面的內容

[
  {
    "class": "sidebar_label",
    "color": [0, 0, 0],
    "font.bold": false,
    "font.size": 12
  }
]


假如是使用別的 theme,則依其名稱而不同,例如 Material-Theme-Darker.sublime-theme

補記

目前,我的筆電還是裝 Wine 的穩定版是 Wine 1.6.2,照著上面的步驟再裝一次,但安裝 Sublime Text 3後,無法成功執行。記得在先前的試裝過程中,看到 mono 的訊息,Wine 1.6.2 中,裝的是 wine-mono-0.0.8.msi,而 Wine 1.7.47 裝的是 wine-mono-4.5.6.msi,差別可能在此吧。升級至 Wine 1.7.47 ,就可以成功執行,舊版的 Wine 也就不再多試了。

2017-06-01 記

升級到 app-emulation/wine-any-2.7,仍是 mask,會自動裝 app-emulation/wine-desktop-common、app-emulation/wine-gecko、app-emulation/wine-mono-4.7.0,幾乎不用再做任何設定,直接裝 sublime-text 即可使用。

2017-09-15 記

在前一版推出的一年之後,2017年9月13日,Build 3143 發行。馬上安裝試用,結果字型變得很難看,也無法使用先前的 Color Scheme,只好再回去用 Build 3126。為了一直避免跳出 update 的提示視窗,在 setting 裡加上下面的設定
  "update_check": false,


2018-10-09 記

不知是那裡改變了,變成 InputHelper 可以輸入中文,但無法貼到編輯的文件中。然後,設定 XMODIFIERS=@im=gcin 就可以輸入中文了。

WINE 的功能表

用 WINE 執行安裝之後,會在功能表上出現選項,例如  Wine >  Programs > Sublime Text 3 對應的檔案在
~/.local/share/applications/wine/Programs/Sublime Text 3.desktop

2015年8月3日 星期一

VM 中使用智慧卡讀卡機

在 VMware 的 VM 中,可以用分享的方式使用智慧卡讀卡機 (smart card reader)。

在 Linux host 中,安裝 pcsc-lite 及 ccid driver。再啟動 pcscd 的 daemon。
Vmare 的 config 中,要加上 usb.ccid.useSharedMode = "TRUE" 的設定

參考
https://pubs.vmware.com/workstation-9/index.jsp?topic=%2Fcom.vmware.ws.using.doc%2FGUID-8AA77FED-BE63-45CB-8FB6-6D7C4A35F76B.html

假如不要使用分享的方式使用智慧卡讀卡機
則修改 VM 的設定檔,例如 Win_XP.vmx ,加入
usb.generic.allowCCID = "TRUE"
usb.ccid.disable = "TRUE"



VMware Workstation Pro 16.0

參考 Disable Smart Card Sharing

修改 /etc/vmware/config,加上
usb.ccid.useSharedMode = "FALSE"

不過還是看不到,就算把 "Show all USB input devices" 打勾也是看不到。











網誌存檔