標籤

ASP.NET MVC (29) Visual C# (15) JQuery (10) Plugins (8) JQuery Plugins (6) JavaScript (6) CSS (4) LinQ (4) Entity Framework (3) IIS (3) MySQL (3) Python (3) CentOS (2) Design Pattern (2) Mac OS (2) SQL Server (2) WCF (2) Windows (2) AWS (1) Browser (1) Docker (1) GIS (1) Internet Security (1) LAMP (1) SEO (1) VMware (1) Windows 7 (1)

2016年3月2日 星期三

MySQL 新增table 顯示「Error: Tablespace for table xxx exists. Please DISCARD the tablespace before IMPORT」


前幾天要把某一張MySQL 的xxx table刪除後重新建立,建立時出現:


Error: Tablespace for table xxx exists. Please DISCARD the tablespace before IMPORT


上網google一下,發現是table的.idb檔案還殘留在系統中。

依照stackoverfkow的方法刪除idb檔案後,還是不能create,顯示有foreign key constraint ,原來是當初有人設定foreign key在xxx表的某個欄位,只好找出來把它刪掉,終於成功create table了。

可能當初就是加了foreign key後,沒有先刪除foreign key就直接刪除table所以造成table的.idb檔案殘留吧。




[Reference]:

1.Error: Tablespace for table xxx exists. Please DISCARD the tablespace before IMPORT


2.How do I see all foreign keys to a table or column?







2015年5月29日 星期五

AWS CentOS LAMP 安裝過程 (Amazon EC2)


現在申請AWS帳號有送免費一年使用EC2,順便學習如何安裝LAMP在CentOS上,以下是安裝的操作紀錄.

以下狀態為已經在AWS EC2開好機器並且已經裝好CentOS6, 使用ssh登入主機:

0. 更新yum
[root@ip-172-31-3-168 conf]# yum install vim-X11 vim-common vim-enhanced vim-minimal

1. 安裝wget
[root@ip-172-31-3-168 temp]# yum install wget


2. 安裝webmin
[root@ip-172-31-3-168 temp]# wget http://prdownloads.sourceforge.net/webadmin/webmin-1.750-1.noarch.rpm
[root@ip-172-31-3-168 temp]# yum -y install perl perl-Net-SSLeay openssl perl-IO-Tty
[root@ip-172-31-3-168 temp]# rpm -U webmin-1.750-1.noarch.rpm

如何開啟 port 10000防火牆    如何更改webmin的root密碼


3. 安裝apache
    [root@ip-172-31-3-168 temp]# yum install httpd

    啟動httpd
    [root@ip-172-31-3-168 temp]# /etc/init.d/httpd start


4. 安裝php
    [root@ip-172-31-3-168 temp]# yum install php

5. 安裝mySQL
    [root@ip-172-31-3-168 temp]# yum istall mysql-server

    啟動mySQL
    [root@ip-172-31-3-168 temp]# /etc/init.d/mysqld start

    設定mySQL
    [root@ip-172-31-3-168 temp]# sudo mysql_secure_installation

6. 安裝phpmyadmin
    [root@ip-172-31-3-168 temp]# rpm -iUvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

7. 記得開啟AWS & iptable 的防火牆 80 port


8. 以上都完成之後, 訪問:
A. apache預設頁面      => http://your-ip/
B. mysql web 頁面         => http://your-ip/phpmyadmin
C webmin頁面               => https://your-ip:10000



















PS.
關閉iptable
[root@ip-172-31-3-168 conf]# service iptables stop

觀察目前網路連線
[root@ip-172-31-3-168 conf]# netstat -cpatn

避免主機被透過ssh暴力攻擊, 可以安裝deny host.
[root@ip-172-31-3-168 ~]# yum install denyhosts

[Reference]:
1. Webmin website
3. Connect to Amazon EC2 file directory using Filezilla and SFTP
4. How to Install and Configure phpMyAdmin on CentOS 6
5. Block SSH Server Attacks (Brute Force Attacks) Using DenyHosts
6. How to create Linux instance on Amazon AWS/EC2
7. Amazon EC2 Document




2015年5月21日 星期四

在Mac OS 安裝Docker


Linux & MacOS 不同的是
Linux 預設已經有執行 Docker daemon & Docker Host
MacOS 則是執行在Boot2Docker提供的Linux virtual machine上








1. 安裝Virtual Box
https://www.virtualbox.org/

2. 安裝docker
➜  ~  brew install docker


3. 安裝boot2docker
➜  ~  brew install boot2docker


4. 初始化boot2docker
➜  ~  boot2docker -v init


5. 啟動boot2docker
➜  ~  boot2docker up

*記得要在command執行三段export指令或是寫入bash中

6. 使用docker info指令
➜  ~  docker info


7. 使用[docker run -d -P --name web nginx]命令執行nginx image, 第一次執行因為沒有image所以直接下載

8. 使用[docker ps]命令看目前正在執行的image:

9. 使用[docker port web]命令查詢目前web的listen port是多少, 下圖為32769:

10. 由於Mac是透過boot2docker, 使用[boot2docker ip]命令查詢boot2docker VM的IP位址.


瀏覽 [http://192.168.59.103:32769/] 即可看到nginx的預設頁面









Reference:

Install Docker on Mac OS X

How to Use Docker on OS X: The Missing Guide




2014年10月29日 星期三

使用ASP.NET MVC 實作購物網站 (三十) - 總結

這個月來很感謝我的主管鼓勵我參加這個有意義的活動,末學所知甚微,感謝追文的IT邦友不嫌棄。

由於今天是最後一天,我們不講程式碼,分享購物網站設計時所學習到的經驗

[優惠活動]
完善的購物網站的背後存在不少設計理念,例如網站的優惠本身就是一個模組,當有促銷活動時,該如何設計才能保持彈性.這裡指的彈性有很多種層面,例如新增活動的彈性,活動模組計算折價的彈性等。

以下為幾個優惠活動常遇到的類型:
  • A商品折價 (單一商品折價)
  • 買A送B
  • AB配 (紅綠配)
  • 優惠券折抵
  • 紅利折抵
  • 滿千送百
  • ...
以上有些可能在系統設計之初就已經預想到並且預留下程式的接口,也有可能是系統開始營運後才加入的功能(苦笑~ ╮(╯◇╰)╭ ),其實要各自完成這些功能並不難,但是判斷以及計價是不容易的,所以一定要能使用可插拔的設計方式來動態加入目前網站的活動模組,即使初期插拔這個動作是hard code也沒關係,當然最後的目標一定是要能使用設定的方式來決定目前活動模組有哪些( 可以使用config檔案 或是 DB內部來紀錄與設定 )
結論 : 活動模組最好使用插拔(Plug-in)的方式設計


[上線前測試]
測試本身不難,但是有些測試的次數是有限制的,例如金流,通常想要真正去測試是否有被扣款以及有無收到款項,是必須真實的去扣款的,這種測試次數一定有某種限制,比較合適的做法是將此段邏輯寫成一個獨立的模組,並且有真實扣款與模擬扣款兩種切換的機制.
通常一個系統與錢相關的程式碼都需要非常小心測試與修改,最好每個步驟都寫入Log,系統上線後也一樣.
結論: 與錢相關的邏輯要非常小心,log是必要的。


[功能除錯]
有時功能在測試時沒問題,但使用者一多可能會出現無法預期的錯誤。例如訂單狀態,有可能出現幽靈訂單、重複下定,也有可能有所謂訂單狀態異常(會員已付款訂單卻顯示未付款,或未付款結果顯示已付款),這些通常都是在上線前無法測試出的。這類無法預防的狀況我們需要著重在治療時期有越多資訊越好,最好使用者的每個步驟都有紀錄(Log)來幫助我們排除錯誤。
結論: log很重要,上線初期Log最好還是保留Debug Mode模式。


[網站外觀]
網站的外觀設計不是問題,問題是特殊節日活動時可能需要改變外觀 ,這部分可以用hardcode去改,等節日過了後再改回去.較好的做法是CSS可使用Sass方式來設計,在修改外觀時可以節省時間.甚至可以考慮把常見的修改(例如萬聖節)可以在後台使用theme的方式直接設定。
結論: 網站外觀可能需要保留彈性,初期可忽略。


[負載平衡]
通常要考慮這個問題時,網站已經有一定的規模了,也許在同時上線人數超過一定數量就會開始很慢。這也同時意味著網站有一定收入囉,此時除了增加網站頻寬,也可以考慮使用多台Web Server來解決,不過可要考慮使用者的Session問題,看是要集中一台Session Server,還是說使用其他機制來保證每次使用者都可以瀏覽至相同的Web Server,例如Nginx。
結論: 初期不需煩惱人太多這種問題。


這三十天我們所完成的是非常基礎(極致簡陋?)的購物網站,其中還缺乏很多功能的實作(例如實際的金流串接),或是檢核機制(例如結賬時填入的手機格式),抑或是最簡單的列表分頁功能(Paging),就交給有需要的人自己擴充了。

感謝耐心看完文章的各位。m(_ _)m



2014年10月28日 星期二

使用ASP.NET MVC 實作購物網站 (二十九) - 商品留言功能

某些購物網站支援商品可讓會員留言的功能,我們今天也來做吧!

今日目標:
* 完成顯示商品詳細資訊功能
* 完成商品留言功能

1. 打開Carts.edmx檔案,新增ProductComment實體模型
各欄位意義如下:
  • Id 留言編號
  • UserId 會員編號
  • Content 留言內容
  • CreateDate 留言時間
  • ProductId 留言之商品編號


2. 打開HomeController,新增Details(),主要為顯示某個編號之商品詳細資訊

3. 同樣在HomeController中新增AddComment(),主要功能為接收使用者所輸入之留言,並將其寫入ProductComment資料表中,完成後重導至Details()

4. 新增Details.cshtml檢視,此檢視除了顯示某筆商品資訊外,也順便將此筆商品的所有留言列表取出(行8~14)

5. 顯示留言列表(行63~69),並且加入可以讓使用者留言的區段(行71~76)

6. 運行專案,在首頁任意點選某筆商品之[詳細資訊]按鈕

7. 進入後顯示商品資訊,我們在下方填選想要留言的文字,並按下[留言]

8. 此時剛剛的留言出現了,我們可以切換其他會員身分模擬更多留言

9. 模擬兩位會員四個留言的結果畫面


這樣我們就完成了會員商品留言功能囉,是不是很簡單呢?其實一般的留言板也是差不多的原理喔,只是留言板是以標題為主,而我們是以商品為主。

但是我們的留言一樣有個小缺陷,就是顯示的會員是編號而不是會員名稱,是否在訂單管理後台已經解決過一次了呢,這次就交給各位讀者實現囉。


明天我們繼續。


*今天的原始碼請參考這裡




2014年10月27日 星期一

使用ASP.NET MVC 實作購物網站 (二十八) - 後台訂單列表搜尋功能

如果一天訂單有幾百筆,這下要是客戶打來問貨運進度,可就不妙了,所以我們需要一個搜尋功能。搜尋可以使用很多方法,例如客戶名稱,訂單時間,訂單狀態等,我們為講解方便
所以來完成客戶名稱搜尋吧。

今日目標:
*完成後台訂單列表的搜尋功能


1. ManageOrderController中新增SearchByUserName(),由於我們網站的使用者與訂單是兩個不同的資料庫,故我們先使用UserName搜尋出UserId後(行48~53),再至Orders表查詢該UserId的所有訂單(行57~65)。將結果丟給Index()的View (行64)

2. 打開[Views/ManageOrder/Index.cshtml],加入搜尋框與搜尋按鈕(行10~14),我們使用Form的方式將名稱為UserName的搜尋框(行12)內的值丟給ManageOrderController的SearchByUserName()執行 (行10)

3. 運行專案,點選上方的[訂單管理]

4. 此時可以看到搜尋框,我們輸入IT鐵人並按下[搜尋]按鈕

5. 可以發現購買會員為剛剛輸入關鍵的所有訂單結果都會顯示出來,可以按下[商品明細]試試看

6. 功能正常無誤

我們在後台訂單完成了一個基本的會員暱稱搜尋功能,搜尋功能其實可以有更多種,例如訂單總金額、訂單商品數量、訂單狀態(需加入欄位才可實作)等,基本原理都大同小異,就交給各位讀者依據需求去實現了。

明天我們繼續。


*今天的原始碼請參考這裡