2016年4月17日 星期日

[Django] 利用 Gmail 發送 email

由於專案上的功能,必須透過 Django 發送 email 給予前端使用者。不打算自行架設郵件伺服器的前提下,利用 Gmail 進行發送成為解決方案的首選!以下將介紹如何利用 Django + Gmail 發送郵件:

首先,對 Django settings 加入以下設定:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'YOUR GMAIL ACCOUNT'
EMAIL_HOST_PASSWORD = 'YOUR GMAIL PASSWORD'
EMAIL_USE_TLS = 'True'
EMAIL_POST = '587'


接著,就可以透過以下兩種不同程式寫法進行郵件的發送。

方法一:透過 send_mail() 發送

from django.core.mail import send_mail

send_mail('Subject here', 'Here is the message.', 'from@example.com', ['to@example.com'], fail_silently=False)


方法二:透過 EmailMessage 類別發送

from django.core.mail import EmailMessage

email = EmailMessage('Hello', 'Body goes here.', 'from@example', ['to@example.com', 'to2@example.com'], ['bcc@example.com'])

email.send()


就是這麼簡單即可透過 Django 發送 email 惹!

2016年3月31日 星期四

[Python] datetime.time 物件進行時間相加的問題筆記

最近在開發 Python 的時候,遇上一件相當惱人的事情,那就是‧‧‧

該如何對 datetime.time 物件進行時間相加的動作?


曾經嘗試過:

>>> datetime.time(1, 2, 3) + 1
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'int'.

>>> datetime.time(1, 2, 3) + datetime.timedelta(0, 1)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'

>>> datetime.time(1, 2, 3) + datetime.time(0, 0, 1)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.time'

正當困惑之時,經由谷歌大神指點,發現可以這麼做‧‧‧

1. 先把 datetime.time 轉為 datetime.datetime

>>> import datetime
>>> dt = datetime.datetime.combine(datetime.date.today(), datetime.time(1, 2, 3))

2. 再運用 datetime.timedelta 進行時間相加

>>> dt += datetime.timedelta(0, 1)

3. 最後,取得 datetime 物件中 time 的部分,即為所求。

>>> print dt.time()
01:02:04

2016年3月23日 星期三

[Python] os.path.join(path, *paths) 的問題筆記

今天在撰寫 Python os.path.join(path, *paths) 時遇到一個奇怪的問題:

不管如何 JOIN,所顯示的結果永遠是後面的路徑!


讓我們用下列程式碼做說明:

>>> import os
>>> a = 'path/to/a'
>>> b = '/path/to/b'
>>> print os.path.join(a, b)
/path/to/b


經過一段時間的實驗與偵錯,發現問題出在於 b = '/path/to/b'

原來,os.path.join(a, b) 的 b 不可接受 '/path/to/b' 的這種形式!

以下為實驗結果:

(1) 成功
>>> import os
>>> a = '/path/to/a'
>>> b = 'path/to/b'
>>> os.path.join(a, b)
/path/to/a/path/to/b


(2) 成功
>>> import os
>>> a = 'path/to/a/'
>>> b = 'path/to/b'
>>> os.path.join(a, b)
path/to/a/path/to/b


(3) 成功
>>> import os
>>> a = 'path/to/a'
>>> b = 'path/to/b/'
>>> os.path.join(a, b)
path/to/a/path/to/b/

2016年2月22日 星期一

[Mac, OS X 10.11, Django] 在 OS X 10.11 上安裝 Django 1.8 (How to install Django 1.8 on the OS X 10.11)

  先前曾經介紹如何在 Server 端安裝 Django。不過,身為一位行動開發者,並非永遠身處在擁有網路的環境裡。因此,在 Client 端準備開發環境,並進行不同解決方案的實驗是相當重要的一環。

  筆者所使用的電腦為 Macbook Pro,因此今天要向大家介紹如何在 Mac 上安裝 Django

STEP 1
  Django 是 Python 的 web framework 之一。因此在安裝 Django 之前,必須先安裝 Python。只不過在 OS X 10.11 已內建 Python 2.7,所以我們不需要進行任何的下載與安裝。

STEP 2
  由於在開發的過程中,可能需要安裝許多的套件。也經常發生套件版本更動後,造成原先可運作的內容出現錯誤。因此,在 Client 端我們將安裝虛擬環境 (virtualenv) 來避免類似問題以及協助進行不同解決方案的實驗。
  虛擬環境 (Virtualenv) 是創造虛擬 Python 環境的工具。它可以幫你做到:
1. 在沒有權限的情況在安裝新套件
2. 不同專案可以使用不同版本的相同套件
3. 套件版本升級時不會影響其他專案

  安裝的方式相當簡單:$ easy_install virtualenv

STEP 3
  在安裝完 virtualenv 後,我們將建立並啟動虛擬環境。

建立虛擬環境:
$ virtualenv 【指定虛擬環境的名稱】

啟動虛擬環境:
$ cd 【指定虛擬環境的名稱】
$ source bin/activate

若啟動成功,將看到 (【指定虛擬環境的名稱】) ... $

補充:若要關閉虛擬環境,則需鍵入 $ deactivate

STEP 4
  在啟動完虛擬環境後,我們將在此環境運用 pip 安裝 Django。
 (【指定虛擬環境的名稱】) ... $ pip install Django = 1.8.X (LTS 版本)

如此一來,將完成 Django 的安裝,並可在不同的虛擬環境中進行不同的實驗。

2016年2月3日 星期三

[Django] 在 Django 1.8.8 上設定 MySQL

前言:

        最近因為某些需求,必須建立一 Django 專案。此專案的資料庫,筆者選定 MySQL,因此本文將簡介如何在 Django 1.8.8 設定 MySQL。

步驟:(以 Ubuntu 14.04 為例)

        1. 安裝 MySQL(Django 1.8.8 支援 MySQL 5.5 以上的版本)
            $ sudo apt-get install mysql-server

        2. 為了讓 MySQL 可在 Django framework 運作,必須安裝 DB API driver
            $ sudo apt-get install python-mysqldb
            $ sudo pip install MySQL-python

        3. 接著,登入 MySQL 並在其中建立新的 Database
            $ mysql -u YOUR MYSQL ADMIN -p YOUR MYSQL ADMIN PASSWORD
         
            > CREATE DATABASE database_name;

        3. 接著,打開 Django 專案中的設定檔(settings.py)
            $ vi Path/to/your/Django/project/settings.py

        4. 開始修改 DATABASES
            DATABASES = {
          'default' : {
             'ENGINE' : 'django.db.backends.mysql',
             'NAME' : 'database_name',
             'USER' : 'YOUR MYSQL ADMIN',
             'PASSWORD' : 'YOUR MYSQL ADMIN PASSWORD',
             'HOST' : '', # Default is localhost or 127.0.0.1
             'PORT' : '', # Default is 3306
          }
      }


       5. 最後輸入 $ python manage.py migrate 就完成 MySQL 的設定囉!

2016年1月30日 星期六

[Ubuntu, Git] 在 Ubuntu 14.04 上安裝 Git server

前言:

        最近因為某些需求,必須在安裝 Git 伺服器。由於對 Ubuntu 較為熟悉,因此選擇在此 distribution 上安裝。

安裝前的準備:

        1. 一台已安裝好的 Ubuntu 伺服器(我選擇 Ubuntu 14.04 LTS)
        2. 在安裝 Ubuntu 的過程中選擇 ssh 或透過 apt-get 安裝

步驟:

        1. 安裝 Git
            $ sudo apt-get install git git-core

        2. 確認 Git 版本(Ubuntu 14.04 內建 1.9.1)
            $ git --version

        3. 在 server side 建立新專案
            $ cd Path/to/your/git
            $ sudo mkdir new_project.git
            $ cd new_project.git
            $ sudo git --bare init

        4. 如果要用 ssh 存取 Git server,則每一個要存取的人都必須要是這台 linux 的帳號。為了方便,我們將建立一個群組,將所有要存取 Git 的人加入。
            $ sudo groupadd git
            $ sudo user mod -a -G git [YOUR ACCOUNT]
            $ sudo chgrp -R git Path/to/your/git
            $ sudo chmod -R 777 Path/to/your/git

        5. 在 client side,我們可以 clone 一個 repository 下來
            $ git clone ssh://YOUR ACCOUNT@GIT SERVER IP:Path/to/your/git/new_project.git

            最後輸入密碼,就確定 Git server 安裝大功告成!

2014年6月10日 星期二

[C#] 利用 BackgroundWorker 實作 multi-thread

  最近筆者在開發 In-house 應用程式 (application) 時,需監聽某一個處理程序 (process) 是否結束。若將監聽的 while 迴圈寫在主程式,將導致主程式會 HANG 在那裡。經由與同事討論後,發現必須將監聽的程式碼另外執行於新的執行緒 (thread) 上,方可避免主程式 HANG 住的問題。

  一開始,筆者使用 Thread。此方法雖可將監聽的部分另起,但若此執行緒已運行完畢,並無法通知主程式「我」已經結束。經由 google,發現可利用 BackgroundWorker 類別解決上述問題。下面為實作面的紀錄:

首先,必須載入 (import)

System.ComponentModel;

接著,於主程式中宣告物件 (object)

BackgroundWorker bw = new BackgroundWorker();

對物件 bw 進行設定

bw.DoWork += new DoWorkEventHandler(DoWork);
bw.RunWorkerCompletedEventHandler += new RunWorkerCompletedEventHandler(RunWorkerCompleted);


實作 Event Handle 函式

DoWork(object sender, DoWorkEventArgs e)
{
    // 於背景啟動此執行緒時的工作
}

RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // 當此執行緒運行完畢時的工作
}




  當然,解決方案不僅僅如此一種。只不過,這是我實際成功的方式,藉由部落格與各位分享!如有更佳的解決方案,歡迎提出討論。

參考資料:MSDN