Total Pageviews

2016/04/06

[Java Mail] com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first.

Problem
I am using gmail as my testing mail server to test Java Mail code.
Here is my test code:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

public class MailTest {

    public static void main(String[] args) {

        String host = "smtp.gmail.com";
        int port = 587;
        String userName = "xxx";
        String password = "xxx";

        String mailTo = "xxx@gmail.com";
        String subject = "Hello my friend~";

        JavaMailSenderImpl sender = new JavaMailSenderImpl();
        sender.setHost(host);
        sender.setPort(port);
        sender.setUsername(userName);
        sender.setPassword(password);

        MimeMessage message = sender.createMimeMessage();
        MimeMessageHelper helper;
        try {
            helper = new MimeMessageHelper(message, true);
            helper.setTo(mailTo);
            helper.setSubject(subject);
            helper.setText("test test");
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }

        sender.send(message);
    }
}

But as I run this test code, it throw exception as bellows:
1
2
3
4
5
6
7
8
9
com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. wb7sm14621901pab.3 - gsmtp

 at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2108)
 at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1609)
 at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1117)
 at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:448)
 at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:345)
 at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:340)
 at albert.practice.mail.MailTest.main(MailTest.java:52)


How-to
We need to enables the use of the STARTTLS command to switch the connection to a TLS-protected connection before issuing any login commands. 

Therefore, the source code would be modified as following:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.util.Properties;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

public class MailTest {

    public static void main(String[] args) {

        Properties props = new Properties();
        props.put("mail.smtp.starttls.enable", "true");

        String host = "smtp.gmail.com";
        int port = 587;
        String userName = "xxx";
        String password = "xxx";

        String mailTo = "xxx@gmail.com";
        String subject = "Hello my friend~";

        JavaMailSenderImpl sender = new JavaMailSenderImpl();
        sender.setJavaMailProperties(props);
        sender.setHost(host);
        sender.setPort(port);
        sender.setUsername(userName);
        sender.setPassword(password);

        MimeMessage message = sender.createMimeMessage();
        MimeMessageHelper helper;
        try {
            helper = new MimeMessageHelper(message, true);
            helper.setTo(mailTo);
            helper.setSubject(subject);
            helper.setText("test test");
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }

        sender.send(message);
    }


Test successful !

Reference
[1] http://stackoverflow.com/questions/17581066/using-javamail-with-a-self-signed-certificate

2016/04/05

[Python] How to do sorting in Python

Assume I have a Player Class as bellows:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
'''
Created on 2016/2/3

@author: albert
'''
class Player:
    def __init__(self, team, name, position):
        self.Team = team
        self.Name = name
        self.Position = position
    
    def ToString(self):
        return 'team:' + self.Team + ', name:' + self.Name + ', position:' + self.Position


Here has the code snippet which include add players into list, print players before sort, print players after sorted by player's position and name:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from com.cht.Player import *
from operator import attrgetter

''' defined a list of Players'''
players = [
           Player('Lamigo', '陳 金 鋒', '指定代打'),
           Player('Lamigo', '林 柏 佑', '投手'),
           Player('中信兄弟', '彭 政 閔', '一壘手'),
           Player('統一7-ELEVEn', '高 志 綱', '捕手'),
           Player('義大犀牛', '林 晨 樺', '投手'),
           Player('統一7-ELEVEn', '陳 鏞 基', '游擊手'),
           Player('Lamigo', '王 柏 融', '左外野手'),
           Player('義大犀牛', '胡 金 龍', '指定打擊'),
           Player('統一7-ELEVEn', '王 鏡 銘', '投手')
           ]

''' print the list of players before sorted'''
print('\n [before sorted] ')
for player in players:
    print(player.ToString())

''' sort players and position and name '''
sortedPlayers = sorted(players, key=attrgetter('Position', 'Name'), reverse=False)
print('\n [after sorted] ')

''' print the list of players after sorted'''
for player in sortedPlayers:
    print(player.ToString())

The log will print as following:
 [before sorted] 
team:Lamigo, name:陳 金 鋒, position:指定代打
team:Lamigo, name:林 柏 佑, position:投手
team:中信兄弟, name:彭 政 閔, position:一壘手
team:統一7-ELEVEn, name:高 志 綱, position:捕手
team:義大犀牛, name:林 晨 樺, position:投手
team:統一7-ELEVEn, name:陳 鏞 基, position:游擊手
team:Lamigo, name:王 柏 融, position:左外野手
team:義大犀牛, name:胡 金 龍, position:指定打擊
team:統一7-ELEVEn, name:王 鏡 銘, position:投手

 [after sorted] 
team:中信兄弟, name:彭 政 閔, position:一壘手
team:Lamigo, name:王 柏 融, position:左外野手
team:義大犀牛, name:林 晨 樺, position:投手
team:Lamigo, name:林 柏 佑, position:投手
team:統一7-ELEVEn, name:王 鏡 銘, position:投手
team:Lamigo, name:陳 金 鋒, position:指定代打
team:義大犀牛, name:胡 金 龍, position:指定打擊
team:統一7-ELEVEn, name:高 志 綱, position:捕手
team:統一7-ELEVEn, name:陳 鏞 基, position:游擊手


Assume I have a number array, string array, datetime array, I would like to sort by ascendant and descendant. 

Here is the code snippets for utility class:
1
2
3
4
5
6
7
''' reverse=False means sort by ascendant '''        
def sortArrayByAsc(dataArray):
    return sorted(dataArray, reverse=False)

''' reverse=True means sort by descendant '''
def sortArrayByDesc(dataArray):
    return sorted(dataArray, reverse=True)


Test the number array:

1
2
3
4
5
6
7
numberArray = [6, 3, 1, 2, 4, 5]
print('\n Original integer array:')
print(numberArray)
print('Sort integer array by asc:' )
print(utils.sortArrayByAsc(numberArray))
print('Sort integer array by desc:' )
print(utils.sortArrayByDesc(numberArray)) 

Test result:
 Original integer array:
[6, 3, 1, 2, 4, 5]
Sort integer array by asc:
[1, 2, 3, 4, 5, 6]
Sort integer array by desc:
[6, 5, 4, 3, 2, 1]


Test the string array:
nameArray = ['Albert', 'Mandy', 'Fiona', 'Ben', 'Jules']
print('\n Original string array:')
print(nameArray)
print('Sort string array by asc:' )
print(utils.sortArrayByAsc(nameArray))
print('Sort string array by desc:' )
print(utils.sortArrayByDesc(nameArray))

Test result:
 Original string array:
['Albert', 'Mandy', 'Fiona', 'Ben', 'Jules']
Sort string array by asc:
['Albert', 'Ben', 'Fiona', 'Jules', 'Mandy']
Sort string array by desc:
['Mandy', 'Jules', 'Fiona', 'Ben', 'Albert']


Test the datetime array:
import datetime
datetime1 = datetime.datetime.strptime('2015-11-11 10:10:10', '%Y-%m-%d %H:%M:%S')
datetime2 = datetime.datetime.strptime('2014-01-11 12:00:00', '%Y-%m-%d %H:%M:%S')
datetime3 = datetime.datetime.strptime('2016-02-17 11:22:00', '%Y-%m-%d %H:%M:%S')
datetimes = [datetime1, datetime2, datetime3]
print('\n Original datetime array:')
print(datetimes)
print('Sort datetime array by asc:' )
print(utils.sortArrayByAsc(datetimes))
print('Sort datetime array by desc:' )
print(utils.sortArrayByDesc(datetimes))

Test result:
 Original datetime array:
[datetime.datetime(2015, 11, 11, 10, 10, 10), datetime.datetime(2014, 1, 11, 12, 0), datetime.datetime(2016, 2, 17, 11, 22)]
Sort datetime array by asc:
[datetime.datetime(2014, 1, 11, 12, 0), datetime.datetime(2015, 11, 11, 10, 10, 10), datetime.datetime(2016, 2, 17, 11, 22)]
Sort datetime array by desc:
[datetime.datetime(2016, 2, 17, 11, 22), datetime.datetime(2015, 11, 11, 10, 10, 10), datetime.datetime(2014, 1, 11, 12, 0)]


Test the unique list:
names = ['Albert', 'Mandy', 'Mandy', 'Fiona', 'Ben', 'Jules']
print('\n Original name array:')
print(names)
print('Unique name array:')
print(utils.removeDuplicateInList(names))

Test result:
 Original name array:
['Albert', 'Mandy', 'Mandy', 'Fiona', 'Ben', 'Jules']
Unique name array:
['Fiona', 'Ben', 'Mandy', 'Jules', 'Albert']




2016/04/04

[Python] Using Pickle to read/write file

Using pickle is straightforward: import the required module, then use dump() to save your data and, some time later, load() to restore it. 

The only requirement when working with pickled files is that they have to be opened in binary access mode

Here is the code snippet:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
''' utilize pickle to write data into file '''
def writeFileWithPickle(path, file, data):
    pickle.dump(data, open(path + '/' + file, 'wb'))

''' utilize picke to read data from file '''
def readFileWithPickle(path, file):
    return pickle.load(open(path + '/' + file, 'rb'))

''' utilize pickle to append data to existing file '''
def appendDataWithPickle(path, file, data):
    try:
        with open(path + '/' + file, 'rb') as fileObject:
            list = pickle.load(fileObject)
            for item in data:
                list.append(item)
            writeFileWithPickle(path, file, list)
    except pickle.PickleError as err:
        print('Fail to append data. Error:' + str(err))
    finally:
        if 'fileObject' in locals():
            fileObject.close()


Reference
[1] http://pythontips.com/2013/08/02/what-is-pickle-in-python/


2016/04/03

[Python] Install Python IDE for Eclipse


PyDev is a plugin that enables Eclipse to be used as a Python IDE (supporting also Jython and IronPython).

It uses advanced type inference techniques to provide features such code completion and code analysis, while still providing many others such as a debugger, interactive console, refactoring, etc.
- See more at: https://marketplace.eclipse.org/content/pydev-python-ide-eclipse#sthash.0052eVTc.dpuf

Here is the installation steps:
1. Open Eclipse
2. Help => Install new software


3. Click Add button


4. Fill in name and location, then click OK button


5. Check PyDev and click Next button


6. Click Next


7. Choose I accept option and click Next button




After install PyDev plugin, you need to restart your Eclipse

8. Configure Intercepter in preference


9. Choose the interpreter you have installed in your computer



Create a PyDev Module
1. create a new PyDevProject


2. Fill in project name, and choose Grammar version & intercepter


3. Create a utility module which name myUtils


The python code is as bellows:
'''
Created on 2016年1月24日

@author: albert
'''
def printHelloMessage(name):
    print('Hello! ' + name)
    
def addTwoNumbers(num1, num2):    
    return num1 + num2

4. Create another test client module to call myUtils





The python code is as following:
'''
Created on 2016年1月24日

@author: albert
'''
from utils import myUtils

if __name__ == '__main__':
    myUtils.printHelloMessage("Albert")
    
    print(myUtils.addTwoNumbers(10, 20))

Here is the test result:

2016/04/02

[閱讀筆記] 圖解國富論 Part 1



  1. 自利(self-love)原則:經濟人活動的主要動力是個人利益 (自利),而要滿足個人利益,只能透過和別人交換服務 (滿足自己也滿足他人)。人的自利行為就是個人對自身利益的追求過程,在『看不見的手』的指引下,經濟人追求自身利益的最大化的過程中,也促進社會公共利益的增長
  2. 承認自利,尊重他利,發展互利,建構了整個西方經濟學經濟發展原則的基礎
  3. Adam Smith認為,一切特惠或限制的制度,一經完全廢除,最單純的自然自由制度就會建立起來。
  4. 所謂的自由,是指不損害他人自由的所有人的自由,才是具有真正意義的自由主義。
  5. 財產權是一種具有排他性的所有權,它規定了對於物質財富的私人所有權。經濟學家認為,窮人一直佔多數的原因在於窮人的財產權沒有受到保護,故到20世紀,由於窮人的私有財產權受到嚴格的保護,歐美國家才出現數量占絕對優勢的中產階級
  6. 財富分配不均乃是政府產生的真正原因,為了保護財產權,有必要成立政府,建立公正的法律
  7. 哪裡有大宗財產存在,哪裡就有大量不平等存在。因此,大宗財產的獲得,必然要有公民政府的建立
  8. 社會有責任為窮人提供能夠據以『改善它們現況』的社會福利制度
  9. 社會要保證,每個人的致富機會是均等的,競爭的規則是公平的
  10. 由於每個人的地位、財富、社會關係、所受的教育不盡相同,就算處於公平的制度下,每個人追求自我利益的社會必定是弱肉強食的社會,並產生階級的對立。假如社會制度不公平,那麼弱肉強食的狀況會更嚴重
  11. 馬太效應,用來形容貧者越貧,富者越富的現象,又比喻為滾雪球,如果你是幸運的人,你的雪球會越滾越大
  12. 看不見的手:只有在完全自由市場才會出現。在自由市場中,買賣雙方的活動都在自動自發地將市場價格推向均衡價格,讓買賣雙方獲得最大滿足
  13. 自由競爭的市場能夠在無意中促進經濟福利與發展。競爭創造了低價、高需求、更多的就業和經濟發展,進而提高工資與充分就業,這一切都是看不見的手所推動,一切是無意識的
  14. 人只有在社會中才能生存,他生來就是和在塑造他的環境中生活。人類社會的所有成員都需要互相幫助,但也面臨彼此互相傷害
  15. 企業生產什麼產品或提供什麼服務,取決於消費的需求及其利潤
  16. 市場競爭必然促使企業提高生產力,使社會生產力不斷地向前發展
  17. 工作經過分工後,生產率比原來沒有分工時提高了數十倍。故凡生產力程度較高的國家,其分工程度也達到了一定的高度
  18. 勞動是衡量實質價格的唯一標準;商品的名目價格則是用貨幣衡量的
  19. 分工的產生是由交換而引起的,所以分工的範圍必然是受到交換能力的限制
  20. 一個人是富有還是貧窮,必然根據他所能支配或購買得起它們的勞動數量來決定
  21. 商品的實質價格以勞動價值來表示,它是一切商品交換價值的實質尺度,但由於商品更多是用來和其他商品進行交換,所以貨幣表示的名目價格則更為常見
  22. 世界上物價和工資總是在持續增長,溫和的物價和工資上漲是經濟常態
  23. 土地私有化後,商品價格多半由地租、工資、利潤三者組成,如穀物價格中,一部分用來支出給地主的地租,一部分用來支出勞動者的公司,另外一部分就是農場業主的利潤
  24. 商品的自然價格等於地租+勞動工資+資本利潤。商品的自然價格是固定的,而其市場價格則受到供應量的影響而左右其價格變動。
  25. 市場像水一樣,使生產流向具有低成本優勢的企業,淘汰生產成本太高的企業;市場又像火一樣,把物品送到對它評價最高的消費者面前(願意花比較多錢購買的消費者),忽略對他評價較低的消費者
  26. 在既定的市場價格下,工資的高低必定受制於資本利潤和地租
  27. 只有當國家的收入和資本存量增加時,對勞動力的需求才會增加,工資才能增長
  28. 最高的勞動工資不是出現在最富有的地區,而是出現在發展最快的地區,因為人力供不應求
  29. 當國家的經濟出現停滯或衰退,工資就很難增長,甚至會衰退
  30. 工資與物價的比例一旦失衡,生育、醫療、教育等諸多問題也會接踵而至

2016/04/01

[閱讀筆記] 你還在努力省錢來投資理財嗎? Part1


  1. 如果某樣商品複雜又難以理解,你很可能根本不該投資
  2. 儲蓄和投資的基本原則很容易學,但不代表我們就學會了
  3. 人生無常,不會永遠照我們想像的方式運作
  4. 超級富豪與平凡人的鴻溝越來越大,你根本無法靠投資來縮小差距。撇開少數福星高照的dot com百萬富豪不談,股市和房市並非許願池,並沒有點石成金的能力
  5. 幾乎沒有人注意到,我們在指望靠個人理財、房地產和股市來修正長期經濟弊病。促使我們欣然接受用自助理財的方法來解決社會問題。然而,這種自助不求人的理財中心思想是:I can do it
  6. 上電視的理專需要建立權威性來吸引我們注意,讓我們相信唯有他們真的握有正確解答。如果他們真的知道答案,我們會不再需要他們,進而終止與他們的業務往來。所以,我們獲得的建議大多不可信與不可行
  7. 我不是主張所有財務建議都沒有用,重點是理解及掌控我們的財富,從事自主性的理財活動
  8. 金融業不斷售予一個夢想給大眾:個人理財具有魔力,可以補救停滯的薪水、貧富所得不均,和一年不如一年的社會福利
  9. 我們絕大多數人的薪資跟不上經濟趨勢,先是遭逢通貨膨脹的重擊,再面臨所得M型化,所得最高階層與普羅大眾的差距越拉越遠,我們完全陷入停滯
  10. 從1979到2007年,美國經濟前1%所得者的稅後收入暴增281%,前20%的人所得增加95%,正中間的1/5僅僅增加25%
  11. 小心諸如財星、財智、華爾街日報、紐約時報等等出版品的內文和廣告,其內文吹捧了哪些共同基金的場,就找得到那些基金的廣告
  12. 人必須先找到錢,才能投資,然而這對一般美國人而言,都成問題
  13. 美國的階級流動性明顯低於社會階級分明的歐洲,根據研究顯示,生於美國資產底層1/5家庭的小孩,成年後擠身前40%的機會不到20%
  14. 花錢的問題在於會減少我們的儲備金,但他並非財務不幸的根本原因。長久而言,花兩塊美金買拿鐵會積少成多。但那不是直接因素,主因結合了昂貴的醫療費用、失業等
  15. 財務不幸的真正問題在於固定成本,也就是難以削減的事物,2000年代,住屋、醫療和教育費用佔了一般家庭可自由支配所得的75%,在1973年是50%
  16. 以美國為例,醫療服務的成本繼續以高於通膨率的速度增加,健保的價格在2001至2011年之間漲了一倍。21世紀的第一個十年,養小孩的成本增加40%。上大學的成本也大增,加州大學2010~2011年一學期的學費,較上學期增加302%,但是這段期間的通貨膨脹率微乎其微
  17. 研究證實,如果你要上破產法庭,最快的辦法不是買台最新款的蘋果電腦,而是透過醫療支出
  18. 把破產描繪成道德敗壞,並不符合美國的真實生活,公司倒閉、健保費用漲翻天,社會安全網有等於沒有。
  19. 退休試算公式的侷限是:他無法幫你存錢。你為什麼不能存錢不重要,你可能沒有未雨綢繆,你可能出錢讓孩子唸大學,你可能環遊世界把錢花光,你可能生病或失業。當你需要付帳時,什麼都不成理由
  20. 我們每一個人,無論是年輕的、中年或年長的美國人,都必須應付在滿足今日與明日需求之間,持續不斷的掙扎。該買電腦或省下來存第一棟房屋的頭期款。不幸的,隨著這十年實質薪資長期減少,這種掙扎又變得更加困難