2017年11月28日 星期二

XAMPP 最大執行時間 (max_execution_time) 問題

今天繼續處理 PHP 專案, 發現爬蟲程式固定在執行 120 秒後就 timeout, 屢試不爽, 看這樣子應該是新安裝的 XAMPP 工具包裡的 PHP max_execution_time 設得太短了 :

Fatal error: Maximum execution time of 120 seconds exceeded in E:\xampp\htdocs\stock\lib\mysqli.php on line 512

參考 :

Maximum execution time in phpMyadmin

按 XAMPP 的 Apache 的 Config 鈕, 選 PHP (php.ini) 檢查 php.ini 設定, 發現 max_execution_time 早已設置為 5000 秒 (在第 383 行左右) 了啊, 怎麼會固定 120 秒就逾時呢?




;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

; Maximum execution time of each script, in seconds
; http://php.net/max-execution-time
; Note: This directive is hardcoded to 0 for the CLI SAPI
max_execution_time = 5000 

瀏覽 http://localhost/dashboard/phpinfo.php 檢查 Loaded Configuration File 項目確實載入的設定檔為 E:\xampp\php\php.ini 沒錯, 照理講應該是 5000 秒才會逾時啊. 我把 XAMPP 關掉重開, 甚至電腦重開機都一樣無效, 傷腦筋.

最後在下面這篇看到 set_time_limit() 函數可用來指定一個 PHP 程式的最長執行時間 (與 php.ini 的 max_execution_time 作用一樣, 只是作用在單一程式) :


這讓我想起之前好像有測試過 ini_set() 這個變更 php.ini 設定的函數, 檢查程式開始處果然發現這個測試過後忘記拿掉的程式碼, 設定值剛好就是 120 秒, 難怪!

@ini_set("max_execution_time","120");

拿掉這行後再次執行爬蟲程式就沒有逾時問題了 (第一次跑花了 270 秒, 因為每一筆都要 create table 三次, 後續大都是 update 運算就不需要這麼久了, 大約 23 秒).

注意, set_time_limit(0) 是設定此程式不受逾時限制.

以上紀錄希望提醒自己以後別再犯這種烏龍錯誤了.


2017年11月27日 星期一

2017 年第 47 周記事

這次二哥段考英文不及格, 他自己又不想去補習, 週六菁菁的理化家教要回去時聊到英文, 他也是鳳中畢業的, 他說以前他英文都 90 幾, 沒有補習, 完全自修, 把課本的東西看熟就可以拿高分. 我想二哥花很多時間在數理化, 分給英文的時間不足, 而英文占比卻比理化高, 所以二哥應該要調整一下時間比例才行.

昨天下午拿出上周磨光的腳踏車輪框想繼續打磨, 發現上週磨光的部分全部都生鏽了, 根本就是做白工, 只好重新磨光, 花了一個多小時, 用掉兩片中砂紙才好不容易恢復亮晶晶 :




所以這種鐵製品一經打磨就必須立刻上漆, 否則空氣中的水氣很快會讓它銹回去. 磨光後找出買了至少半年的噴漆來上漆, 我原以為是白漆, 噴了後才發現是透明漆, 應該是當初要保存木材紋路才刻意買的. 裡裡外外噴一遍後靜置 10 分鐘, 然後噴第二遍, 總共噴了三層 :




噴完後又去勘查水車安裝地點, 圍牆外水圳上寬 68cm, 中寬 60cm, 中高 43cm, 水深 6cm, 中心距邊 33cm, 此處優點是水急有圍牆與較窄的圳寬容易安裝, 缺點是水深較淺, 且會受到檔水閘門影響水速 :




另外一處是門口涵洞出水處, 圳寬 120cm, 岸高 70cm, 水深 16cm 以上, 好處是水深水急, 缺點是最寬太寬不好安裝 :




週日中午小舅小舅媽來整理菜園, 小舅看了車庫一角的雜物堆, 說下禮拜要找時間來清理, 哇!  這個我不整理不行了, 忙完車輪上漆之後就趕緊先來整理, 這可是媽以前種菜時的留下的農用器具雜物堆, 這三年來我都沒保留原樣不動, 今年九月底本來就想整理了, 但實在太忙, 不如今日就動手吧, 免得一些值得保留的東西被小舅丟了, 這是整理前的樣子 :




塞在牆角的是姐姐小時候騎的小酷妹與二哥滿周歲時小舅子買給他的小腳踏車, 這兩台後來都給菁菁騎, 因為姐姐去上山葉音樂班抽獎抽到首獎-功學社腳踏車一台, 哥哥姊姊都改騎較大台的新車 :





真的好懷舊, 沒想到一眨眼十幾年就過去了, 那些日子都不會再回來了, 往日時空只存在腦海的記憶裡, 我想這種心情只有卡本特的 "Yesterday Once More" 才能充分表達 : 




此外還清出一個鞋櫃椅子, 好像是以前在家樂福買的, 刷洗晾乾後還很好用. 這個周末總算感覺做了蠻多事情. 有時候計畫了老半天還抵不過突然的臨時起義. 

2017年11月25日 星期六

從外網以 SSH 存取樹莓派的方法

這個問題在我心中盤旋很久了, 但卻一直沒時間研究. 樹莓派的低功耗使其成為家中不關機的伺服器首選. 我曾將樹莓派連續開機好幾個月都不會當機, 不需要接螢幕或鍵盤滑鼠, 只要插上電源開機, 它會自動連線到家中的無線基地台, 並固定取得 192.168.2.192 這個 IP, 然後利用筆電以 Putty 用 SSH 連線樹莓派的固定 IP 192.168.2.192 即可完全操控它, 稱為無頭存取方式, 參考 :

樹莓派的 "無頭存取" (headless access)
設定樹莓派 WiFi 無線網卡固定 IP 的方法
樹莓派 Raspberry Pi 文章列表

在區域網路存取沒問題, 但 192.168.xxx.xxx 只限於家裡的區網能用, 如果在公司想要連線回來該怎麼做? 這就需要 WiFi 無線基地台 (路由器) 上設置虛擬伺服器, 將外網 IP 對應到區網的 192.168.xxx.xxx 了.

我參考了下列文章在我的 EDIMAX 無線基地台的管理網頁中為樹莓派的 外網 SSH 存取設定虛擬伺服器 :

樹莓派通過郵件上報實時IP,隨時隨地遠程登錄樹莓派

EDIMAX 管理網頁位置是在 "位址轉換/Virtual server" 頁籤 :




先將左上角的 "Enable virtual server" 打勾, 然後輸入 Private IP, 我的樹莓派因為有在 /etc/network/interfaces 檔案中設定固定 IP=192.168.2.192, 因此 Private IP 就輸入 192.168.2.192. 然後 Private port 與 Public port 都輸入 SSH 的埠號 22, 並在 Comment 欄輸入備註, 再按 "Add" 鈕, 上述的設定就會出現在下面的 "Current virtual server table" 中了, 最後要按 "Apply" 才會真正生效.

接下來要測試看看是否真能從外網與區網內的樹莓派建立 SSH 連線. 首先必須知道家裡無線基地台的外網 IP, 有許多網站提供 IP 查詢服務, 例如 :

http://cmp.nkuht.edu.tw/info/ip.asp
http://dir.twseo.org/ip-check.php
http://www.ip138.com/

我筆電原先是透過家裡的無線基地台上網, 利用上列網站查出無線基地台外網 IP 後, 這時將筆電改透過手機行動網路分享的 WiFi 上網, 這樣就可以模擬從 Internet 外網進行存取了. 這時打開 Putty, 輸入樹莓派所連之無線基地台外網 IP, 果然順利連線到區網內的樹莓派了.

https://github.com/laixintao/Report-IP-hourly

如果要在命令列查詢外網 IP, 可輸入下列 curl 指令 :

pi@raspberrypi:~ $ curl http://members.3322.org/dyndns/getip >>/home/pi/ip.log    % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    14    0    14    0     0     46      0 --:--:-- --:--:-- --:--:--    46
pi@raspberrypi:~ $ cat ip.log
37.237.225.60

查詢內網則是用 ifconfig, 若只要擷取 IP 可用下列指令 :

pi@raspberrypi:~ $ ifconfig | grep 'Bcast' | cut -d B  -f 1 >> /home/pi/ip.log
pi@raspberrypi:~ $ cat ip.log
37.237.225.60
          inet addr:192.168.2.192

由於一般 ADSL 用戶都是浮動的公網 IP 並非固定, ISP 業者會一段時間會更換此 IP, 樹莓派必須在外網 IP 異動時自動以 E-mail 通知我們, 否則將無法以 SSH 從外網連線到樹莓派. 這篇文章的作者提供了 Python 程式碼來完成此項通報工作, 此程式已放在 GitHub 專案中 :

https://github.com/laixintao/Report-IP-hourly

主角是專案中的 Python 程式 reportip.py :

https://github.com/laixintao/Report-IP-hourly/blob/master/reportip.py

將此程式複製下來加以編輯, 主要是修改 e-mail config 部分 :

# the e-mail config
# this is just a simple format,this e-mail doesn't exist.
smtpserver = "smtp.sina.com"
username = "reaspberrypi@sina.com"
password = "123456"
sender = "reaspberrypi@sina.com"
receiver = ["receiver@sina.com","master@sina.com"]
subject = "[RPI]IP CHANGED"

改成如下 (注意, Hinet SMTP 主機是 msr) :

smtpserver = "msr.hinet.net"
username = "blabla@ms5.hinet.net"
password = "1234567890"
sender = "blabla@ms5.hinet.net"
receiver = ["jyp@yahoo.com","jyp@google.com"]
subject = "[RPI]IP CHANGED"

另外 Getmyip 類別之 getip() 方法裡面的查詢 IP 網址也要改成台灣的網址, 不要用原作中的大陸網站, 我查詢 Google 發現下面三個網站還不錯, 都可以正常運作 :
  1. http://myip.com.tw
  2. http://cmp.nkuht.edu.tw/info/ip.asp
  3. http://dir.twseo.org/ip-check.php
修改後的完整程式如下 :

#!/usr/bin/python
#-*-coding:utf-8*-

__author__ = 'laixintao'

import socket
import time
import struct
import smtplib
import urllib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
import re
import urllib2

# the e-mail config
# this is just a simple format,this e-mail doesn't exist.
smtpserver = "msr.hinet.net"
username = "blabla@ms5.hinet.net"
password = "1234567890"
sender = "blabla@ms5.hinet.net"
receiver = ["jyp@yahoo.com","jyp@google.com"]
subject = "[RPI]IP CHANGED"

# file_path config
file_path = "lastip.txt"

def sendEmail(msghtml):
    msgRoot = MIMEMultipart('related')
    msgRoot["To"] = ','.join(receiver)
    msgRoot["From"] = sender
    msgRoot['Subject'] =  subject
    msgText = MIMEText(msghtml,'html','utf-8')
    msgRoot.attach(msgText)
    smtp = smtplib.SMTP()
    smtp.connect(smtpserver)
    smtp.login(username, password)
    smtp.sendmail(sender, receiver, msgRoot.as_string())
    smtp.quit()


def check_network():
    while True:
        try:
            print "Network is Ready!"
            break
        except Exception , e:
           print e
           print "Network is not ready,Sleep 5s...."
           time.sleep(10)
    return True

def get_lan_ip():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(("1.1.1.1",80))
    ipaddr=s.getsockname()[0]
    s.close()
    return ipaddr

class Getmyip:
    def getip(self):
        try:
            myip = self.visit("http://myip.com.tw")
        except:
            try:
                myip = self.visit("http://cmp.nkuht.edu.tw/info/ip.asp")
            except:
                try:
                    myip = self.visit("http://dir.twseo.org/ip-check.php")
                    # if you want to add more,use the format "except try"
                    # make sure the most useful link be the first
                except:
                    print "Fail to get the Network ip."
                    print "Get the LAN ip."
                    myip = get_lan_ip()
        return myip
    def visit(self,url):
        opener = urllib2.urlopen(url,timeout=20)
        if url == opener.geturl():
            str = opener.read()
            print "IP information from",url
        return re.search('\d+\.\d+\.\d+\.\d+',str).group(0)

def get_network_ip():
    getmyip = Getmyip()
    localip = getmyip.getip()
    return localip


if __name__ == '__main__':
    check_network()
    ipaddr=get_network_ip()
    lanip=get_lan_ip()
    emailip=str(ipaddr)+" "+str(lanip)
    ip_file = open(file_path)
    last_ip = ip_file.read()
    ip_file.close()
    if last_ip == emailip:
        print "IP not change."
    else:
        print "IP changed. New ip: {}".format(emailip)
        ip_file = open(file_path,"w")
        ip_file.write(str(emailip))
        ip_file.close()

        sendEmail(ipaddr)
        print "Successfully send the e-mail."


注意, Hinet 的 SMTP 發信主機要用 msr.hinet.net, 我的郵件主機是 ms5.hinet.net, 我原先以為要用這個, 結果信傳不出去, 改成 msr 就可以了, 參考 :

http://blog.xuite.net/yatpingchen/blog/199891664-國外收發Hinet郵件SMTP設定

其次, 上面這個程式原作是用 Python 2 寫的, 所以修改好後我改用 reportip2.py 存檔在 /home/pi 下, 手動執行時要用 python2 指令 :

pi@raspberrypi:~ $ python2 reportip2.py
Network is Ready!
IP information from http://cmp.nkuht.edu.tw/info/ip.asp
IP changed. New ip: 223.139.131.189 192.168.43.26
Successfully send the e-mail.
You have new mail in /var/mail/pi
pi@raspberrypi:~ $ python2 reportip2.py
Network is Ready!
IP information from http://myip.com.tw
IP not change.
You have new mail in /var/mail/pi


手動執行沒問題後, 接下來是編輯 contab 讓 reportip2.py 能夠定時自動執行, 這樣不論我在天涯海角都能透過 E-mail 得知目前的 IP 是多少而連線回去. 另外一個好處是可以知道家裡 ADSL 網路是否正常, 如果沒定時收到 E-mail 就表示網路異常了.

$ crontab -e 

參考原作的 crontabs 設定 :

https://github.com/laixintao/Report-IP-hourly/blob/master/rootcron

0 */1 * * * /usr/bin/python2 /root/rootcrons/reportip2.py

將其改為每 10 分鐘檢查一次 :

*/10 * * * * /usr/bin/python2 /home/pi/reportip2.py

在 crontab 加入這一筆後存檔, 再用 chmod 指令將 reportip2.py 改為可執行 :

pi@raspberrypi:~ $ sudo chmod +x /home/pi/reportip2.py   


2017-12-03 補充 :

下午 16:00 要回高雄, 因姊姊要搭高鐵回台北, 所以下午抽點時間測試上面的程式, 原作使用的 IP 查詢網站 www.138ip.com 每次 cron 執行回報的 IP 都不同, 事實上即使是浮動 IP 也不可能每 10 分鐘就變動一次, 我猜可能是該網站位於中國境內的關係, 改用台灣的 http://myip.com.tw 等位址就正常了.

Cron 執行紀錄放在 /var/log/cron.log  裡面, 不過紀錄功能預設是關閉的, 必須修改 /etc/rsyslog.conf 檔之設定將其打開才會記錄, 參考 :


以管理員身分開啟 /etc/rsyslog.conf, 在 "RULES" 項下可找到預設被 mark 掉的 #cron 設定, 拿掉 # 後存檔 :

pi@raspberrypi:~ $ sudo nano /etc/rsyslog.conf


###############
#### RULES ####
###############

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                         /var/log/cron.log
daemon.*                        -/var/log/daemon.log
kern.*                          -/var/log/kern.log
lpr.*                           -/var/log/lpr.log
mail.*                          -/var/log/mail.log
user.*                          -/var/log/user.log

然後重啟系統記錄檔即可 : 

$ sudo /etc/init.d/rsyslog restart  

檢視 cron 執行紀錄 :

pi@raspberrypi:~ $ sudo cat /var/log/cron.log                                                   
Dec  3 23:25:01 raspberrypi CRON[20720]: (pi) CMD (/usr/bin/python2 /home/pi/reportip2.py)                                                      ortip2.py)
Dec  3 23:30:01 raspberrypi CRON[20785]: (pi) CMD (/usr/bin/python2 /home/pi/reportip2.py)                                                      ortip2.py)
Dec  3 23:35:01 raspberrypi CRON[20806]: (pi) CMD (/usr/bin/python2 /home/pi/reportip2.py)                                                      nclean ] && /usr/lib/php5/sessionclean)
Dec  3 23:40:01 raspberrypi CRON[20879]: (pi) CMD (/usr/bin/python2 /home/pi/reportip2.py)                                                      ortip2.py)
Dec  3 23:45:01 raspberrypi CRON[20947]: (pi) CMD (/usr/bin/python2 /home/pi/reportip2.py)


參考 :

Where do Cron error message go?

2017-12-09 補充 :

我把上面 Python 2 的程式改為 Python 3 版, 結果卻敗在 visit() 方法無法取得外網 IP, 原因可能出在 urllib 模組上 :

import socket
import time
import struct
import smtplib
from urllib.request import urlopen
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
import re

# the e-mail config
# this is just a simple format,this e-mail doesn't exist.
smtpserver = "msr.hinet.net"
username = "blabla@ms5.hinet.net"
password = "1234567890"
sender = "blabla@ms5.hinet.net"
receiver = ["jyp@yahoo.com","jyp@google.com"]
subject = "[RPI]IP CHANGED"

# file_path config
file_path = "lastip.txt"

def sendEmail(msghtml):
    msgRoot = MIMEMultipart('related')
    msgRoot["To"] = ','.join(receiver)
    msgRoot["From"] = sender
    msgRoot['Subject'] =  subject
    msgText = MIMEText(msghtml,'html','utf-8')
    msgRoot.attach(msgText)
    smtp = smtplib.SMTP()
    smtp.connect(smtpserver)
    smtp.login(username, password)
    smtp.sendmail(sender, receiver, msgRoot.as_string())
    smtp.quit()


def check_network():
    while True:
        try:
            print("Network is Ready!")
            break
        except Exception :
           print(e)
           print("Network is not ready,Sleep 5s....")
           time.sleep(10)
    return True

def get_lan_ip():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(("1.1.1.1",80))
    ipaddr=s.getsockname()[0]
    s.close()
    return ipaddr

class Getmyip:
    def getip(self):
        try:
            myip = self.visit("http://myip.com.tw")
        except:
            try:
                myip = self.visit("http://cmp.nkuht.edu.tw/info/ip.asp")
            except:
                try:
                    myip = self.visit("http://dir.twseo.org/ip-check.php")
                    # if you want to add more,use the format "except try"
                    # make sure the most useful link be the first
                except:
                    print("Fail to get the Network ip.")
                    print("Get the LAN ip.")
                    myip = get_lan_ip()
        return myip
    def visit(self,url):
        opener = urlopen(url,timeout=20)
        if url == opener.geturl():
            str = opener.read()
            print("IP information from",url)
        return re.search('\d+\.\d+\.\d+\.\d+',str).group(0)

def get_network_ip():
    getmyip = Getmyip()
    localip = getmyip.getip()
    return localip


if __name__ == '__main__':
    check_network()
    ipaddr=get_network_ip()
    lanip=get_lan_ip()
    emailip=str(ipaddr)+" "+str(lanip)
    ip_file = open(file_path)
    last_ip = ip_file.read()
    ip_file.close()
    if last_ip == emailip:
        print("IP not change.")
    else:
        print("IP changed. New ip: {}".format(emailip))
        ip_file = open(file_path,"w")
        ip_file.write(str(emailip))
        ip_file.close()

        sendEmail(ipaddr)
        print("Successfully send the e-mail.")

主要是把輸出改成函數式的 print(), 以及匯入 urllib.request.urlopen 而已, 執行結果如下 :

E:\test>python reportip3.py
Network is Ready!
IP information from http://myip.com.tw
IP information from http://cmp.nkuht.edu.tw/info/ip.asp
IP information from http://dir.twseo.org/ip-check.php
Fail to get the Network ip. 
Get the LAN ip.
IP changed. New ip: 192.168.43.72 192.168.43.72
Successfully send the e-mail.

收到的 E-mail 是內網 IP, 到底哪裡出錯? 有空再研究.

How to: Connecting to VNC Server (5.x and before) over the Internet


2017-12-11 補充 :

前天週六晚上將改好的 report2.py 傳到 Pi 執行 crontab, 只要公網 IP 有變動就會發出郵件通知, 證實上面的做法確實可行. 由於傳檔用的 WinSCP 也是使用 22 埠 (sFTP), 也是可以透過 Internet 傳送檔案 :





Bingo! 以後就可以隨時從遠端存取鄉下樹莓派裡的檔案了.

參考 :

如何让树莓派可以被外网访问?

2017年11月24日 星期五

購買小型三相交流發電機

昨天早上決定向露天賣家 cptc823  購買兩個小型三相交流發電機以及兩個鋼珠軸承, 約定中午在光華路與鄭和南路口的 7-11 面交 :

低壓大電流無刷直流馬達 直流發電機 附整流二極體 $390*2=780
608ZZ 軸承 $12*2=24

合計 804 元, 老闆說算 800 即可.

我打算用一個 6mm 的 20 或 30 齒皮帶輪充當聯軸器將兩個發電機連成一個機組 :

【UCI電子】2GT 同步帶輪 16齒 20齒 帶寬6mm 內孔5 內孔8 GT2 16Z傳動皮帶輪 $45
【UCI電子】2GT-6mm橡膠開口同步皮帶S2M GT2 MXL 同步帶 $60 (100cm)

皮帶與皮帶輪鄉下五金行可能有賣, 若週日回去找沒有的話再網購.

如何翻砂製模

最近在研究如何自製小型水力發電水車的皮帶輪時, 看到 Youtube 上的一部以翻砂製作鋁製皮帶輪方法的影片, 值得記錄下來參考 :

Metal Casting at Home Part 64. Casting and Machining a Toothed Pulley




這影片讓我想起以前在學校也學過一學期木工製模與翻砂的工廠實習課程, 雖然念的是電機, 但學校可能認為機電相關性高, 所以安排了上學期木工+翻砂, 下學期金工車床實習課, 我會對木工有興趣大概就是從那時候開始的.

2017年11月23日 星期四

小型三相交流發電機市調

上週看到屋旁的小圳水流湍急, 想弄個小型水力發電機實驗來收集這川流不息的能源. 水車部分可以用舊腳踏車的輪框, 或者自己木做一個也行. 發電機部分決定用三相交流發電機, 參考 :

http://zoro.ee.ncku.edu.tw/el2011/res/07-power_generator.pdf

我在露天找到下面這款低電壓大電流發電機 :

空調低壓內轉子直流無刷電機 直流無刷發電機 大電流發電馬達 W64 (2A) $500
低壓大電流無刷直流馬達 直流發電機 附整流二極體 $390

這看起來是完全一樣的東西, 但卻價差 110 元. 標價 390 這個隨貨附 6 個整流二極體可將三相交流整成直流電, 賣家在高雄可自取. 其商品說明中提到 :

"此馬達屬於低壓大電流發電機,輸出的電流輕鬆就能突破1000mA,轉速不需要很高就能發出幾十伏電壓,整流後給小電瓶(20AH以內)充電也是OK的"

而標價 $500 元賣家的說明中則說輸出 2A 電流沒問題 :

"此款無刷電機作發電機是很高效的,給電池電瓶充電非常合適,輸出電流2A左右是沒問題的。"

看來此款還蠻符合我的小型水力發電實驗要求的, 其實只要能輸出 1A 以上就能穩定對 18650 模組充電了, 如果將兩組這種發電機以聯軸器組合成一個機組的話, 這樣應該就能輸出 4A 以上的電力了.

另外我在 AliExpress 找到另外一款三相交流發電機 :

Aiyima Three-phase AC Permanent Magnet Wind Generator Hand Generator DIY Homemade used Generator US$24.64+2.11=US$26.75 (約 802 元台幣)

產品說明提到可輸出 3.76A 電流, 而且 380 RPM 就能輸出 90V 電壓, 實在太強了 :

"Measuring single-phase voltage 18.27V
With 12V 50W light measuring single-phase current of 3.76A, smallish, but high efficiency.
4 series plus shift together as long as there are 380rpm will have 90V"

但價格卻不便宜, 一顆要價 800 元左右.

下面這款標題寫直流 50W, 但是接線圖卻要使用附贈的整流器 KPB307, 奇怪, 既然是直流怎還要用整流器呢? 從其兩縣輸出判斷, 這應該是單向交流發電機才對. 說明中沒交代最高輸出電流, 詢問賣家得到 10~110V 的答案 (這是電壓好嗎) :

3424D110直流發電機 50W風力發電機 水力發電機 動力發電馬達 高效能電機 正反轉可調速可發電馬達 $500

橋式整流子 KPB307 在露天沒賣, 但可找到其他的代用品 :

KBU6J 橋式整流子 6安培 耐壓600V 橋式整流子 $10 (12 顆 100 元)
橋式整流子 KBPC806 (8A) $10

另外, 淘寶網有一顆 400W~800W 三相交流發電機似乎不錯 :

三相交流稀土永磁发电机高效发电机400W~800W实验用可定制

但價格也不便宜, 3200 元起跳.

其實, 若要用直流電機, 二手的汽車發電機其實也可以考慮, 提供高達 30A 以上的大電流, 價格在 1000 以上, 例如 :

MIUSUBIHI中華三菱 發電機45A(整理新) 94前威力1.1,95後威利1.1貨,百利800/3缸,多利800 $1200

其他 :

MY6812-120W 12V永磁直流尤奈特有刷馬達 電動滑板車電機 皮帶輪 $890
大扭力 高速直流電機 120V大功率馬達 發電機 電動機 風冷 主軸 W64 $ 1400
限量特價 手搖發電機 帶手搖柄 349 無電容版直出 可點亮20W LED燈 金屬齒輪 耐磨耐用 $349
DIY自制 三相交流永磁发电机12V 风力发电 手摇发电

2017年11月22日 星期三

皮帶輪 (Pulley) 的製作方法

最近在設計我的小型水力發電站, 主要結構是木製水車附帶皮帶輪, 以大輪帶小輪方式將轉速放大, 帶動三相交流發電機發電. 小輪有現成的金屬製帶齒的可用, 例如 :

【愛研】GT2 2GT 30齒 內徑8mm 同步輪 同步齒輪 皮帶輪 $49
【UCI電子】2GT 同步帶輪 16齒 20齒 帶寬6mm 內孔5 內孔8 GT2 16Z傳動皮帶輪 $45
【UCI電子】2GT-6mm橡膠開口同步皮帶S2M GT2 MXL 同步帶 $6 (10cm)
[3DPW] 同步輪GT2 20齒 內8mm 皮帶寬度9mm 時規皮帶用 $95
【3DPRT 專賣店】★876★ 2GT GT2 寬 9MM 周長 500 到 599 多種規格 閉口皮帶 環狀皮帶

但是要裝在水車上的大輪找遍露天商場都沒有合意的, 只能自己木做一個了. 今天在 Youtube 看到下面這部自製皮帶輪的影片非常值得參考 :

Making Wooden Step Pulleys




作者用線鋸機先裁出三塊圓形木板, 膠合後用木工車床修邊並切出皮帶溝, 最後軸心鑽洞再噴漆.

下面這部影片則是金工的, 作者利用回收的飲料鋁罐熔化後做成鋁餅, 再用車床車出皮帶溝 :

Homemade Pulley Made From Beer Cans - Melting Aluminum #3




總之, 有車床的話一切都好辦.

Opera 的新功能 : 網頁快照

昨天 Opera 瀏覽器升級為 49.0.2725.39 (PGO) 版, 新增了網頁快照功能, 直按 Ctrl+Shift+5 就可以框選網頁中要擷取的區域, 按 "捕捉" 鈕擷取圖像後自動開啟 Opera 的圖片編輯器, 可畫線, 加上箭頭, 小圖示, 或局部模糊化等等 :






按 "儲存圖片" 可將編輯後的影像存成 png 檔. 雖然編輯功能沒有 Picpick 強, 但也不失為一個方便好用的小工具.

2017年11月20日 星期一

J.Fla 翻唱的 Shape of You

上週三菁菁的同學芸菁與怡蓉來家裡討論學校作業, 一邊聽音樂一邊討論她們的劇本, 其中有一首蠻好聽的, 是 J.Fla 翻唱自英國歌手 Ed Sheeran 的 Shape of You  :

Ed Sheeran - Shape Of You ( cover by J.Fla )




J.Fla (金貞花) 是韓裔美國人, 是最近在網路以翻唱聞名, 人氣直線竄升的網紅, 參考 :

https://zh.wikipedia.org/wiki/J.Fla
3位不能錯過的新生代 Cover 網紅!

聽聽這首 Shape of You 原唱者 Ed Sheeran 的官方 MV :

Ed Sheeran - Shape of You [Official Video]




感覺不一樣齁! 不知道是不是先入為主的關係, 我怎麼覺得好像 J.Fla 唱得比較好聽呢. 不過, 這部 MV 劇情很有意思, 只是不解為何女主角要不告而別呢?

2017年11月19日 星期日

2017 年第 46 周記事 : 木瓜粄作法

週六下午小舅媽又 Line 我, 叫我晚上回去別煮, 載爸一起去她家吃牛肉麵, 哇, 連續兩個周末都給舅媽請, 只好叫爸將退冰的吳郭魚再冰回去. 剛好婷婷也放周末假, 把已到貨的安博盒子帶回鄉下了, 順便把貨款親自交給她.

吃過晚餐舅媽說要示範木瓜粄的做法, 材料如下 :

木瓜 : 2~3 顆
麵粉 : 適量 (約 100 g)
太白粉 : 適量 (約 3~5 匙)
油蔥酥 : 2~3 匙
胡椒 : 2~3 匙
鹽 : 一匙 (不加亦可)

醬汁
蒜頭 : 2~3 片
醬油 : 適量 (約 3~4 匙)

先將木瓜刨絲, 放 2~3 匙油蔥酥熱鍋 (中火), 倒入木瓜絲, 加入 2~3 匙胡椒粉, 加一碗水拌炒至熟後, 倒入盆中加入麵粉, 太白粉攪拌成糊狀 (不要太水). 平底鍋加油熱鍋, 舀 2~3 球木瓜麵糊至平底鍋中壓平煎至兩面呈金黃色即可.


油蔥酥與木瓜絲放入鍋中

加水拌炒

炒熟後倒入盆中加入麵粉太白粉攪成糊狀

放入鍋中壓平煎至兩邊呈金黃色

煎好後, 將蒜頭切小丁, 加入醬油與少許醋做成醬汁淋在木瓜粄上, 那甜中帶鹹酸的滋味, 沒吃過是無法體會的.

今日下午料理做完之後開始進行水車製作先前準備, 早上去買菜時路經五金行買了 3 張砂紙 (一張 10 元) 回來, 下午拿出上周拆下來的廢棄腳踏車輪框磨去鏽蝕, 由於銹得很深, 磨到手都痠了還是不夠亮, 只好下周繼續 :




這兩天屋旁的小水圳水量大增, 湍急的河水聲表示能量不斷地釋出, 如果能架個小水車發電多好, 這可是 24 小時不斷地發電喔! 不像太陽能只有白天才能發電. 下午勘查了一下, 我覺得蓮霧樹旁的圍牆外的水流最湍急, 最適合架小水車, 發電機與變壓器則可鎖在圍牆上, 水車透過皮帶或鍊條帶動發電機轉動 :




我量了今天的水位大約 10 公分深, 足夠帶動水輪機, 其實只要有 4 公分以上就行了.

安裝 XAMPP PHP 架站工具包

由於在載入從 Hostinger 備份下來的 .sql 檔後發現我筆電 AppServ 裡的 phpMyAdmin 無法正常運作, 原本想重裝 AppServ, 但想到如果原因是 AppServ 裡面的 phpMyAdmin 版本太舊的話, 重裝應該也無法解決問題, 既然要重新架設本機伺服器, 何不試試看很受歡迎的 XAMPP 工具包?

我找到下面這篇文章, 依照其描述下載了 XAMPP 免安裝版, 解壓後放在 E 碟 (我筆電資料碟分割是 E 不是 D), 據作者說這樣就可避免因為安裝版預設安裝在 C 帶來的 UAC 權限困擾. 也對, 這樣就不用每次做測試都要複製檔案到 C:\Appsserv\www 下了.

XAMPP 網頁伺服器架站工具設定與使用教學

XAMPP 官網如下 :

https://www.apachefriends.org/zh_tw/index.html

按首頁最上方 Appache Friends 後面的 "下載" 連結, 會看到 Windows 目前都只有 32 位元版本 :




但這些都是安裝版, 下載免安裝的 zip 檔要按下方的 "更多檔案" 進入 SourceForge 檔案下載網站 :

https://sourceforge.net/projects/xampp/files/

點選 XAMPP Windows 連結 :



點選最新的 7.1.11 版連結 :




會發現有三個免安裝檔案 (portable), 由上而下分別是 .exe, .7z, 與 .zip 壓縮檔, 都可以用, 我下載的是第一個 .exe 壓縮包, 它會導引整個解壓縮過程 :




執行下載的 xampp-portable-win32-7.1.11-0-VC14-installer.exe 壓縮包會先看到如下提示訊息, 因為偵測到我的電腦有啟用 UAC, 為了避免權限問題不要將 XAMPP 解壓縮到 C 碟下面 :




 所以接下來指定解壓縮路徑時要改為非 C 碟 (此處為 E:\XAMPP), 注意, 路徑名稱要全部是英數字, 千萬不要有中文字 :




選擇全部元件 :




這樣就完成解壓過成了, 接下來要先點選 XAMPP 路徑下的 setup_xampp.bat 檔執行路徑設定, 它會打開一個 DOS 畫面, 執行完直接關掉即可 :




如果將此 XAMPP 放到隨身碟或複製到其他電腦, 第一件事情便是執行這個 setup_xampp.bat 更新路徑才能使用 XAMPP.

接下來就可以點選 xampp-control.exe 進入 XAMPP 控制面板, 首先會出現語言選擇, 只有英語與德語, 預設英語即可 :




按 Save 即顯示 XAMPP 的控制台, 但預設似乎隱藏了右邊一排按鈕, 這時要按住視窗右下角向右拉即顯示全景如下 :




按右上角的 Config 按鈕可設定 XAMPP 的文字編輯器, 預設的記事本不好用, 我將其改為習慣的 EditPlus, 也可以設定為 Notepad++ :




在啟動 Apache 與 MySQL 伺服器之前還要將資料庫認證模式從預設較不安全的 "Config" 模式改成較安全的 Cookie 模式或最安全的 http 模式, 按 Appache 第三個按鈕 "Config", 點選 "phpMyAdmin(config.inc.php)" :




這時會用上面設定的預設編輯器開啟 config.inc.php 檔, 將 $cfg['Servers'][$i]['auth_type'] 改為 cookie 或 http 存檔即可. 以上即完成所有設定, 可以按 Appache 與 MySQL 的第一個按鈕 "Start" 開啟伺服器了. 這時會跳出 Windows 安全性警訊, 都必須按 "允許存取" 才會啟動這兩個伺服器 :






看到 Apache 與 MySQL 的第一個按鈕都變成 Stop 即表示兩個伺服器都起來了, 可見 Apache 打開了 80 (HTTP 用) 與 443 埠 (HTTPS 用); 而 MySQL 預設打開 3306 埠, 參考 :

常用 TCP Port作用(各種Port介紹)

這時在瀏覽器輸入 localhost 或 127.0.0.1 應該會顯示 XAMPP 的 dashboard 網頁 :




按右上角的 PHPInfo 顯示 PHP 資訊; 按 phpMyAdmin 鈕則進入 MySQL 資料庫管理網頁 (現已改名為相容之 MariaDB), 輸入管理帳號 root, 預設無密碼直接按執行鈕即可 :




若要設定密碼, 登入後按上方的 "使用者帳號" 鈕, 點選欲設定密碼之帳號右邊的 "編輯權限" :




然後按上面的 "修改密碼" 鈕 :




輸入密碼按執行即可 (我慣用的密碼 mysql 竟然是即弱) :




這樣登出後再登入就必須輸入密碼了, 若要取消密碼就選最上方的 "無密碼", 一般在本機測試其實不需要設密碼. 接下來就可以把自己的 PHP 專案目錄放在 xampp 的 hdoc 目錄下, 例如我的是 E:\xampp\htdocs, 在瀏覽器中輸入 http://localhost/myproject 即可測試專案網頁矣.

What's the difference between utf8_general_ci and utf8_unicode_ci

2018-04-29 補充 :

今天將鄉下 Win10 電腦裡面的 AppServ 移除改安裝 xampp, 照上面修改 MySQL 密碼後出現 "無法連線: 設定錯誤" 訊息 :



查 Google 找到下列網頁 :

xampp設定mysql密碼後phpmyadmin無法登入的解決方法

我照其說明去改 config.inc.php 檔  "Authentication type and info" 內的 password 為 "mysql" (原為空白) :

/* Authentication type and info */
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = 'mysql';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['AllowNoPassword'] = true;
$cfg['Lang'] = '';

存檔後再次開啟 PHPMyAdmin 就不會出現錯誤訊息了. 早知就直接改檔案就好了.

2017年11月18日 星期六

phpMyAdmin 載入資料庫逾時問題

今天繼續進行 PHP 主機改版, 在對 MySQL 資料庫進行大改版之前, 先備份 Hstinger 上的資料庫, 我想把它重建於本機 AppServ 下備查. 10MB 左右的 ZIP 檔解壓後大約是 76MB 的 .sql 檔, 剛好還在 phpMyAdmin 可載入的 81MB 範圍內. 開啟 localhost 下的 phpMyAdmin 點選載入, 選擇解開的 .sql 檔後按執行 :




結果執行一段時間 (約 5 分鐘) 卻出現下列錯誤訊息 :


Fatal error: Maximum execution time of 300 seconds exceeded in C:\AppServ\www\phpMyAdmin\libraries\import\sql.php on line 83


我找到 sql.php 的第 83 行, 是 while 迴圈中的一個呼叫 strpos() 的敘述 :

$p5 = strpos($buffer, '--', $i);

我以為是 php.ini 的設定太小所致, 所以就去 C:\AppServ\php5 下找 php.ini 檔, 但是卻找不到 php.ini, 而是找到 php.ini-dist 和 php.ini-recommended 這兩個檔, 到底 AppServ 的 php.ini 是哪一個呢? 後來在下面這篇看到, 原來在 Windows 下真正載入的 php.ini 位於 C:\Windows 下面 :

請問appserv v2.5.10 的php.ini在哪呢?

這可以在 http://localhost/phpinfo.php 訊息中搜尋 "Loaded Configuration File" 得知 :




開啟 C:\Windows\php.ini 檔後搜尋 max_execution_time (大約在 254 行左右) 可以找到 PHP 的程式最大執行時間限制, 預設是 30 秒 :

;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

max_execution_time = 30     ; Maximum execution time of each script, in seconds
max_input_time = 60 ; Maximum amount of time each script may spend parsing request data
memory_limit = 24M   




我把它改成 1000 秒後重啟伺服器再執行 .sql 載入還是一樣 300 秒就逾時了. 咦? 原先預設是 30 秒, 錯誤訊息怎會報 300 秒, 而被我改成 1000 秒後不是應該報 1000 秒嗎? 可見這跟 max_execution_time 無關. 後來在下面這篇發現, 原來 phpMyAdmin 自己有一個計時器, 其預設值就是 300 秒 :

Maximum execution time in phpMyadmin

這個設定檔是 C:\AppServ\www\phpMyAdmin\config.inc.php, 開啟此檔搜搜尋 $cfg['ExecTimeLimit']  (大約在第 129 行左右), 即可看到其預設值正是 300 秒 :




/**
 * Other core phpMyAdmin settings
 */
$cfg['OBGzip']                  = 'FALSE'; 
$cfg['PersistentConnections']   = FALSE;  
$cfg['ForceSLL']                = FALSE;  
$cfg['ExecTimeLimit']           = 300;    // maximum execution time in seconds (0 for no limit)
$cfg['SkipLockedTables']        = FALSE;  


我把它改成 6000 秒 (100 分鐘) 後存檔, 重新執行 .sql 載入即順利完成了. 




這樣就能放心地進行大改版了.

2017-11-19 補充 :

雖然調整計時器後順利載入備份的 .sql 檔, 但是開啟 phpMyAdmin 時卻出現 "#2003-伺服器並無回應" 頁面 :




但專案網頁又可正常顯示, 表示 MySQL 伺服器其實有在跑, 只有 phpMyAdmin 異常而已. 參考了下列幾篇文章試圖恢復 phpMyAdin 運作仍然無效 :

【MySQL問題解決方案】#2003-伺服器並無回應
[appserv] #2003 -伺服器並無回應
安装mysql服务出现Install/Remove of the Service Denied!错误

看來只好重裝 AppServ 工具包了.

2017-11-19 補充 :

我今天改用 XAMPP 工具包, 因為想試試看不一樣的介面, 而且 XAMPP 有一直在更新. 不過 XAMPP 的 phpMyAdmin 預設上傳 .sql 檔限制只有 2MB, 更改上傳設定須編輯 xampp\php 下的 php.ini 檔, 參考 :

How to Increase Import Size Limit in phpMyAdmin using Xampp server?
http://localhost/phpmyadmin/doc/html/faq.html#faq1-16

我照其設定 :

post_max_size = 800M
upload_max_filesize = 800M
max_execution_time = 5000
max_input_time = 5000
memory_limit = 1000

結果有成功匯入, 但可能我資料表太多, 而上面 max_execution_time 設 5000秒可能還是不夠, 結果只匯入了 245 個資料表 (到 w1907). 後來我在 phpMyAdmin 的 FAQ 裡看到下面這段話 :

If you have shell (command line) access, use MySQL to import the files directly. You can do this by issuing the “source” command from within MySQL:

source filename.sql

原來 MySQL 還可以利用命令列操作資料庫, 以前都沒用過, 其語法參考 :

mysql命令行的基本用法(通用linux和windows)
https://dev.mysql.com/doc/refman/5.7/en/mysql-commands.html

由於我下載的是免安裝版的 XAMPP,  其 MySQL 可執行檔路徑在 xampp\mysql\bin 下, 因此匯入 .sql 資料檔的指令如下 :

E:\xampp\mysql\bin>mysql -uroot -pmysql twstock < e:\hostinger\project\twstock.sql

這裡第一參數 -uroot 表示 user 為 root; -pmysql 表示 password 為 mysql; 第三參數 twstock 為要匯入之資料庫名稱 (我預先建立的一個空資料庫). 指令執行了大約十幾分鐘就結束了, 進入 phpMyAdmin 檢查確定全部資料表都有完整匯入. 一道指令就可完成的事, 費了這麼多功夫繞遠路竟然還徒勞無功! 或許之前的 AppServ 中的 MySQL 用命令列就能搞定了. 不過我覺得還是改用 XAMPP 好, 因為 AppServ 實在太舊了.

2017-11-23 補充 :

今天嘗試在家裡 PC 的 AppServ 上用 MySQL 命令列指令匯入從 Hostinger 下載的備份資料庫 :

mysql -uroot -pmysql twstock < d:\hostinger\twstock.sql

結果在 7 分鐘內就順利載入完成了, 用瀏覽器存取網頁可以看到應該是全部的資料, 但是進入 phpMyAdmin 開啟所匯入的資料庫就是一片白色網頁, 似乎無法載入這麼多的資料表. 可見 AppServ 真的太老舊了, 我這台 PC 也要移除, 改用免安裝的 XAMPP.

2017年11月17日 星期五

證交所信用額度總量管制餘額表

最近這一個月每周六載二哥去學校上 APCS 課, 我就去附近家樂福看書, 連續看了三本理財書後, 想起因為證交所網站改版而停擺超過半年的爬蟲專案, 所租的 Hostinger 主機變成閒置資產實在浪費, 因此這周突然有了動手改版的動力, 接下來的一段時間要集中全力在網站改版上.

今天要盤點的對象是信用額度總量管制餘額表, 其舊網址格式如下  :

# http://www.twse.com.tw/ch/trading/exchange/TWT93U/TWT93U.php?input_date=104/05/20

現在連過去會看到如下說明 :

您好:

本公司全球資訊網已於106年5月23日改版,您目前瀏覽使用的網址並不正確,建議您自首頁(http://www.twse.com.tw/)重新瀏覽,並更新瀏覽器「我的最愛」或「書籤」設定。

如須進一步協助請參閱本公司官網改版問答集(http://www.twse.com.tw/downloads/zh/home/TWSE_QA.pdf),或洽投資人服務中心專線:(02)2792-8188
錯誤代碼為:8348613256455828716
事件代碼為:62855325295449445

TWSE revised the official website on 23rd May, 2017. The URL address you were trying to reach seem to be incorrect or outdated. Please update your browser bookmark(s), thank you.

TWSE official website: http://www.twse.com.tw/
Page Error Code:8348613256455828716
Event ID:62855325295449445

新版網址已改為 :

http://www.twse.com.tw/zh/page/trading/exchange/TWT93U.html

但這是分頁式網頁, 需選取下拉式選單中的 "全部" 才會能取得全部上市股票與 ETF 的信用交易資料. 如果要取得全頁式網頁則要按左上角的 "HTML" 超連結 :




其網址格式為 :

http://www.twse.com.tw/exchangeReport/TWT93U?response=html&date=20171110

可見雖然網頁標題使用民國紀元 但 URL 卻用西元紀元. 這日期若傳入非交易日的話會得到一個只有表頭的空表格 (有日期); 若傳入未來日期則顯示 "查詢日期大於今日,請重新查詢!".

信用交易資料放在一個唯一的 tbody 表格中, 而且表格相當乾淨, 沒有任何 inline 的屬性, 所以相當容易剖析, 只要用下列指令去除多於 1 個的空格 :

$data=preg_replace("/([\s]{2,})/","",$data);

然後逐列逐行拆解即可 :

            <tbody>         
                <tr>                 
                        <td>0050</td>                 
                        <td>元大台灣50</td>                 
                        <td>216,000</td>                 
                        <td>1,000</td>                 
                        <td>0</td>                 
                        <td>0</td>                 
                        <td>217,000</td>                 
                        <td>119,000,000</td>                 
                        <td>2,716,000</td>                 
                        <td>0</td>                 
                        <td>160,000</td>                 
                        <td>0</td>                 
                        <td>2,556,000</td>                 
                        <td>940,467</td>                 
                        <td></td>                 
                </tr>

此網頁對應的爬蟲程式為 fetch_twse_daily_debit.php, 除了擷取的網頁網址要改外, 還有網頁表格的起迄信標也要改為如下 :

  $start="<tbody>";  //起始字串
  $end="</tbody>";   //結束字串

除此之外的程式碼都不用修改.

這張表格中需要擷取的欄位有四個 :

融券賣出 : bearish_sale=$brr[3]
融券餘額 : bearish_balance=$brr[6]
借券賣出 : short_sale=$brr[9]
借券餘額 : short_balance=$brr[12]

都寫入個股的 zxxxx 日報表欄位中. 由於證交所每天 20:30 與 22:30 各更新一次, 因此只要在這兩個時間之後去 query 即可.

"股價持續上漲但借券賣出也同時增加時要注意高點可能已近, 但借券賣出餘額減少卻可能是多頭訊號. 借券餘額增加表示有潛在賣壓, 但借券不一定會賣出, 若借券賣出也增加就要小心了."

參考 :

# http://www.cmoney.tw/notes/note-detail.aspx?nid=15403

2017年11月15日 星期三

2017 年第 45 周記事 : 拆腳踏車輪製作水車

又週三了, 最近都在忙 PHP 專案改版, 都沒空記周記. 我應該從周一就開始記, 不然過了一周常想不起來要些甚麼.

週六下午接到小舅媽電話, 要我晚上別煮, 載爸一起去她們家吃晚飯, 因為婷婷表妹有回去, 我到時才發現原來阿娟母子也有來, 真熱鬧. 婷婷帶回一台安博盒子要放在鄉下, 這台功能讓我大為驚訝, 竟然連俄羅斯, 印度等國的電視節目都收得到, 當下阿娟就說也要一台, 我查了一下露天, 婷婷的封閉群組拿到的價格便宜多多, 所以也跟進了, 巧的是, 團購剛好就剩下兩台. 

這周日花了一些時間勘查安裝水車的地方, 發現門口的涵洞出水口水量較大, 比較適合安裝水車 :




而水車的本體則是取材自廢棄的雙人腳踏車前輪, 這台腳踏車是剛結婚時, 有天問媽說腳踏車店不曉得有沒有中古的雙人腳踏車, 想說假日回鄉下時可以跟水某騎兜風. 結果還真的有, 但買來騎沒幾次就丟在庫房了, 因為實在不好騎. 經過十幾年輪胎都壞掉了, 索性將輪子拆來做水車 :




因為後輪有鍊條與剎車皮等較難拆, 所以先拆前輪來用, 把壞掉的外胎去除後用尺量半徑是 30 公分, 軸心直徑 0.9 公分 :




這周要買砂紙回去磨光後噴漆防鏽.

另外, 20W 太陽能板我打算安裝在屋後的浴室屋頂的外延露臺上, 其寬度為 38 公分, 剛好稍長於 30 度角的底邊長度, 安裝在此就不需要立柱做腳架了 :




左上角的水管是頂樓屋頂集雨溝的導流管, 我發現這可以收集起來灌溉用 :




集水桶則可以放在底下的三角地帶 :




下周要找時間採購角鐵開始安裝了.