2020年5月22日 星期五

Build GCC G++ 10.1.0 Toolchain on CentOS 7.5

Build GCC G++ 10.1.0 Toolchain on CentOS 7.5


參考來源:



# 我是以 root 登入系統
# 登入後,先更新系統

> yum -y update


# 安裝 & 更新目前的 gcc 及 其他可能會用到的套件

> yum -y install gcc gcc-c++

> yum -y install tar wget make git openssl-devel bzip2 libcurl-devel autoconf automake libtool 

# 安裝 zlib & 開發套件

> yum -y install zlib zlib-devel

#安裝 xz 壓縮工具

> yum install xz -y


修改FD_SETSIZE(非必要)

(在寫socket programming時會用select 搭配 fd_set 來偵測 file descriptor 是否可讀寫
 但Linux 系統預設的 fd_set size 只有 1024,若同時間處理的 fd 超過 1024 就會出問題
 修改下面這兩個檔案,重新 build application 時就會引用到新的 define 值)

vim /usr/include/linux/posix_types.h
   #define __FD_SETSIZE    1024 => 改65535

vim /usr/include/bits/typesizes.h
   #define __FD_SETSIZE    1024 => 改65535

或使用Sed 修改
sed -i 's/\(FD_SETSIZE\s\+\)\([0-9]\+\)/\165535/g' /usr/include/linux/posix_types.h
sed -i 's/\(FD_SETSIZE\s\+\)\([0-9]\+\)/\165535/g' /usr/include/bits/typesizes.h

#來源:

https://ftp.gnu.org/gnu/gcc/gcc-10.1.0/gcc-10.1.0.tar.xz
ftp://ftp.gnu.org/gnu/gcc/gcc-10.1.0/gcc-10.1.0.tar.xz
https://mirror.ossplanet.net/gnu/gcc/gcc-10.1.0/gcc-10.1.0.tar.gz
註:要確定抓下來的檔案沒問題,可以正確解壓,若有問題可以網上搜尋其他的載點

#抓取 gcc 10.1.0 source

> wget ftp://ftp.gnu.org/gnu/gcc/gcc-10.1.0/gcc-10.1.0.tar.xz

#解壓縮 gcc

> tar -Jxvf gcc-10.1.0.tar.xz
> cd gcc-10.1.0
> case $(uname -m) in
  x86_64)
    sed -e '/m64=/s/lib64/lib/' -i.orig gcc/config/i386/t-linux64
  ;;
esac


# 下載Build時需要的檔案

> ./contrib/download_prerequisites

2020-05-21 18:23:31 URL:http://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 [2383840/2383840] -> "./gmp-6.1.0.tar.bz2" [1]
2020-05-21 18:23:40 URL:http://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2 [1279284/1279284] -> "./mpfr-3.1.4.tar.bz2" [1]
2020-05-21 18:23:41 URL:http://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz [669925/669925] -> "./mpc-1.0.3.tar.gz" [1]
2020-05-21 18:23:47 URL:http://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2 [1658291/1658291] -> "./isl-0.18.tar.bz2" [1]
gmp-6.1.0.tar.bz2: 正確
mpfr-3.1.4.tar.bz2: 正確
mpc-1.0.3.tar.gz: 正確
isl-0.18.tar.bz2: 正確
All prerequisites downloaded successfully.


# 建立一個用來編譯GCC的資料夾

> mkdir build 
> cd build


# 依系統環境設置產生編譯 GCC 的 Makefile

> ../configure -v --build=x86_64-linux-gnu \
                --host=x86_64-linux-gnu \
                --target=x86_64-linux-gnu \
                --enable-checking=release \
                --enable-languages=c,c++ \
                --disable-multilib \
                --program-suffix=-10.1 \
                --prefix=/usr/local/gcc-10.1.0

# 或是這個設置
> ../configure --disable-multilib --enable-languages=c,c++

# 開始編譯

> make
or
> make -j4


# 等待...漫長的等待...原來是件好事...因為代表沒有出現錯誤...而中止......

# 但現實往往總是不如人願

In file included from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp:167:
../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp:1083:17: error: ‘__kernel_fd_set’ was not declared in this scope; did you mean ‘__kernel_off_t’?
 1083 | CHECK_TYPE_SIZE(__kernel_fd_set);
      |                 ^~~~~~~~~~~~~~~
../../../../libsanitizer/sanitizer_common/sanitizer_internal_defs.h:342:65: note: in definition of macro ‘IMPL_COMPILER_ASSERT’
  342 |     typedef char IMPL_PASTE(assertion_failed_##_, line)[2*(int)(pred)-1]
      |                                                                 ^~~~
../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h:1426:3: note: in expansion of macro ‘COMPILER_CHECK’
 1426 |   COMPILER_CHECK(sizeof(__sanitizer_##TYPE) == sizeof(TYPE))
      |   ^~~~~~~~~~~~~~
../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp:1083:1: note: in expansion of macro ‘CHECK_TYPE_SIZE’
 1083 | CHECK_TYPE_SIZE(__kernel_fd_set);
      | ^~~~~~~~~~~~~~~
make[4]: *** [sanitizer_platform_limits_posix.lo] Error 1
make[4]: Leaving directory `/root/gcc-10.1.0/build/x86_64-linux-gnu/libsanitizer/sanitizer_common'
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory `/root/gcc-10.1.0/build/x86_64-linux-gnu/libsanitizer'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/root/gcc-10.1.0/build/x86_64-linux-gnu/libsanitizer'
make[1]: *** [all-target-libsanitizer] Error 2
make[1]: Leaving directory `/root/gcc-10.1.0/build'
make: *** [all] Error 2

# 所以,目前還在爬文看看怎麼解決這個錯誤



# 將編好的程式安裝到系統中

> make install


2014年12月26日 星期五

3D 相關資源







http://go3d.pixnet.net/blog/post/34250539-%5B3d%E6%A8%A1%E5%9E%8B%E5%88%86%E4%BA%AB%5D-%E9%A0%82%E7%B4%9A%E4%B8%8B%E8%BC%8910%E5%80%8B%E7%AB%99%E9%BB%9E
3D 模型分享平台, 收集10 個頂級免費資源, 資源重新組合, 將創作新作品, 你收集嗎? 進入收集吧, 看書或補習, 不如自己動手組合製作~~~ http://www.3dtotal.com/ http://www.turbosquid.com/Search/Index.cfm?FuseAction=ProcessSmartSearch&istSearchKey=Free&x=19&y=11 http://www.greatbuildings.com/types/models/models.html http://archive3d.net/ http://sketchup.google.com/3dwarehouse/ http://www.3dmodelfree.com/ http://www.3dxtras.com/3dxtras-free-3d-models-list.asp?catid=-1 http://dlegend.com/html/free-3dmodels.html http://artist-3d.com/ http://www.nasa.gov/multimedia/3d_resources/

2014年8月31日 星期日

使用 Arduino 製作 溫控灑水系統 (4.元件購入及測試)

最近因為其他事情的耽擱,只能趁有空的時候看看前輩們的文章。這兩天上網購買的東西到手了,也去了電子零件行逛了一下,先買了幾樣零件。

Arduino Mega + BreadBoard + 3Digits 7 Segment LED
幸運的是找到一盒約二十年前留下來的零件(右上)

根據之前我的問題,74LS48 BCD共陰七段顯示器驅動IC 線路疑問!? 零件到手後,馬上來測試。結果,因為在7448輸出內建 2K 電阻,所以輸出電流很小,只接一顆七段顯示LED還算明亮,但像我下圖(二)測試是將三位數同時接亮,所以亮度瞬間分散,亮度也變暗很多。

下圖(一)就像方式一的接法,並聯一較小電阻來提升電流,三位七段顯示器亮度馬上提升許多。
(一)7448 接 七段顯示器,加上提升電阻,三位七段顯示器變亮許多
(二)7448 接 三位七段顯示器同時接通,亮度變暗
當然,這三位七段顯示器接到 Arduino 後,是用分時顯示的方式來各別顯示其數字,就是同時間只會有一個數字亮起,也許不需要提升電阻,到時再看看囉!!


2014年8月26日 星期二

[己解決]74LS48 BCD共陰七段顯示器驅動IC 線路疑問!?

各位大家好,網路上查了一個 7447 7448 七段顯示驅動IC,其中7447是用於共陽七段顯示器,7448則是用在共陰的。包含CD4511等這幾種IC都可以直接驅動顯示器而不需要再使用電晶體放大電路,但仍需要接電阻來限電流。

針對7448連接共陰的七段顯示器,網路上看到一個線路:
(來自這裡)

但是大部份看到是這樣的接法:
(網路上大部份接法)

想請教,第一種和第二種接法有什麼差別?? 例如耗電度,穩定度等的?
謝謝!!

以我的認知,第一種接法不會造成這七段燈號都亮起來嗎?? 然後再加上7448輸出的電壓,不就會更高電壓嗎?電流不就相加上去變更高了?? 請前輩們開釋.... XD


根據 各前輩的討論說明 後,我大致得到一個結論,這兩種接法,第一種是電阻並聯,第二種是電阻串聯。

根據 7448 的 Datasheet 內的輸出線路來看,其輸出經電晶體放大線路後有接一個 2K 的提升電阻。


因為 7448 的a~g 輸出有內建提升電阻,所以可以採用第一種並聯電阻接法,搭配適合的電阻,去計算出所希望輸出的電流。

而有些驅動IC像是上圖中的左側 74 '46A'47A 的輸出,則是經電晶體線路直接輸出Vcc的電壓,則適用第二種電阻串接接法,去限制輸出電流。

所以前輩們說的沒錯,的確得去查所使用IC的 Datasheet 才能確定其用法及特性。

補充電阻並聯的阻值計算公式:    R = (R1*R2) / (R1+R2)

以第一種例子來計算: (2000*470)/(2000+470) = 380.6

電子元件及相關查詢記錄備份

其實就是書籤,主要是最近消化跟電子元件&Arduino相關的資料,方便我查詢曾經查看過的相關網址。會不定時更新...

(74LS47, 74LS48, CD4511) BCD 七段顯示器驅動IC介紹

基本電學基礎實習(內有7447)








三位 三8 七段顯示器 接腳

2014年8月21日 星期四

使用 Arduino 製作 溫控灑水系統 (3.溫度傳感器DS18b20 消化)

上露天搜尋了 DS18b20 溫度傳感器,發現還蠻多種的,有些做成模組,有些則是單顆,還有另外一種不鏽鋼封裝的,裸裝單顆的只要25元,模組的要80~100左右,不過看了一下,以 Arduino 讀取數據似乎都是相同的流程。所以我可能會選不鏽鋼封裝型,大約60元。
DS18b20裸裝
不鏽鋼封裝

DS18b20模組
(以上圖片來自網路)
不過目前尚未購買,先來研究一下它的程式複雜性如何...

查了一下 DS18b20的程式,發現會使用到 OneWire 的 Library,但Arduino IDE 環境內並沒有預裝 OneWire 程式庫,所以又搜尋 OneWire,第一筆就是 Arduino 官網介紹,原來它是Dallas 半導體公司的產品協定,裡面有提供 Arduino OneWire Library 的下載點。

下載之後,解壓縮到 Arduino IDE 的 libraries\ 資料夾下,重啟 Arduino IDE後,就可以在選單 File→Examples→ 內看到 OneWire\ 的範例,其中 DS18x20_Temperature 就是 DS18b20 的讀取範例。

而這個範例內也有一個 連結 介紹,但這個介紹內的範例程式是有使用一個叫 DallasTemperature 的類別,有載入  DallasTemperature.h ,下方也有提供GitHub載點。除了有 .h 和 .cpp 外,還有 Examples 的範例!瞄了一下,原來這個 DallasTemperature 類別把讀取 DS18x20 溫度包裝成一個類別,這樣就比只使用 OneWire更方便使用。

以上,先到這...

補充:剛看到葉難 Arduino練習:溫度感測DS18B20 裡面都有寫到~ 哈哈!!
補充二:DS18b20 接法上 的 Normal Mode 及 Parasite Model 的區別這裡有說明,大致上是說 Normal Mode 用於數量較多且Sensor距離較遠的環境下;Parasite Mode則適用於Sensor數量少,且距離近的清況下用。至於多遠才叫遠,可以看文章內有提到!!

使用 Arduino 製作 溫控灑水系統 (2.構想)

這是此專案的 草案

基本上,想實作這個系統,一方面可以當作學習 Arduino 的相關知識,然後又不想只是測試某些模組,而是可以整合幾個模組,來達到一個特定功能。但...第一個實作,又不想系統太複雜,所以正好想到最近天氣實在太熱,樓頂屋頂如果可以加一個自動灑水系統來降溫,好像也是不錯!! 於是大概蒐集了一些資源,來慢慢完成這個功能。(雖然也許做好可能已經冬天了XD)

構想上的功能大致如下:
可以顯示目前溫度;可以顯示設定啟動/關閉灑水器的溫度上下限;可以顯示設定系統檢查頻率(例如每5分鐘抓一次溫度做檢查);可以顯示設定每次灑水器啟動時間(避免當灑水還是無法達到降溫下限時,會持續啟動)

備選功能:
可以顯示目前濕度;顯示最近 N 筆的溫度變化記錄;顯示最近N久的灑水器啟動次數
(備選功能可不做,或到主功能完成功再看看需不需要)

所以也查了大概需要的元件:

  • Arduino Uno 或 Mega(還會拿來做其他測試)開發板一塊,完成功能後再改用Mini...
  • 一個DHT11溫濕度感測器。(它是數位資料,還有濕度可以抓,先選這顆)
  • 有二位數的顯示器,可以用來顯示目前溫度、顯示設定溫度上下限(啟動灑水檢查用)...等,目前規劃使用兩個七段顯示器。
  • 上網查了一個 CD4511BE 的BCD轉七段顯示器驅動IC (可以省接腳,也可省電阻及升壓電路電晶體)
  • 有三個按鈕,一個為模式/設定切換,另外兩個為溫度上下調整鈕或上下切換鈕。
  • 5V一路的繼電器模組,用來啟動灑水器。
  • 其他電阻電容元件
  • 灑水器為一獨立系統,有一加壓馬達來把水推到管線的灑水孔。

以上就是這個系統大致的構想。所以基本上它也不一定用來啟動灑水器,也許也可以套用在以溫度控制的設備。

不知道以上的構想有沒有其他的模組或元件建議,謝謝!!

這裡有相關的資源:
DHT11  CD4511BE  四位七段顯示器測試  繼電器

CD4511 Sample





使用 Arduino 製作 溫控灑水系統 (1.草案)

最近有個計畫,就是使用 Arduino 來製作一個溫控灑水系統(系統需求還在腦袋中...)。
想說可以用來替頂樓的屋頂,加上一個灑水系統來降溫,也或許可以拿來做一些溫控的用途,也當作第一個實作。

但對於 Arduino 只屬於網路上看過模擬的階段,還沒有實作過,所以現在先開始蒐集一些網路上的資源。

除了 Arduino 官網一定要看看外,目前也加入了 Arduino.Taipei  Arduino.Taiwan的粉絲團。

網誌目前有前輩們:柯博文老師葉難Cooper Ma, Open Knowledge(知識開源共享)大兵萊恩 一路直前, 請繼續推薦...

一個創意的分享網站 Instructables,

工具的資源目前有: Fritzing , 123D Curcuit ,

還有 曹永忠 老師製作的免費 Arduino 電子書,

看到前輩們很多都是用 Frizing 來製作線路圖,所以也已經下載並安裝完成,不過才剛開始測試,有問題再請教大家。

123D Circuit 好像是 AutoDesk 公司的產品,註冊了免費帳號,測試了一下,發現這個工具還不錯,可以直接模擬運行電路的結果,而且還可以模擬執行 Arduino 程式,很好玩!! 只是不知道是免費帳號的原因,可以使用的電子元件好像不多,就...再研究囉!!
我在 123D 製作的幾個測試 線路一線路二 , 線路三 ...

目前大概整理這些資源,如果還有大家推薦,會再補上。

對於 Arduino 還有電學的設計規劃上,希望大家的建議及指導,也希望可以用實作方式來完成這個系統。線路及程式會同步分享在網誌上。


2014年8月12日 星期二

Generate QR Code by using Google Chart API

API Reference 基本上就是參考這裡:
https://google-developers.appspot.com/chart/infographics/docs/qr_codes

API Root URL 網址:
https://chart.googleapis.com/chart?

會用到的參數大致就這四個:
cht=qr //這是固定一定要的chs=<width>x<height> //產生QR Code圖的寬高
choe=UTF-8 //編碼預設定UTF-8,所以也可以不設定
chl=Hello%20world //QR Code的內容
chld=<error_correction_level>|<margin> //容錯率 預設是L(7%)也可以設定 M/Q/H
margin 是留邊,單位是QR Code的內格區塊寬度數,預設是4



比較重要的地方是:因為是以URL傳送,所以QR Code內容需要先做 URI 編碼動作,
把一些如空白或一些特殊字元轉成%XX的16進位碥碼,以避免出現錯誤的內容。
若是在 JavaScripte 中可以用 encodeURIComponent(uri); 先把內容編碼。
PHP 中則可用 string urlencode ( string $str ); 函數來編碼。

所以直接以API網址來產生QR Code的例如下(Sample URL):
https://chart.googleapis.com/chart?cht=qr&chs=200x200&chld=L|0&chl=Hello%20world


或是以 JavaScripte 來動態產生(generate by JavaScript dynamically):



補上一個網路分享的QR Code(還有Bar Code等的)解碼器(Chart Decode Tool)
http://zxing.org/w/decode.jspx

2013年12月26日 星期四

Javascript 如何檢查日期的合法性? How to check the DATE is valid in Javascript?


其實如果是用 DateTime Picker 就應該不會有這樣的需求,
但規劃是用 年 / 月 / 日 各別的下拉選單,就有可能出現像是 2月30 or 31這樣的日期。
而且如果還要自行判斷是否為閏年或是大小月就更麻煩了。

利用 Javescript 中的 Date Object 來幫忙做處理是最方便不過的。
但是 Date Object 中卻沒有 method 可以用來做日期的合法檢查。

.valueOf().getTime() 是會回傳 NaN 沒錯,但那只有在日期是超過處理範圍時才會發生。

new Date( '2005-02-31' ) 並不會被認為非法,但最後會被轉換為 '2005-03-03'

所以也正好利用這個點去檢查,是否輸入的日期是合法的。

// 傳入 年月日 檢查是否為合法日期
function validDate( _year, _month, _day )
{
  var Day = new Date( _year+ '-' + _month+ '-' + _day);
  var chk = new Date( Day.valueOf() );
  return (chk.getFullYear()==_year && (chk.getMonth()+1)==_month && chk.getDate()==_day);
}
以上

Use Javascript Date() Object to convert date-time info. But JS Date Object didn't have a method to check if the DATE is valid.

.valueOf() and .getTime() can get NaN. But it is only returned when out of DATE-TIME rang.

Date( '2005-02-31' ) will be accepted, but will be converted into '2005-03-03'.

So I can check the _year,_month &_day if the same after Date() converted.

2013年9月26日 星期四

MySQL 如何用 SELECT 查詢 產生一個自動遞增的序號欄位

因為要跑活動績分排行,而這個排行又是以某項欄位總和做排序 給績分,所以希望撈出的資料 在 SUM, GROUP 及 ORDER 後,還可以再依序給一個排行績分的欄位。

因為是持續三週的活動,且每天都有每日的績分排行(前20名的績分依序就是20,19,18...到1分),每週還有週排行,週排行就是將每個Player該週的績分加總排序即可。

所以用了一個活動資料表,來記錄每個玩家每日的績分:

CREATE TABLE `tbl_event_A` (
  `sn` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'SN',
  `playerid` int(11) unsigned NOT NULL COMMENT 'PlayerID',
  `logday` int(11) unsigned NOT NULL COMMENT '記錄日期',
  `winpoint` int(11) NOT NULL COMMENT '日總贏點數',
  `score` int(11) NOT NULL COMMENT '日績分',
  `week` tinyint(3) NOT NULL COMMENT '週次',
  PRIMARY KEY (`sn`),
  KEY `logdate` (`logday`)
) ENGINE=MyISAM;

希望從原始資料表撈出的排序資料及績分,可以在一個 Query 動作中完成,所以會需要在 Select 動作中,帶出一個有遞增績分欄位。

上網做相關的搜尋,一開始連要搜尋怎麼的關鍵詞都摸不著頭序,就一直試,後來發現搜尋 "select 查詢 自動 序號" 這樣的結果最多相關的結果。
有不少回應是 MS SQL 本身才支援的語法,像是 RANK() OVER() ROW_NUMBER() 語法,可參考 這裡

反而 MySQL 的討論不多,後來後搜尋英文 mysql select auto increment number ,才有較多的
討論。

原來是利用 MySQL 中臨時(暫時)變數的方式來做遞增,簡單範例如下:
SELECT @s:=@s+1 serial_number, student_id, student_name, student_avg
FROM students, (SELECT @s:= 0) AS s
WHERE student_avg > 4;

於是馬上就把它套用到我的查詢裡面:
SELECT @SN:=@SN+1 as Score, PlayerID, SUM(winpoint) as WinPoint 
FROM tbl_dailyplayerpoint,(SELECT @SN:=0) as Dummy 
WHERE logday='$Yesterday' 
GROUP BY PlayerID 
ORDER BY WinPoint DESC 
LIMIT 20;
試了發現的確可以產生一個遞增的欄位,但放在我的 query 中,經過 SUM, GROUP 及 ORDER BY 後,帶出的數值很奇怪,是一些很大的數字,且沒有規律。
+-------+----------+----------+
| Score | PlayerID | WinPoint |
+-------+----------+----------+
|    31 |        4 | 20441389 |
|    60 |       31 | 12158264 |
|    35 |       10 | 11551464 |
|    41 |       23 |  8594067 |
|    46 |       34 |  7555544 |
|    29 |        1 |  7475172 |
|    42 |       24 |  6409297 |
|    62 |       11 |  6393142 |
|    78 |       54 |  5791644 |
|    45 |       33 |  5757180 |
|    47 |       35 |  5689378 |
|    70 |       44 |  5649346 |
|    34 |        8 |  5590604 |
|    86 |       56 |  5470747 |
|    44 |       32 |  5289877 |
|    40 |       22 |  5080401 |
|    81 |       22 |  4591810 |
|     2 |       25 |  4446734 |
|    75 |       93 |  4431110 |
|    63 |       68 |  4430356 |
+-------+----------+----------+
於是在想,是不是因為這個臨時的變數在經過 GROUP 後,因為不同的資料量而被加總了不同次而不同,不是想像中的由小到大。

最後,經過不同的常試修改,試出了這個方式,也就是把 @SN:=@SN+1 移出原始query,把原查詢變成一個子查詢,@SN:=@SN+1放到外層,這樣 @SN 就不會受到 GROUP 的影響而產生不定數的值。
SELECT 21-(@SN:=@SN+1) as Score, PlayerID, WinPoint 
FROM (SELECT PlayerID, SUM(winpoint) as WinPoint 
      FROM tbl_dailyplayerpoint 
      WHERE logday='$Yesterday' 
      GROUP BY PlayerID 
      ORDER BY WinPoint DESC 
      LIMIT 20) as Dummy1, 
(SELECT @SN:=0) as Dummy2;
撈出的結果看來就是我想要的!!
+-------+----------+----------+
| Score | PlayerID | WinPoint |
+-------+----------+----------+
|    20 |        4 | 20441389 |
|    19 |       31 | 12158264 |
|    18 |       10 | 11551464 |
|    17 |       23 |  8594067 |
|    16 |       34 |  7555544 |
|    15 |        1 |  7475172 |
|    14 |       24 |  6409297 |
|    13 |       11 |  6393142 |
|    12 |       54 |  5791644 |
|    11 |       33 |  5757180 |
|    10 |       35 |  5689378 |
|     9 |       44 |  5649346 |
|     8 |        8 |  5590604 |
|     7 |       56 |  5470747 |
|     6 |       32 |  5289877 |
|     5 |       22 |  5080401 |
|     4 |       22 |  4591810 |
|     3 |       25 |  4446734 |
|     2 |       93 |  4431110 |
|     1 |       68 |  4430356 |
+-------+----------+----------+

於是我就可以在一個 query 中,直接撈出並新增到所建立的活動資料表中了!!
 
INSERT INTO tbl_event_A (score,playerid,winpoint,logday,week) 
SELECT 21-(@SN:=@SN+1), PlayerID, WinPoint,'$Yesterday','$week' 
FROM (SELECT PlayerID, SUM(winpoint) as WinPoint 
      FROM tbl_dailyplayerpoint 
      WHERE logday='$Yesterday' 
      GROUP BY PlayerID 
      ORDER BY WinPoint DESC 
      LIMIT 20) as Dummy1,
(SELECT @SN:=0) as Dummy2;
寫好的 PHP 用 cron table 設定每日早上跑,去產生昨天的排行!!
以上經驗,分享給大家!!