2019年11月26日 星期二

MySQL 筆數查詢、分頁查詢

N 筆資料查詢

    SELECT * FROM 成績單 LIMIT 3    // 取成績單前三筆資料
    SELECT * FROM 成績單 ORDER BY 分數 DESC LIMIT 3 // 取分數前三名的資料
    SELECT * FROM 成績單 ORDER BY 分數 DESC LIMIT 3, 7 // 取第四名到第十名的資料

分頁查詢

     隨著查詢筆數越來越多,網站可能就會需要用分頁來表示查詢結果。
     這裡會出現一個問題 Offset ( LIMIT 的第1個參數 ) 越大,查詢速度越慢。
    SELECT * FROM 成績單 LIMIT  100000, 1         // 大 Offset
     Google 的結果是 InnoDB 會有的情況,InnoDB 會掃 100001 筆資料,然會再把 100000 筆資料給捨棄,導致查詢速度越來越慢。所以解決方法為先只掃索引
    SELECT * FROM 成績單 WHERE id >= (SELECT id FROM 成績單 LIMIT 100000, 1) LIMIT 1

2019年11月15日 星期五

英文歌詞翻譯 Gryffin, Elley Duhé - Tie Me Down




Don't lie, I know you've been thinking it
別說謊了,我知道你一直很渴望
And two times, you let it slip from your lips
兩次了,你那不想讓人聽見的低語
You've got too much pride to make any promises
你有太多不必要的驕傲以致做不出任何承諾
Thinking that we got time, and you want to keep it in
覺得我們還有時間,想著先保留

I want you out in the pouring rain
想要你在傾盆大雨中
I want you down on your knees
想要跪下雙膝
Prayin' to God that I feel the same
祈禱著我跟你一樣愛著彼此
I'm right here, baby, so please
我就在這寶貝,所以請

Hold me up, tie me down
抱起我,綁住我
'Cause I never wanna leave your side
因為我永遠不想離開你
Swear to never let you down
發誓永遠不會讓你失望
And it's been eatin' me alive
這份想法正把我身吞活剝
You can take me home
你可以把我帶回家
You can never let me go
你也可以讓我永遠不離開
Hold me up, hold me up
所以抱起我,抱起我
And tie me, tie me down, down (down)
And tie me, tie me down, down
And tie me, tie me down, down (down)
And tie me, tie me down, down
綁住我

Nine lives until you fall at my feet
不顧一切直到你倒在我腳下
Don't hide, you're wasting your energy
別躲了,你是在浪費力氣
You're not shy, so baby, it's useless
你又不害羞,所以寶貝別躲了
So don't try, 'cause you'll end up losin' it
別再嘗試了,最後也只會敗在我手下

Hold me up, tie me down
抱起我,綁住我
'Cause I never wanna leave your side
因為我永遠不想離開你
Swear to never let you down
發誓永遠不會讓你失望
And it's been eatin' me alive
這份想法正把我身吞活剝
You can take me home
你可以把我帶回家
You can never let me go
你也可以讓我永遠不離開
Hold me up, hold me up
所以抱起我,抱起我
And tie me, tie me down, down (down)
And tie me, tie me down, down
And tie me, tie me down, down (down)
And tie me, tie me down, down
綁住我

So wrap your arms around my chest
用你的手抱住我吧
And I'll put my hands around your neck
我也會用我的抱住你的
'Cause nobody wins these waiting games
這場等待的遊戲是不會有贏家的
You push and you pull, but you should stay
你一下推一下拉的,但你真正該做的是留下
Stay
留下

Nine lives - Myth to typically describe cats or humans that survive shit that should have otherwise killed them. Narrowly escaping death time after time.
經過九死一生後

2019年11月14日 星期四

Python UnitTest

Unit Test


     單元測試有一個通用模式 AAA原則,理解了就可以開始實作
  • Arrange   : 初始化物件、要用到的參數
  • Act   : 呼叫要測試的方法
  • Assert   : 驗證測試結果

Python Unit Test


     unittest — Unit testing framework,下面是官方給的範例
import unittest

class TestStringMunittestethods(unittest.TestCase):

     def test_upper(self):
          self.assertEqual('foo'.upper(), 'FOO')

     def test_isupper(self):
          self.assertTrue('FOO'.isupper())
          self.assertFalse('Foo'.isupper())

     def test_split(self):
          s = 'hello world'
          self.assertEqual(s.split(), ['hello', 'world'])
          # check that s.split fails when the separator is not a string
          with self.assertRaises(TypeError):
               s.split(2)

if __name__ == '__main__':
     unittest.main()
     unittest.main() 會執行所有 test_ 開頭的 function,主要判斷的 function 是 assert
  • assertEqual - 確認是否符合期望的值
  • assertTrue、assertFalse -  確認是否符合期望的判斷
  • assertRaise - 確認是否有特定 exception raise
     接著就是執行以上這 python 檔
D:\temp\JunYe\MyPython\Python3\LeetCode\UnitTest>python3 UnitTest.py
...
----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK

D:\temp\JunYe\MyPython\Python3\LeetCode\UnitTest>
     然後就是我自己的實作,拿 LeetCode - 0736 當範例
import unittest
import Solution

class TestMethods(unittest.TestCase):

     def test_case1(self):
          # Arrange 
          testclass = Solution.Solution()
          spec = '(add 1 2)'

          # Act & Assert
          self.assertEqual(testclass.evaluate(spec), 3)

     def test_case2(self):
          # Arrange 
          testclass = Solution.Solution()
          spec = '(mult 3 (add 2 3))'

          # Act & Assert
          self.assertEqual(testclass.evaluate(spec), 15)
     
     def test_case3(self):
          # Arrange 
          testclass = Solution.Solution()
          spec = '(let x 2 (mult x 5))'

          # Act & Assert
          self.assertEqual(testclass.evaluate(spec), 10)

if __name__ == '__main__':
     unittest.main()



參考資料 : 

  1. https://docs.python.org/3/library/unittest.html
  2. http://www.codedata.com.tw/python/python-tutorial-the-6th-class-1-unittest

2019年11月13日 星期三

Python List.pop(0)

Python list.pop(0)


     python 的 list 為 dynamic array,python.pop() default 值為 -1
  • python.pop()     # 時間複雜度 : O()
  • python.pop(0)   # 時間複雜度 : O(n)

Python deque.popleft()


     deque = double - ended - queue,deque.popleft() 的時間複雜度為 O(1)

     所以當變數為 list 且頻繁地操作 pop(0),不妨考慮
     tokens = collections.deque(mylist)
     x = tokens.popleft()


參考資料 : https://stackoverflow.com/questions/32543608/deque-popleft-and-list-pop0-is-there-performance-difference

2019年11月11日 星期一

讀書心得 - Clean Code - Chapter 2

Chapter 2 - 有意義的命名

使之名符其實

     選一個好的名稱很花時間,但省下的時間更多。
    // 沒命名
    public List<int[]> getThem(){
        List<int[]> list1 = new ArrayList<int[]>();
        for (int[] x : theList)
            if (x[0] == 4)
                list1.add(x);
        return list1;
    }
    // 有命名
    public List<int[]> getFlaggedCells(){
        List<int[]> flaggedCells = new ArrayList<int[]>();
        for (int[] cell : gameBoard)
            if (cell[STATUS_VALUE] == FLAGGED)
                flaggedCells.add(cell);
        return flaggedCells;
    }
     有命名的參數也比較好找,STATUS_VALUE 和 FLAGGED。

類別的命名

     使用名詞或名詞片語
  • Account
  • AddressParser
  • Customer
  • WikiPage
     避免以下之命名
  • Manager
  • Data
  • Info

方法的命名

     使用動詞或動詞片語
  • deletePage()
  • save()
  • 取出器 - getXX()
  • 修改器 - setXX()
  • 判定器 - isXX()

2019年11月6日 星期三

讀書心得 - Clean Code - Chapter 1

Chapter 1 - 無暇程式碼

讓開發速度變快唯一方法


     寫爛程式碼去趕截止日期並不會加快開發,只會越來越慢。唯一方法就是隨時隨地使程式碼保持潔淨。想說寫爛程式碼先應急後來再回頭改的,勒布朗克法則 ( LeBlanc's law ) : 待會兒等於永不。( 深感認同... )

大師們的 Clean Code

  • 優雅又有效率,邏輯直接了當,程式相依性低                         -     Bjarne Stroustrup
  • 像一篇優美的散文,不會掩蓋設計者的意圖                             -     Grady Booch
  • 包含單元測試與驗收程式,使用有意義的名稱                         -     Dave Thomas
  • 一定是由某位重視且照料的人所撰寫                                         -     Micheal Feathers
  • 當程式碼讓程式語言看起來就像是為了解決問題而存在的     -     Ward Cunningham

我們是作者


     「 有作者,就有讀者 」,要與讀者有良好的溝通是作者的責任。

童子軍規則


     離開營地前,讓營地比使用前更乾淨。

下一篇:
讀書心得 - Clean Code - Chapter 2

2019年11月5日 星期二

Windows Command Line

CMD : Command Line

列出檔案

     dir                            // 列出當前資料夾下的檔案
     dir /s                         // 列出當前資料夾下 + 子資料夾的檔案
     dir /?                         // 列出所有 dir 的指令參數

輸出成檔案

     dir /? > 123.txt               // 輸出成 123.txt

檔案名稱有空格

     net share "共用 資料夾名稱"     // 用雙引號,不能用單引號

參考資料 : 1. https://www.csie.ntu.edu.tw/~r91112/myDownload/WEB/CMD.html
                   2. https://www.itread01.com/content/1543219938.html

Popular Posts