俐媽真的有好多貴人學生☺️☺️
念大學的學姊寫訊息給俐媽,感謝我當初在英模班教pillar及beam,她在學校的室內設計課程中立馬看見!
俐媽趁機向她邀稿「室內設計餐」,沒想到學姊爽快答應😃😃 實在太感謝了!
——————————————————
🏗 俐媽英文教室—室內設計篇:
🏡 interiot (n.) 室內的
—> interior designer (n.) 室內設計師
🏡 architect (n.) 建築師
—> architecture (n.) 建築學;結構
🏡 structure (n.) 結構
🏡 decoration (n.) 裝飾 (DECO)
🏡 flow (n.) 動線
🏡 site (n.) 基地
🏡 function (n.) 機能
🏡 layout (n.) 配置
🏡 scale (n.) 比例
🏡 floor (n.) 地板
🏡 ceiling (n.) 天花板
🏡 curtains (n.) 窗簾
🏡 pillar (n.) 柱
—> column (n.) 圓柱
🏡 beam (n.) 樑
🏡 facility (n.) 設備
🏡 A/C = air-conditioning (n.) 空調
🏡 lighting (n.) 燈光
🏡 switch (n.) 開關
🏡 furniture (n.) 家俱
【繪圖】
🏡 drawing (n.) 圖面
🏡 plan (n.) 平面圖
🏡 section (n.) 剖面圖
cf. elevation (n.) 立面圖
🏡 perspective (n.) 透視圖
🏡 concept (n.) 概念 = main idea
🏡 diagram (n.) 圖解;圖示
🏡 space planning (n.) 空間配置
🏡 reflected ceiling plan (n.) 天花圖
🏡 render (rendering) (v.) 渲染
🏡 socket plan (n.) 燈光配置圖
【繪圖工具】
🏡 architect’s scale (n.) 比例尺
🏡 liner pen (n.) 代針筆
🏡 tracing paper (n.) 草圖紙
🏡 self healing cutting mat (n.) 切割墊
🏡 retractable knife (n.) 美工刀
🏡 circles template (n.) 圈圈板
🏡 LED light box (n.) 光桌
🏡 technical mechanical pencil (n.)工程筆
🏡 rotary action lead pointer (n.) 磨蕊器
🏡 drafting board (n.) 圖桌
————————————————
有良好的室內設計,家的機能就更健全了!
感謝學姊的貢獻!
.
#俐媽英文教室 #俐媽英文教室室內設計篇 #interiordesign #interiordesigner #interiordecorating #interior_design #interiors
同時也有1部Youtube影片,追蹤數超過12萬的網紅prasertcbs,也在其Youtube影片中提到,ดาวน์โหลดไฟล์ตัวอย่างได้ที่ https://goo.gl/76rwE8 เชิญสมัครเป็นสมาชิกของช่องนี้ได้ที่ ► https://www.youtube.com/subscription_center?add_user=prasertc...
function pointer 在 Taipei Ethereum Meetup Facebook 的最讚貼文
📜 [專欄新文章] 智能合約 Storage 注意事項
✍️ Jun-You Liu
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
前言
前幾天在逛 Medium 的文章,意外看到這篇在討論如何利用 Ethereum Smart Contract Storage 實際行為跟預想的落差來攻擊。由於這個漏洞相較溢位等其他漏洞比較不會被注意到,決定記錄起來,如果大家未來在使用 Storage 時可以多注意一下。
Code
先來看看以下這個 contract:
這是一個幫助使用者 hodl Ether 的 smart contract。當使用者將 Ether 放進這個 contract 中,會被強制鎖定一段時間之後才能取出,在這段時間中使用者毋須擔心自己會受不了誘惑把錢拿去亂投資 ICO 導致血本無歸 (?)。
攻擊
問題出在 PayIn() 這個函式。當使用者想要存一些 Ether 進去,他會送出一筆存款的交易給這份 smart contract,但這筆存款交易其實不會記錄在使用者的 balance,而是會記錄到這份 smart contract owner 的 balance 中。
為什麼會這樣呢?
讓我們仔細看看 payIn() 在幹嘛,以下是他裡面在做的事:
HoldRecord newRecord;newRecord.amount += msg.value;newRecord.unlockTime = now + holdTime;balance[msg.sender] = newRecord;
問題出在第一行,在 EVM (Ethereum Virtual Machine) 中,當沒有指定 storage/memory 時,預設會使用 storage,所以 newRecord 會是 storage 的 pointer。而 newRecord 又沒有給定初始值,那麼 newRecord 就會指向 address(0),也就是這份 contract 最一開始的地方。詳細行為可以參照 Solidity 的文件。
那麼本來 newRecord 是希望指到 HoldRecord 的 struct,藉此存取
uint amount;uint unlockTime;
其實指到的是 contract 一開始的
uint ownerAmount;uint numberOfPayouts;
所以在 payIn() 的newRecord.amount += msg.value; 其實是加到 ownerAmount 中,也當然 numberOfPayouts 也被覆蓋掉了。然後 owner 就可以用 ownerWithdrawal() 來將剛剛使用者存入的錢偷走。
反攻擊
但這邊其實有個反攻擊的方法。在 payIn() 的第四行
balance[msg.sender] = newRecord;
如前面所說,newRecord 是指到 ownerAmount,所以這行其實是把 ownerAmount 指定給 msg.sender,使用者可以用一個很短的鎖定時間存一筆很小的 Ether,然後在到期後馬上使用 withdrawal() 將 owner 的所有錢提領出來。
結論
這個例子是要舉出在 smart contract 中 storage 預設行為的危險性。其實只要維持一個原則就可以避免這個問題。
養成明確定義使用 storage 還是 memory 的好習慣
一般來說,指定 storage 時就直接給初始值;而在 function 裡面需要用到的暫存器都用 memory,除非想要直接修改鏈上的值。現在 compiler 都會很聰明的提醒開發者要定義 storage 還是 memory,而當 storage pointer 沒有初始值時也會提醒開發者。
然而如果不是開發者只是使用者,其實在看 code 的時候很容易會忽略掉這部分的漏洞,所以在有更安全的選項出來前,就要多加注意了。
在此附上我的更改版,一批很純的Hodl (?)
如果覺得內容哪裡有誤,歡迎留言討論交流,然後別忘了分享給你所有很愛用預設參數的朋友 (?
智能合約 Storage 注意事項 was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
function pointer 在 Overclockzone Facebook 的最讚貼文
Asus VX278H จอมอนิเตอร์ดีไซน์หรู อัตราการตอบสนองไว สำหรับดูหนัง เล่นเกม และงานออกแบบ ในราคาที่ใครก็เอื้อมถึง // จอแสดงผลจากทางเอซุส ในรุ่น VX278H ที่มี ResponseTime เพียง 1ms ตอบสนองไวมาก ใช้เป็น Panel แบบ TN ขนาดหน้าจอ 27 นิ้ว ความละเอียดแบบ Full HD 1080p พร้อมด้วยเทคโนโลยี ASUS Flicker Free Technology ที่ช่วยลดคลื่นสั่นไหวของภาพ และเทคโนโลยียอดฮิตอย่าง ASUS Blue Light Filter ที่สามารถปรับลดแสงสีฟ้าที่เข้าไปทำลายสายตาเรามากกว่าแสงสีอื่นได้ถึง 5 ระดับ เทคโนโลยี ASUS-exclusive VividPixel Technology ที่เร่งสีสันให้ดูสดสมจริงกว่าจอทั่วไป พร้อมด้วยโหมดสำหรับเกมเมอร์ Exclusive GamePlus function ที่เพิ่มฟีเจอร์สำหรับการเล่นเกมเข้ามา เช่นมี Pointer สำหรับเกมแนว FPS และตัวนับเวลาถอยหลัง เรียกได้ว่าฟีเจอร์จัดเต็มมาก แต่ว่าแค่พูดใครก็พูดได้ครับ เอาเป็นว่าเราให้เจ้า Spyder ELITE5 เป็นผู้ช่วยในการทดสอบว่าการแสดงผลนั้นผ่านมาตรฐานที่ควรจะทำได้ขนาดไหน แต่ก่อนอื่นนั้นเราไปทำความรู้จักกับรูปร่างหน้ากันก่อนดีกว่าครับ เพราะว่าเจ้า Asus VX278H มาพร้อมกับนิยามที่ว่า "Meets Ultra-Slim Elegant Design" ซึ่งจะหรูหรา บางเฉียบ เนี๊ยบขนาดไหน // http://goo.gl/Qc5SUk
function pointer 在 prasertcbs Youtube 的最讚貼文
ดาวน์โหลดไฟล์ตัวอย่างได้ที่ https://goo.gl/76rwE8
เชิญสมัครเป็นสมาชิกของช่องนี้ได้ที่ ► https://www.youtube.com/subscription_center?add_user=prasertcbs
playlist สอนภาษา C เบื้องต้น ► https://www.youtube.com/watch?v=Z_u8Nh_Zlqc&list=PLoTScYm9O0GHHgz0S1tSyIl7vkG0y105z
playlist สอนภาษา C++ เบื้องต้น ► https://www.youtube.com/watch?v=_NHyJBIxc40&list=PLoTScYm9O0GEfZwqM2KyCBcPTVsc6cU_i
playlist สอนภาษา C# เบื้องต้น ► https://www.youtube.com/watch?v=hhl49jwOIZI&list=PLoTScYm9O0GE4trr-XPozJRwaY7V9hx8K
playlist สอนภาษาจาวา Java เบื้องต้น ► https://www.youtube.com/watch?v=O3rW9JvADfU&list=PLoTScYm9O0GF26yW0zVc2rzjkygafsILN
playlist สอนการทำ Unit Test ภาษาจาวา Java ► https://www.youtube.com/watch?v=R11yg8hKApU&list=PLoTScYm9O0GHiK3KNdH_PrNB0G3-kb1Bi
playlist สอนภาษาไพธอน Python เบื้องต้น ► https://www.youtube.com/watch?v=DI7eca5Kzdc&list=PLoTScYm9O0GH4YQs9t4tf2RIYolHt_YwW
playlist สอนภาษาไพธอน Python การเขียนโปรแกรมเชิงวัตถุ (OOP: Object-Oriented Programming) ► https://www.youtube.com/watch?v=4bVBSluxJNI&list=PLoTScYm9O0GF_wbU-7layLaSuHjzhIRc9
playlist สอนภาษา R เบื้องต้น ► https://www.youtube.com/watch?v=oy4qViQLXsI&list=PLoTScYm9O0GF6qjrRuZFSHdnBXD2KVICp
playlist สอนภาษา PHP เบื้องต้น ► https://www.youtube.com/watch?v=zlRDiXjYVo4&list=PLoTScYm9O0GH_6LARFxozL_viEsXV2wgO
function pointer 在 [問題] function pointer 的用處- 精華區C_and_CPP 的美食出口停車場
請教各位先進一下,
function pointer 最常用到的地方是在哪裡?
小弟雖然學過,但是卻從未使用過.. @@!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.241.220
> -------------------------------------------------------------------------- <
作者: UNARYvvv (有趣生活) 看板: C_and_CPP
標題: Re: [問題] function pointer 的用處
時間: Tue Nov 29 23:06:54 2005
※ 引述《openc ()》之銘言:
: 請教各位先進一下,
: function pointer 最常用到的地方是在哪裡?
: 小弟雖然學過,但是卻從未使用過.. @@!
舉個例子
某 BBS 站,決定使用者按鍵的動作
就是利用一個 array of function pointers
預先設定好各個字母所要執行的功能,也就是先指定個別的 function pointer
例如:
KeyFunc keys[MAX_KEYNUM] ; // KeyFunc 是一種 function pointer type
keys['A'] = &keyFuncA; // 可不寫 &
keys['B'] = &keyFuncB;
...
這樣子在執行時讀取到一個使用者的按鍵內容
經過檢查為合法按鍵值後,便可以直接進行相關的處理動作
( *(keys[按鍵值]) )( 引數內容 ); // 可不用寫 * 號
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.70.137.117
※ 編輯: UNARYvvv 來自: 61.70.137.117 (11/29 23:08)
> -------------------------------------------------------------------------- <
作者: qazq (...) 看板: C_and_CPP
標題: Re: [問題] function pointer 的用處
時間: Wed Nov 30 00:43:16 2005
※ 引述《openc ()》之銘言:
: 請教各位先進一下,
: function pointer 最常用到的地方是在哪裡?
: 小弟雖然學過,但是卻從未使用過.. @@!
目前我自己會用到的時機是在於,針對不同按鍵呼叫不同 function
(BBS 應該都是這樣的架構)
舉個例子來說....
struct commands
{
int (*fptr) ();
int key;
};
typedef struct commands commands;
int do_a(void), do_b(void), do_c(void);
int main()
{
int ch, key;
commands commandlist[] =
{
do_a, 'a',
do_b, 'b',
do_c, 'c',
NULL, '\0'
};
commands *commandPtr;
while (1)
{
ch = getch();
if (ch == 'q')
break;
commandPtr = commandlist;
for (; key = commandPtr->key, commandPtr++)
if (ch == key)
{
commandPtr->fptr();
break;
}
// 用上面這樣的好處是....如果當我的按鍵對應的 function 有很多的話
// 不用 function 指標,那我可能就要寫一個很大的 switch 然後一堆 case
}
return 0;
}
int do_a() // do_b() do_c() 類似....
{
printf("你按了 a 這個鍵\n");
return 0;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.140.43.139
> -------------------------------------------------------------------------- <
作者: jenallen (reborn) 看板: C_and_CPP
標題: Re: [問題] function pointer 的用處
時間: Wed Nov 30 10:50:45 2005
※ 引述《UNARYvvv (有趣生活)》之銘言:
: ※ 引述《openc ()》之銘言:
: : 請教各位先進一下,
: : function pointer 最常用到的地方是在哪裡?
: : 小弟雖然學過,但是卻從未使用過.. @@!
: 舉個例子
: 某 BBS 站,決定使用者按鍵的動作
: 就是利用一個 array of function pointers
: 預先設定好各個字母所要執行的功能,也就是先指定個別的 function pointer
: 例如:
: KeyFunc keys[MAX_KEYNUM] ; // KeyFunc 是一種 function pointer type
: keys['A'] = &keyFuncA; // 可不寫 &
: keys['B'] = &keyFuncB;
: ...
: 這樣子在執行時讀取到一個使用者的按鍵內容
: 經過檢查為合法按鍵值後,便可以直接進行相關的處理動作
: ( *(keys[按鍵值]) )( 引數內容 ); // 可不用寫 * 號
有人整理得很好https://www.newty.de/fpt/index.html :)
我個人最常的使用時機(同時符合才行):
1. 具有一樣輸入輸出但是動作不同的functions
2. 這些functions有共同的使用時機及規範
便會考慮用function pointer將這些不同的動作封裝起來。
這樣做的優點在於可以一個function pointer便將可能所需的各式動作用一致的
表示法來處理(啊,這不就是多型的概念嗎?:P)所以可用簡潔的方式動態地執
行所需的對應動作,以避免用switch case所帶來的大規模修改。
但是缺點也不少,至少我們必須確定function pointer所指的function是我們所
規範的那個function集合才行,不然不小心invoke一個只是符合輸入輸出但卻八
竿子打不著關係的function也是枉然...:)
例子嘛,在用C寫的程式中不少,除了U大的例子外,Unix中的virtual file system,
signal, callback function....很多
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.116.163.118
... <看更多>